The engine
What happens to your file
Every .xlsx, .docx and .pptx is a ZIP of XML parts. They break at six different levels, and the fix at each is different. Here is what we check, what we change, and what we deliberately leave alone — on the website and through the API alike.

Three steps, one file
- 01Drop the fileA .xlsx, .docx or .pptx up to 50 MB — or borrow one of our broken samples.
- 02Read the planEvery change we'd make, and why, before any of it happens.
- 03DownloadThe repaired file. If nothing needed fixing, the same bytes you sent.
Six levels, from the archive up
The ZIP archive every Office file is made of: downloads cut off, checksums that lie.
- archive directory: cut off, no end record+ archive directory: rebuilt from each part's own headerA part that no longer parses: unclosed tags, a bare &, the wrong encoding.
- <si><t>R&D budget</t></si>+ <si><t>R&D budget</t></si>The map of parts and how they link: missing content types, links to nothing.
- <Relationship Id="rId3" Target="theme/theme1.xml"/>+ (removed — theme1.xml is not in the file)A part holding something other than what it claims to be.
- styles.xml, linked as styles, contains <a:theme>+ styles.xml, linked as the theme it isWell-formed XML that breaks the ECMA-376 standard.
- <a:prstGeom prst="oval">+ <a:prstGeom prst="ellipse">Passes the standard, still wrong in Excel — like a number stored as text.
- <c r="C2" t="s"><v>1</v></c> → the text "48100"+ <c r="C2"><v>48100</v></c> → the number 48100Worth knowing, not ours to change
- Columns too narrow for their valuesExcel shows ##### instead of a date or number. We name the column to widen; widths are the author's layout.
- Functions older Excel doesn't haveLET, XLOOKUP, FILTER and friends show #NAME? before Microsoft 365. The file is fine; the reader's Excel isn't.
- Stored totals we can't prove wrongA stale total is only replaced when two formula engines agree on the right one. Otherwise we tell you and leave it.
- Text that might be a numberConverted only when a formula proves it was meant as one. Otherwise it could be an ID or a phone number.
- Names and filters pointing nowhereReported with the name and where it points, so you can decide whether it matters.
| C | |
|---|---|
| 1 | Amount |
| 2 | 48100 |
| 3 | 45,000 |
| 4 | 55,950 |
| 5 | =SUM(C2:C4)100,950 |
The exception that proves the rule: here the formula settles it. The SUM's stored total, 149,050, only adds up if C2 counts — so C2 gets converted, not just reported. Try this file.