Bug report — native PowerPoint bar chart corrupted (category/value count mismatch + lost embedded workbook link) after round-trip through Document Server
Drafted 25.08.2026. Not yet filed — for review before submission to https://github.com/Euro-Office/DocumentServer/issues
To file: open a new issue at https://github.com/Euro-Office/DocumentServer/issues (requires a free GitHub account; "Sign up" top right if you don't have one). Paste this report as the issue body.
Summary
A PowerPoint (.pptx) presentation containing a native bar chart (created in Microsoft PowerPoint, chart backed by an embedded Excel workbook) becomes permanently corrupted after being opened/edited and saved through Document Server. The corruption is written into the file itself — it persists when the file is reopened in PowerPoint afterward, i.e. this is not a rendering-only issue.
We first observed this on a confidential internal document, which we cannot share. The reproduction below uses a from-scratch, non-confidential file built purely to reproduce the same structural bug (arbitrary categories "Category A/B/C", arbitrary values 10/20/30) — the numbers and labels carry no information about the original document.
Two distinct defects were visible in the resulting ppt/charts/chart1.xml / ppt/charts/_rels/chart1.xml.rels of the original (confidential) file. Exact values below are illustrative placeholders reproducing the structure of what we saw — the original file's actual labels/numbers are withheld:
-
The chart's c:externalData relationship (the link to the embedded Excel workbook used for "Edit Data in Excel") is rewritten to a relationship whose Target is the literal string "NULL":
<Relationship Id="rId1" Type=".../oleObject" Target="NULL" TargetMode="External"/>
The embedded workbook part itself (normally ppt/embeddings/Microsoft_Excel_Worksheet*.xlsx) is absent from the package entirely.
-
The chart's category array and value array have mismatched point counts, and one category value is implausible for its axis (in our case, a category axis of years contained one entry that was clearly not a year):
<c:cat><c:numLit><c:formatCode>General</c:formatCode><c:ptCount val="3"/>
<c:pt idx="0"><c:v>PLACEHOLDER_1</c:v></c:pt>
<c:pt idx="1"><c:v>PLACEHOLDER_2</c:v></c:pt>
<c:pt idx="2"><c:v>PLACEHOLDER_IMPLAUSIBLE</c:v></c:pt>
</c:numLit></c:cat>
<c:val><c:numLit><c:formatCode>General</c:formatCode><c:ptCount val="4"/>
<c:pt idx="0"><c:v>PLACEHOLDER_V1</c:v></c:pt>
<c:pt idx="1"><c:v>PLACEHOLDER_V2</c:v></c:pt>
<c:pt idx="2"><c:v>PLACEHOLDER_V3</c:v></c:pt>
<c:pt idx="3"><c:v>0</c:v></c:pt>
</c:numLit></c:val>
3 category points (the third is not a plausible value for that axis) vs. 4 value points for a single-series clustered bar chart — an extra, unmatched value point with no corresponding category. Both c:cat and c:val use c:numLit (static literal arrays) rather than c:numRef (a reference into the now-missing embedded workbook), which is consistent with the chart having been re-serialized from cached values rather than round-tripped from its original data source.
A minimal file reproducing this same shape (3 categories, 1 series, invented data) can be built as described under "Steps to reproduce" below.
Environment
|
|
| Image |
ghcr.io/euro-office/documentserver:latest |
| Image digest |
sha256:6068075cc247f9283d337b2cf9a105d9df49fcd8cd6b5e82fa90640df1552e80 |
| Pulled |
2026-08-16 |
Installed package version (dpkg -l) |
euro-office-documentserver 9.3.1-dev.1 |
| Deployment |
Docker container, docker run, JWT enabled, WOPI enabled, integrated as a WOPI editor behind ownCloud Infinite Scale (oCIS) |
| Client |
Microsoft PowerPoint (desktop) created the original file; document was subsequently opened/edited through the WOPI integration |
Steps to reproduce
- In Microsoft PowerPoint (or via
python-pptx), create a single slide with a native clustered bar chart (c:barChart, c:grouping val="clustered"), one series, three categories (e.g. "Category A/B/C"), three values (e.g. 10/20/30). This produces a chart backed by c:numRef pointing at a real embedded Excel worksheet (ppt/embeddings/...xlsx), with matching c:cat/c:val point counts (3/3) — the normal, valid starting state. This mirrors the structure of the original confidential file that first exhibited the bug (also a single-series clustered bar chart with an embedded-workbook-backed native chart).
- Open the file for editing through Document Server via a WOPI integration (we use ownCloud Infinite Scale/oCIS), make any edit (or none), save.
- Download the resulting file and open it in PowerPoint again, or inspect
ppt/charts/chart1.xml directly.
We verified a file built as in step 1 has the clean/valid structure described (real numRef, matching point counts, real embedded workbook present). We were not able to fully automate step 2 against the raw conversion API in our environment to confirm the corrupted "after" state on this specific minimal file; the round-trip needs to be done via the normal editor/WOPI flow (or Document Server's UI) to reproduce — we observed the corruption described below via that normal flow on our original (confidential) file.
Expected behavior
The chart's category/value arrays retain a consistent point count matching the number of bars, and the embedded workbook link (or an equivalent valid c:numRef) is preserved so the chart remains editable and displays the original data.
Actual behavior
- The embedded workbook relationship is replaced with a relationship pointing at the literal string
Target="NULL", and the embedded workbook part is gone from the package.
- The category array (3 points, one of which is a bogus non-year value) and the value array (4 points) no longer agree in length.
- The chart is visibly broken/inconsistent in PowerPoint afterward, and this is not fixed by reopening/re-saving in PowerPoint — the corruption is in the file itself, produced by Document Server.
Impact
This is silent data corruption of user content, not a cosmetic bug: a bar chart that was correct before the round-trip is permanently damaged afterward, with no warning to the user at save time. Users co-editing or even just opening-and-saving PowerPoint files containing native charts through Document Server risk losing their chart data.
Additional notes
- The original file that surfaced this bug is confidential and cannot be shared, and its actual labels/numbers have been replaced with placeholders throughout this report — the XML excerpts above show structure only (element names, attribute names, point counts, the literal
Target="NULL"), not real content.
- We are not currently able to test against a different Document Server build to bisect the issue:
ghcr.io/euro-office/documentserver:latest is, per the project README, described as being provided "for testing and integration purposes," resolves to a rolling build off main (installed package version 9.3.1-dev.1, which does not correspond to any of the tagged v9.3.1/v9.3.2 source releases), and pulling :latest today returns the identical digest we already had cached from 2026-08-16 — so no newer or differently-versioned image is currently available to test against via Docker.
Bug report — native PowerPoint bar chart corrupted (category/value count mismatch + lost embedded workbook link) after round-trip through Document Server
Drafted 25.08.2026. Not yet filed — for review before submission to https://github.com/Euro-Office/DocumentServer/issues
To file: open a new issue at https://github.com/Euro-Office/DocumentServer/issues (requires a free GitHub account; "Sign up" top right if you don't have one). Paste this report as the issue body.
Summary
A PowerPoint (.pptx) presentation containing a native bar chart (created in Microsoft PowerPoint, chart backed by an embedded Excel workbook) becomes permanently corrupted after being opened/edited and saved through Document Server. The corruption is written into the file itself — it persists when the file is reopened in PowerPoint afterward, i.e. this is not a rendering-only issue.
We first observed this on a confidential internal document, which we cannot share. The reproduction below uses a from-scratch, non-confidential file built purely to reproduce the same structural bug (arbitrary categories "Category A/B/C", arbitrary values 10/20/30) — the numbers and labels carry no information about the original document.
Two distinct defects were visible in the resulting
ppt/charts/chart1.xml/ppt/charts/_rels/chart1.xml.relsof the original (confidential) file. Exact values below are illustrative placeholders reproducing the structure of what we saw — the original file's actual labels/numbers are withheld:The chart's
c:externalDatarelationship (the link to the embedded Excel workbook used for "Edit Data in Excel") is rewritten to a relationship whoseTargetis the literal string"NULL":The embedded workbook part itself (normally
ppt/embeddings/Microsoft_Excel_Worksheet*.xlsx) is absent from the package entirely.The chart's category array and value array have mismatched point counts, and one category value is implausible for its axis (in our case, a category axis of years contained one entry that was clearly not a year):
3 category points (the third is not a plausible value for that axis) vs. 4 value points for a single-series clustered bar chart — an extra, unmatched value point with no corresponding category. Both
c:catandc:valusec:numLit(static literal arrays) rather thanc:numRef(a reference into the now-missing embedded workbook), which is consistent with the chart having been re-serialized from cached values rather than round-tripped from its original data source.A minimal file reproducing this same shape (3 categories, 1 series, invented data) can be built as described under "Steps to reproduce" below.
Environment
ghcr.io/euro-office/documentserver:latestsha256:6068075cc247f9283d337b2cf9a105d9df49fcd8cd6b5e82fa90640df1552e80dpkg -l)euro-office-documentserver 9.3.1-dev.1docker run, JWT enabled, WOPI enabled, integrated as a WOPI editor behind ownCloud Infinite Scale (oCIS)Steps to reproduce
python-pptx), create a single slide with a native clustered bar chart (c:barChart,c:grouping val="clustered"), one series, three categories (e.g. "Category A/B/C"), three values (e.g. 10/20/30). This produces a chart backed byc:numRefpointing at a real embedded Excel worksheet (ppt/embeddings/...xlsx), with matchingc:cat/c:valpoint counts (3/3) — the normal, valid starting state. This mirrors the structure of the original confidential file that first exhibited the bug (also a single-series clustered bar chart with an embedded-workbook-backed native chart).ppt/charts/chart1.xmldirectly.We verified a file built as in step 1 has the clean/valid structure described (real
numRef, matching point counts, real embedded workbook present). We were not able to fully automate step 2 against the raw conversion API in our environment to confirm the corrupted "after" state on this specific minimal file; the round-trip needs to be done via the normal editor/WOPI flow (or Document Server's UI) to reproduce — we observed the corruption described below via that normal flow on our original (confidential) file.Expected behavior
The chart's category/value arrays retain a consistent point count matching the number of bars, and the embedded workbook link (or an equivalent valid
c:numRef) is preserved so the chart remains editable and displays the original data.Actual behavior
Target="NULL", and the embedded workbook part is gone from the package.Impact
This is silent data corruption of user content, not a cosmetic bug: a bar chart that was correct before the round-trip is permanently damaged afterward, with no warning to the user at save time. Users co-editing or even just opening-and-saving PowerPoint files containing native charts through Document Server risk losing their chart data.
Additional notes
Target="NULL"), not real content.ghcr.io/euro-office/documentserver:latestis, per the project README, described as being provided "for testing and integration purposes," resolves to a rolling build offmain(installed package version9.3.1-dev.1, which does not correspond to any of the taggedv9.3.1/v9.3.2source releases), and pulling:latesttoday returns the identical digest we already had cached from 2026-08-16 — so no newer or differently-versioned image is currently available to test against via Docker.