Skip to content

Bug report — native PowerPoint bar chart corrupted (category/value count mismatch + lost embedded workbook link) after round-trip through Document Server #338

Description

@ham-galeo

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:

  1. 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.

  2. 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

  1. 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).
  2. Open the file for editing through Document Server via a WOPI integration (we use ownCloud Infinite Scale/oCIS), make any edit (or none), save.
  3. 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    Status
    📄 To do

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions