Docs

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.

A furious white cat clutching its head beside a laptop showing Excel's “We found a problem with some content” dialog
Clicking "Yes" deletes whatever Excel can't read. We'd rather fix it.
Getting started

Three steps, one file

  1. 01Drop the fileA .xlsx, .docx or .pptx up to 50 MB — or borrow one of our broken samples.
  2. 02Read the planEvery change we'd make, and why, before any of it happens.
  3. 03DownloadThe repaired file. If nothing needed fixing, the same bytes you sent.
What it repairs

Six levels, from the archive up

Each level runs only if the one below wasn't enough, and a repaired file is only handed back once Microsoft's Open XML SDK accepts it. Every example is a real case from our test corpus, shown as the change we make.
Container01

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 header
XML02

A part that no longer parses: unclosed tags, a bare &, the wrong encoding.

- <si><t>R&D budget</t></si>+ <si><t>R&amp;D budget</t></si>
Package03

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)
Identity04

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 is
Schema05

Well-formed XML that breaks the ECMA-376 standard.

- <a:prstGeom prst="oval">+ <a:prstGeom prst="ellipse">
Semantics06

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
What it only reports

Worth knowing, not ours to change

These appear as notes in the plan and are never applied. A file with only notes comes back byte for byte.
  • 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.
wrong-total.xlsx
C
1Amount
248100
345,000
455,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.

Reading a verdict

Failing the standard isn't the same as broken

The standard and Office disagree in both directions, so each finding gets one of three verdicts. On 5,342 real workbooks Excel opens, none were called broken — see the benchmark.
BlocksOffice refuses the file or shows its repair prompt. This is what gets fixed.
ToleratedThe standard objects, Office opens it anyway — every workbook openpyxl writes. Left alone.
UnconfirmedBreaks the standard, and nobody has checked it against Office yet. We say so rather than guess.
Files it won't touch

Not broken, just not ours

Password-protectedEncrypted, not damaged. Open it with the password.
Old formats, renamedA .xls saved as .xlsx isn't corrupt; it needs converting. Open and re-save it in Office.
Empty archivesThere is no document inside to recover.
Over 50 MBOr over 250 MB unpacked: limits that keep a hostile file from exhausting the service.
Where your file goes

Into memory, and back to you

In memory onlyNever written to disk. Macros never run, links never followed.
Gone after the responseWhen the repaired file reaches you, both copies are gone.
Nothing keptNothing about your file or its contents is stored or logged.
API · coming next

The same checks, in your pipeline

For places where an LLM or a script writes Office files and nobody opens them before a customer does. Send the file; get back the verdict and the plan, or the repaired file.
terminal
$ curl -F file=@report.xlsx \
    https://api.ihatecorruptfiles.xyz/v1/check

{
  "verdict": "blocks",
  "repairable": true,
  "actions": ["escape-ampersand", "convert-text-to-number"]
}
A kitten sitting at a tiny computer, typing

Preview — the shape may change