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

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 48100| 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.
$ curl -F file=@report.xlsx \ https://api.ihatecorruptfiles.xyz/v1/check { "verdict": "blocks", "repairable": true, "actions": ["escape-ampersand", "convert-text-to-number"] }

Preview — the shape may change