Recursive AI

Defect catalogue

All onedocument docs

A defect's Code is a stable, lower-case, dot-separated identifier: <layer>.<problem>. The first segment names the layer that found it. A code is never reused for another meaning. Each layer adds its codes here when it adds the check; the tests of that layer assert them.

Layer prefixLayerKind (DefectKind)
limit.resource limitsLimit
encryption.encrypted inputEncryption
unsupported.features not handledUnsupported
format.format identificationStructure
packaging.zip, compound file, OPC, ODF packagesPackaging
xml.the XML tokenizer and markup treeMarkup
biff., doc., ppt., xlsb.binary record layersRecord
ole.OLE property sets and object storagesRecord, Value, Structure, Encoding, Packaging, Limit
vba.VBA projects (reading, extraction, removal)Record, Reference, Packaging
sanitize.inspection and sanitising (docs/sanitize.md)Structure
sheet.the workbook modelReference, Value
formula.formula text and tokensFormula
numfmt.number-format codesValue
text.text extractionStructure, Reference, Markup, Packaging
rtf.RTF (tokenizer, group tree, hub conversion, mail layer)Record, Limit, Structure, Reference
markdown.Markdown (parser, hub conversion)Limit, Encoding, Structure
docx.the word-processing hubStructure, Reference, Value, Packaging
csv.delimited text (CSV, TSV)Structure, Markup, Encoding, Value
xlsx.the SpreadsheetML workbook hub and cell storeStructure, Reference, Value, Formula, Packaging
pptx.the PresentationML hubStructure, Reference, Packaging
html.HTML import and exportUnsupported, Structure
wml2003., sml2003.the Office 2003 XML readers (Word, Excel)Structure, Reference, Value, Encoding, Formula
odf., odp.the OpenDocument text and presentation conversions (odf.md, odp.md); the package layer reports under packaging.Structure, Reference, Value, Encoding, Limit
odf.the OpenDocument text conversion (odf.md); the package layer reports under packaging.Structure, Reference, Value, Encoding, Limit
ods., openformula.the OpenDocument spreadsheet conversion and OpenFormula text (ods.md)Structure, Reference, Value, Formula, Unsupported, Limit
calc.workbook calculationFormula, Limit, Reference
binding.reading and writing rows of plain objects (Spreadsheet.Read<T>, Write<T>)Structure, Reference, Value
template.the template engine: reading, checking and rendering templatesMarkup, Structure, Formula, Reference, Value
render.writing laid-out pages as PDF or imagesStructure
merge.merge, append, split, sheet copy and slide insert (MergeReport.Problems)Structure

Codes in use

CodeSeverityMeaning
limit.<property>fatalThe named OfficeLimits property (in kebab case, for example limit.max-xml-depth) was exceeded. OfficeLimitException.LimitName has the property name.
encryption.password-requiredfatalThe input is encrypted and no password was given.
encryption.password-incorrectfatalThe password does not open the input.
encryption.malformed-headerfatalAn encryption header or descriptor (EncryptionInfo, FILEPASS, CryptSession10Container) is cut short or inconsistent.
encryption.malformed-datafatalThe encrypted data is shorter than its declared size, ends inside a cipher block, or cannot be decrypted.
encryption.integrity-mismatchrepairedThe agile data integrity HMAC does not match; the decrypted data is returned anyway.
encryption.inner-formatfatalThe decrypted package is not a format the readers open.
unsupported.featurefatalThe input uses something this library does not handle; OfficeUnsupportedException.Feature names it.
unsupported.format-not-availablefatalNo reader or writer is registered for the format (its package is not referenced or does not implement it).
format.unrecognisedfatalThe content is not a format OneDocument knows.
render.failedfatalThe renderer could not write a document as PDF, or draw a page as an image (a writer error, or a page size past DocumentRenderer.MaxPngPixels); the inner exception has the cause. Layout problems are not defects: they are LayoutNotes with layout. codes (see layout.md).
render.metafile-damageddroppedA picture that should be a metafile is neither an EMF nor a WMF (no EMF signature or WMF header), or its header or a limit stopped interpretation; the picture is not drawn as vector content. A record that asks for something the display list refuses (a coordinate or size out of range) stops the picture there: what was drawn before it stays and the list is left balanced.
render.metafile-diagnosticdroppedThe metafile interpreter skipped or could not honour a record (the message names its index), or a font was unavailable, or a stroke or the fallback bitmap failed.
render.metafile-rasterisedrepairedThe picture uses something the display list cannot express (XOR and other raster operations, triangle gradients, hatch or pattern pens, union or exclusive-or clips) and is drawn as a bitmap.
render.metafile-approximatedrepairedA union or exclusive-or clip was drawn as a replacement (only with the raster fallback turned off).
render.metafile-fontrepairedA font named in a picture is not available and another was used (once per family).
doc.malformedfatalThe Word binary reader met a structure it could not repair and stopped on an arithmetic or indexing failure; the reader normally reports its repairs under the codes below, so this code means a case worth a bug report with the file.
doc.fib-truncatedfatalThe WordDocument stream is too short for the file information block (FibBase, or the counted FibRgW97/FibRgLw97 sections).
doc.bad-identfatalThe stream does not start with a Word binary identifier (0xA5EC, or 0xA5DC for Word 6/95).
doc.no-word-streamfatalThe compound file has no WordDocument stream.
doc.no-table-streamfatalThe FIB names 0Table or 1Table as the table stream and the file does not have it.
doc.no-piece-tablefatalThe Clx is missing, empty or holds no piece table.
doc.clx-badfatalThe Clx holds an entry that is neither a property list (1) nor the piece table (2).
doc.clx-truncatedrepairedThe Clx (or a Prc/the piece table in it) is longer than the table stream; what fits was used.
doc.fib-pairs-truncatedrepairedThe FIB declares more offset pairs than fit in the stream; the pairs that fit were read.
doc.piece-cp-orderrepaired or droppedA piece starts at a negative position, ends before it starts, or the first piece does not start at 0.
doc.piece-out-of-rangerepairedA piece reads past the end of the WordDocument stream; its character positions are kept and the missing characters read as spaces.
doc.story-out-of-rangerepairedA story length (ccpFtn, ccpHdd and so on) reaches past the text the piece table holds; it was clipped.
doc.codepage-unsupportedrepaired8-bit text of a Word 6/95 file is in a character set other than ANSI; it was read as Windows-1252.
doc.fkp-out-of-rangedroppedA bin table entry points at a formatted disk page outside the WordDocument stream.
doc.fkp-baddroppedA formatted disk page holds a run count that cannot fit, or a paragraph property record that runs past the page.
doc.plc-truncatedrepairedA Plc runs past the end of the table stream; what fits was used.
doc.stylesheet-baddroppedThe stylesheet header is cut short, or a style runs past the stylesheet; styles from that point were dropped.
doc.lists-baddroppedThe list definitions end early; the remaining levels were dropped.
doc.sepx-baddroppedA section's property block runs past the WordDocument stream; the section has default properties.
doc.huge-papx-baddroppedsprmPHugePapx points outside the Data stream; the paragraph keeps the properties it has.
doc.picture-unreadabledroppedA picture character has no readable picture in the Data stream.
doc.ole-storage-missingdroppedAn EMBED or LINK field names an object storage (_<number>, [MS-DOC] sprmCPicLocation with sprmCFOle2) that the ObjectPool does not have; the object keeps its preview picture and is counted in loss.doc-ole-objects. Kind Reference; the location is the storage path.
doc.ole-link-unreadabledroppedA linked object's \u0001Ole stream names no file moniker the reader understands; the object keeps its preview picture. Kind Reference.
doc.ole-object-in-markupdroppedAn object field sits inside tracked changes, a bookmark or a comment range, where replacing it with an object element would unbalance the markup; the object keeps its preview picture. Kind Reference.
doc.sprm-not-mappeddroppedA property modifier has no counterpart in the document model (once per modifier, with the offset of its first occurrence); the count is the loss.doc-sprms entry of the conversion. Kind Unsupported.
packaging.damagedfatalThe container is damaged (zip or compound-file structure) beyond what recovery repairs, or a stream cannot be read; the location holds the part or stream and the offset when known.
packaging.refusedfatalThe container reader refused the input for safety (unsafe path, overlapping entries).
packaging.not-a-packagefatalThe input is neither a zip nor a Flat OPC document.
packaging.zip-damagedrepairedThe zip directory or an entry header was damaged and recovery mode (scanning local headers) was used; the location holds the entry and offset.
packaging.missing-content-typesfatalThe package has no [Content_Types].xml (ECMA-376 Part 2 §7.3.7).
packaging.bad-content-typesfatal or repaired[Content_Types].xml is not well formed. Fatal when nothing could be read from it; otherwise the entries before the damage are used.
packaging.dtd-refusedfatal or droppedA packaging XML part (content types, relationships, Flat OPC) declares a DTD, which is always refused (§6.2.5).
packaging.bad-content-type-entrydroppedA Default or Override lacks its Extension, PartName or ContentType, or the part name is not valid.
packaging.duplicate-content-typedroppedAn extension or part name has more than one Default or Override (§7.2.3.2); the first wins.
packaging.missing-content-typerepairedA part has neither an override nor a default for its extension; it is kept with an empty content type.
packaging.duplicate-part-namedroppedThe same part name is stored twice (a zip item or a Flat OPC part); the first is used and the other is kept as stored, not exposed.
packaging.part-name-case-collisiondroppedTwo part names differ only in ASCII case (§6.2.2.3); the first is used.
packaging.invalid-part-namedroppedA zip item is not a valid part name (a backslash, a .. segment, an empty segment). It is kept as stored, not exposed. An item with an empty name or a NUL in its name is left out entirely.
packaging.interleaved-partdroppedA zip item is a piece of an interleaved part (§7.2.4). Pieces are kept as stored and not reassembled.
packaging.bad-relationshipdroppedA Relationship lacks Id, Type or Target.
packaging.duplicate-relationship-iddroppedA relationship id repeats an earlier one in the same part (§6.5.3.4); the first wins.
packaging.bad-relationship-target-moderepairedTargetMode is neither Internal nor External; Internal is used.
packaging.bad-relationship-targetrepairedAn internal target is not a valid part name once resolved (for example it climbs above the root); kept as written.
packaging.dangling-relationshiprepairedAn internal target names a part that is not in the package; kept as written.
packaging.bad-relationships-partdroppedA Relationships part is not well formed; the relationships before the damage are kept.
packaging.bad-flat-opcfatalThe XML document is not Flat OPC (no pkg:package root) or is not well formed.
packaging.bad-flat-partdroppedA pkg:part has no valid name, no content-type attribute, or undecodable base64; it is dropped.
packaging.duplicate-stream-namedroppedTwo compound-file streams, or a stream and a storage, have names equal ignoring case ([MS-CFB] 2.6.4); the first is exposed.
packaging.cfb-header-inconsistentrepairedA compound-file header field disagrees with the file; a value derived from the file was used.
packaging.cfb-truncatedrepairedThe compound file ends inside a table, the directory or the mini stream.
packaging.cfb-allocation-table-unusablerepairedThe FAT or DIFAT is damaged; sectors it described are treated as free.
packaging.cfb-mini-stream-unusablerepairedThe mini FAT or mini stream is damaged; mini streams that need the lost part are shortened.
packaging.cfb-directory-unusablerepairedThe directory chain is cut or misplaced; directory sectors were found by scanning.
packaging.cfb-bad-entryrepairedA directory entry has invalid fields; replaced by usable values or ignored.
packaging.cfb-bad-linkrepairedA sibling or child link is invalid, loops or shares a subtree.
packaging.cfb-orphaned-entryrepairedAn entry cannot be reached from the root and was attached to it.
packaging.cfb-damaged-streamrepairedA stream's sector chain is short, loops or leaves the file; the stream was shortened (CfbStreamPart.IsDamaged).
xml.unexpected-endfatalThe part ends inside a tag, comment, CDATA section or processing instruction, or with elements still open. The offset is the end of the input.
xml.dtd-refusedfatalThe part has a document type declaration or an entity declaration. DTDs are never read; there is no switch. The offset is the <!.
xml.invalid-characterfatalA character XML 1.0 does not allow: a control character other than tab, line feed and carriage return, < in an attribute value, ]]> in text.
xml.invalid-encodingfatalThe bytes are not valid UTF-8 (or UTF-16, for a UTF-16 part). The offset is the first bad byte (for UTF-16, in the original bytes).
xml.unsupported-encodingfatalThe part is UTF-32 or another encoding XML parts do not use. UTF-8 and UTF-16 are read.
xml.invalid-namefatalAn element, attribute or processing-instruction name is not a valid XML name (or has more than one colon, an empty prefix or local part), or a processing-instruction target is xml in another case.
xml.syntaxfatalAny other break of the XML grammar: a missing = or quote, no white space between attributes, -- inside a comment, markup that is not a tag, comment or CDATA section.
xml.mismatched-end-tagfatalAn end tag does not match the open element, or there is none open.
xml.duplicate-attributefatalAn element has the same attribute twice, by written name or by namespace and local name.
xml.unbound-prefixfatalAn element or attribute uses a prefix that no namespace declaration binds.
xml.invalid-namespace-declarationfatalA namespace declaration binds xmlns, binds xml to something else, binds the xml or xmlns namespace to another prefix, or gives a prefix an empty name.
xml.invalid-referencefatalA character or entity reference is unterminated, names an entity other than amp, lt, gt, quot and apos, or is not an XML character.
xml.misplaced-contentfatalText or a CDATA section outside the root element, or a second root element.
xml.no-rootfatalThe part has no root element.
xml.invalid-declarationfatalThe XML declaration is malformed (version, encoding, standalone) or is not the first thing in the part.
numfmt.too-many-sectionsfatalA number-format code has more than four sections. The position is the start of the fifth.
numfmt.unterminated-stringfatalA " is never closed.
numfmt.unterminated-bracketfatalA [ is never closed.
numfmt.unknown-bracketfatalA bracketed item is not a colour, condition, locale tag, elapsed-time code or DBNum.
numfmt.invalid-conditionfatalA [...] condition has an unknown operator or no number.
numfmt.condition-on-text-sectionfatalThe fourth (text) section has a condition.
numfmt.dangling-escapefatal\, _ or * ends the section with nothing to apply to.
numfmt.unexpected-characterfatalAn unquoted ASCII letter that is not a format code.
numfmt.multiple-decimal-pointsfatalA section has two decimal points.
numfmt.multiple-exponentsfatalA section has two E+/E- codes.
numfmt.exponent-without-digitsfatalE+ or E- is not followed by 0 or #.
numfmt.mixed-codesfatalDate or time codes together with digit placeholders, an exponent or General; or a fraction with a decimal point; or General with digit placeholders.
numfmt.invalid-date-codefatalMore m, d, h or s in a row than the code allows.
numfmt.fraction-denominatorfatalA fixed denominator above 99999, or more than five denominator placeholders.
text.no-main-partfatalThe package names no main document part, or the part it names is not in the package.
text.part-missingdroppedA relationship of the main part (a header, footer, notes, comments, sheet or slide) names a part the package does not have; its text is left out.
text.part-unreadabledroppedA part other than the main one is damaged (malformed XML or a damaged archive entry); the text before the damage was kept and the rest of that part is left out. The location is the part and offset.
text.shared-string-out-of-rangedroppedA worksheet cell names a shared string the table does not have; the cell is left out. The location is the part and the cell's offset.
docx.revision-id-invalidrepairedA tracked change has no w:id, or one that is not a non-negative integer. The revision is listed with id -1 and works as any other.
docx.revision-author-missingrepairedA tracked change has no w:author. It is listed with an empty author.
docx.revision-date-invalidrepairedA tracked change has a w:date that is not a date. It is listed without a date.
docx.revision-unresolvabledroppedA tracked change could not be accepted or rejected because the markup around it is not what the schema allows (a row marker outside a row, content that cannot be moved without an unbound prefix). The change is left in place; the location is the change element.
docx.revision-id-conflictfatalRaised as RevisionIdConflictException (not reported while reading): an id the caller gave to a RevisionAuthor is negative or already used by a revision, bookmark, comment range or move range in the document. No location.
pptx.no-main-partfatalNo officeDocument relationship of the package points at a part that exists.
pptx.wrong-rootfatal / droppedThe presentation part does not start with p:presentation (fatal). A slide, layout, master or notes part that does not start with its own root element reads as empty (dropped); the location is the part.
pptx.part-missingfatalA part the reader must have is not in the package.
pptx.part-unreadabledroppedA part could not be parsed (damaged zip entry or markup); it is treated as absent. The location is the part and the offset of the failure.
pptx.slide-part-missingdroppedA slide listed in p:sldIdLst has no relationship or no part; it is skipped.
pptx.slide-listed-twicedroppedThe same slide part is listed twice in p:sldIdLst; the second entry is skipped.
pptx.slide-id-duplicaterepairedTwo slides carry the same id in p:sldIdLst; both are kept.
pptx.layout-not-foundfatalPresentation.AddSlide(string) was given a layout name no master has. Raised as PresentationAuthoringException; the message lists the names there are, and no slide is added.
pptx.placeholder-not-foundfatalSlide.SetPlaceholderText found no text placeholder of the type or index. Raised as PresentationAuthoringException; the message lists the placeholders the slide has.
pptx.layout-missingrepaired / droppedA slide has no layout (repaired: its placeholders inherit nothing), or a layout listed by the master has no part (dropped).
pptx.master-missingrepaired / droppedA layout has no master (repaired), or a master listed in p:sldMasterIdLst has no part (dropped).
pptx.template-scope-unsupporteddroppedA scope= the presentation binder cannot use (sheet, row, column, section), or table-row/table with tags that are not in a table. The scope the structure implies is used instead.
pptx.template-image-positiondroppedAn {% image %} tag that is not the only content of a text shape on a slide (inside other text, in a table cell, in notes, in a picture or group). The tag prints nothing.
pptx.template-image-invaliddroppedAn {% image %} value that is not PNG, JPEG, GIF or BMP data, as bytes or base64 text. The shape is left empty.
pptx.template-orphan-unitdroppedText came out outside the slide, shape or table row it belongs to, because a block's scope does not match where its tags stand (for example scope=inline with tags on different slides). The text is left out.
pptx.template-injection-unsupporteddroppedAn {% html %} or {% markdown %} tag in a presentation; its value is inserted as plain text.
docx.no-main-partfatalNo officeDocument relationship of the package points at a part that exists.
docx.wrong-rootfatalThe main document part does not start with w:document.
docx.part-missingfatalA part the reader must have is not in the package.
docx.no-bodyrepairedThe document has no w:body; it reads as an empty body and the tree is left as it was.
docx.part-unreadabledroppedAn optional part (styles, numbering, theme, …) is not well-formed or is damaged; the document reads as if it were absent. The location holds the part and offset.
docx.style-duplicate-idrepairedTwo styles have the same w:styleId; the first is used.
docx.style-not-foundfatalA style was asked for by name (Paragraph.Style, Run.Style, Table.Style, the StyleSheet indexer) and the document has no style of that name and type. Raised as StyleNotFoundException; nothing is created and nothing changes.
docx.style-base-missingrepairedA style is based on a style that does not exist; its chain ends there.
docx.style-cyclerepairedw:basedOn links form a cycle; the chain is cut where it closes.
docx.style-unknownrepairedA paragraph, run or table names a style that is not defined; the default style of that type applies (none for runs without a default character style).
docx.num-missingrepairedA paragraph refers to a w:numId that has no w:num; it is not numbered.
docx.num-abstract-missingrepairedA w:num names an abstract definition that does not exist; its paragraphs are not numbered.
docx.num-level-missingrepairedThe paragraph's level is not defined by the list; the paragraph is not numbered.
docx.num-link-brokenrepairedA w:numStyleLink does not lead to a list definition (missing style, no list, or nested too deeply); the definition's own levels are used.
docx.field-unbalancedrepairedA field begin has no end (the field is read to the end of the part and is not complete), or a field separator or end has no open field (it is ignored), or a w:fldChar has no valid type. The location is the offset of the element.
docx.field-too-deeprepairedFields nest deeper than MaxRecursionDepth; the inner ones are read as plain content. Reported once per scan.
docx.note-missingrepairedA footnote or endnote reference names an id the notes part does not have. The reference stays in the list with no note.
docx.note-duplicate-idrepairedTwo notes of one kind have the same id; references use the first.
docx.comment-duplicate-idrepairedTwo comments have the same id; the first is used.
docx.comment-missingrepairedA comment range marker or reference in the body names a comment the comments part does not have.
docx.comment-range-unmatchedrepairedA comment has a w:commentRangeStart without its w:commentRangeEnd, or the reverse. The anchor reports what exists.
docx.table-merge-orphanrepairedA w:vMerge (or legacy w:hMerge) continuation has no restart. A vertical one with a cell above merges into it, as Word does; with nothing to continue (first row) or a horizontal one with nothing to its left it is read as a plain cell.
docx.table-merge-span-mismatchrepairedA vertically merged continuation spans a different number of grid columns than the cell above; the region keeps the upper cell's width.
docx.table-grid-mismatchrepairedA row covers more grid columns than w:tblGrid declares; the logical grid is widened to the widest row.
docx.table-span-invalidrepairedA w:gridSpan is below 1 or above 16384; it reads as 1.
docx.section-page-size-invalidrepairedw:pgSz lacks a positive width or height; Letter portrait is used.
docx.section-columns-mismatchrepairedw:cols names a count that differs from the number of w:col entries of an unequal layout; the entries win.
docx.header-missingrepairedA header or footer reference names a relationship that does not lead to a readable part; the reference is ignored.
docx.header-reference-duplicaterepairedA section has two header (or footer) references of one type; the first is used.
props.part-unreadabledroppedA properties part (docProps/core.xml, app.xml or custom.xml) is not well-formed XML; it reads as empty. Writing a property into it raises this code instead of overwriting the part.
xlsb.record-truncateddroppedA binary record declares more data than the part has left; the part ends there. Located by part and record offset.
xlsb.record-shortrepaired / droppedA record is shorter than its fields claim; what was read is used (repaired), or a cell record shorter than a cell header is skipped (dropped). Located by part and record offset.
xlsb.row-invalidrepairedA row header holds a row outside the sheet; the row takes the number after the previous row.
xlsb.cell-column-invaliddroppedA cell record holds a column outside the sheet; the cell is skipped.
xlsb.formula-unreadabledroppedA formula's tokens could not be read (a token that is cut off or unknown); the cell keeps its cached value, or the feature that holds the formula stays as raw records. Located by cell address or record offset.
xlsb.no-main-partfatalNo officeDocument relationship points at a workbook part that exists.
xlsb.part-unreadablefatalA part holds a record the translators cannot make sense of (a field outside its range); the inner exception has the cause. Located by part.
xlsx.no-main-partfatalNo officeDocument relationship points at a part that exists.
xlsx.wrong-rootfatalThe workbook part does not start with a workbook element, or a worksheet part with a worksheet element. The location holds the part and offset.
xlsx.no-sheetsrepairedThe workbook part has no sheets element; the workbook reads as having no sheets.
xlsx.external-link-unreadabledroppedAn external reference points at a part that is missing, or the part is not well-formed XML. The link has no sheets and no cached values, so references to it read #REF!; the other links keep their numbers.
xlsx.sheet-name-duplicaterepairedTwo sheets have the same name (ignoring case); lookups by name find the first.
xlsx.sheet-part-missingdroppedA sheet's relationship does not lead to a part that exists; the sheet reads as empty and is not written.
xlsx.sheetdata-unexpected-elementdroppedAn element other than row stands inside sheetData; it is dropped.
xlsx.row-index-invalidrepairedA row has an r that is not a row of the sheet (or none that parses); it takes the number after the previous row.
xlsx.row-out-of-orderrepairedRows are not in ascending order; a row is merged into the one with the same number, later cells winning.
xlsx.cell-address-invaliddroppedA c has an r outside the sheet or not in A1 form; the cell is dropped. The location is the part and offset.
xlsx.cell-row-mismatchrepairedA cell's r names another row than its row element; the cell stays in the element's row.
xlsx.cell-out-of-orderrepairedThe cells of a row are not in ascending column order; they were sorted.
xlsx.stream-row-orderrepairedThe streaming reader met a row whose number is not above the previous row's. It cannot sort or merge, so it delivers rows as stored.
xlsx.stream-cell-orderrepairedThe streaming reader met a cell whose column is not above the previous cell's in its row (reported once per row). It delivers cells as stored.
xls.stream-row-orderrepairedThe legacy workbook cursor met a cell whose row is not above the previous row. It cannot sort or merge, so it delivers rows as stored.
xls.stream-cell-orderrepairedThe legacy workbook cursor met a cell whose column is not above the previous cell's in its row (reported once per row). It delivers cells as stored.
xlsx.cell-duplicatedroppedTwo cells have the same address; the later one is kept.
xlsx.cell-type-unknownrepairedA cell's t is not one of the cell types; the value reads as a number if it parses, otherwise as text.
xlsx.cell-value-invalidrepairedA cell's value does not parse for its type (a number or a shared string index); the cell reads as empty.
xlsx.formula-type-unknownrepairedAn f has an unknown t; it reads as an ordinary formula.
formula.unexpected-endfatal (parsing)The text ends where an operand is expected (1+, an empty formula). The error carries the offset and length in the formula text; the caller that read the formula from a cell reports its address.
formula.unbalanced-parenthesisfatal (parsing)A ( is never closed, or a ) has no opening one. The error carries the offset and length in the formula text; the caller that read the formula from a cell reports its address.
formula.unexpected-characterfatal (parsing)A character cannot continue the formula here (1 2, a stray @). The error carries the offset and length in the formula text; the caller that read the formula from a cell reports its address.
formula.unterminated-stringfatal (parsing)A text literal is not closed. The error carries the offset and length in the formula text; the caller that read the formula from a cell reports its address.
formula.bad-error-literalfatal (parsing)A # does not start one of the fifteen error values. The error carries the offset and length in the formula text; the caller that read the formula from a cell reports its address.
formula.bad-numberfatal (parsing)A number literal is malformed, runs into letters, or is too large for a double. The error carries the offset and length in the formula text; the caller that read the formula from a cell reports its address.
formula.bad-referencefatal (parsing)A sheet prefix is not followed by a reference or name. The error carries the offset and length in the formula text; the caller that read the formula from a cell reports its address.
formula.array-raggedfatal (parsing)The rows of an array constant differ in length. The error carries the offset and length in the formula text; the caller that read the formula from a cell reports its address.
formula.bad-array-elementfatal (parsing)An array constant holds something other than a number, text, TRUE, FALSE or an error. The error carries the offset and length in the formula text; the caller that read the formula from a cell reports its address.
formula.nested-arrayfatal (parsing)An array constant holds another array constant. The error carries the offset and length in the formula text; the caller that read the formula from a cell reports its address.
formula.unbalanced-bracefatal (parsing)An array constant is not closed. The error carries the offset and length in the formula text; the caller that read the formula from a cell reports its address.
formula.unbalanced-bracketfatal (parsing)A table specifier is not closed. The error carries the offset and length in the formula text; the caller that read the formula from a cell reports its address.
formula.too-longfatal (parsing)TryParse only: the text is longer than OfficeLimits.MaxFormulaLength (Parse throws OfficeLimitException). The error carries the offset and length in the formula text; the caller that read the formula from a cell reports its address.
formula.too-deepfatal (parsing)TryParse only: the formula nests deeper than OfficeLimits.MaxFormulaDepth (Parse throws OfficeLimitException). The error carries the offset and length in the formula text; the caller that read the formula from a cell reports its address.
xlsx.column-range-invaliddroppedA col has no valid min/max; it is dropped.
xlsx.merge-range-invaliddroppedA mergeCell has a ref that is not a range of the sheet; it is dropped.
xlsx.shared-string-missingrepairedA cell refers to a shared string index the table does not have; its text reads as empty.
csv.ragged-recordrepairedA delimited-text record has a different number of fields from the first; it is returned as it is. Located by character offset.
csv.stray-quoterepairedText follows the closing quote of a quoted field; it is kept after the quoted text.
csv.quote-unterminatedrepairedA quoted field is still open at the end of the input; it ends there.
csv.encoding-assumedrepairedNo byte-order mark and not valid UTF-8; read as Windows-1252.
csv.encoding-invalidrepairedA byte sequence is not valid in the encoding in use (UTF-8 past the first block of a forward-only stream, or half a UTF-16 unit at the end); it reads as U+FFFD or is dropped. Once per reader.
csv.grid-exceededdroppedImporting delimited text: more than 1,048,576 records, or 16,384 fields in a record; the rest are dropped.
xlsx.styles-wrong-rootfatalThe styles part does not start with a styleSheet element. Raised when the style sheet is first used, not on open.
xlsx.numfmt-invaliddroppedA numFmt has no numeric id or no format code; it is ignored.
xlsx.theme-unreadablerepairedThe theme part is not well-formed XML; theme colours use the default Office scheme.
xlsx.table-part-missingdroppedA tablePart does not lead to a table part that exists; the table is ignored (the element stays in the sheet).
xlsx.table-unreadabledroppedA table part is not well-formed or does not start with table; the table is ignored and the part is kept as stored.
xlsx.pivot-table-part-missingdroppedA pivotTable relationship of a sheet does not lead to a part; the pivot table is ignored.
xlsx.pivot-table-unreadabledroppedA pivot table part is not well-formed or does not start with pivotTableDefinition; it is ignored and kept as stored.
xlsx.pivot-cache-part-missingdroppedA pivotCache element of the workbook does not lead to a cache definition part; the cache is ignored.
xlsx.pivot-cache-unreadabledroppedA pivot cache definition is not well-formed or does not start with pivotCacheDefinition; it is ignored and kept as stored.

The XML layer repairs nothing: Office refuses an ill-formed part, and so does this layer. The limits it enforces (MaxXmlDepth, MaxXmlAttributeCount, MaxXmlNameLength, and MaxPartSize for a part held whole) raise limit.* as above.

Locations

The location says where, in the terms of the layer: a part URI and byte offset (/word/document.xml@1042), a stream path and record offset (/WordDocument@512), a sheet and cell (Sheet1!B7), or a character offset in text (text@88). Offsets count bytes of the uncompressed part or stream from zero; -1 means not known.

Row binding (binding.)

Locations are the sheet and cell address (for CSV and TSV, the record number and field position, under the type's sheet name or Sheet1). A type marked Strict raises the fatal form as an OfficeFormatException; otherwise the repair is reported to OpenContext.Defects. See spreadsheets-poco.md.

CodeSeverityMeaning
binding.column-missingrepaired (fatal when strict and the member cannot be null)The header row has no column for a member; the member keeps its default. Located at the first cell of the header row.
binding.header-duplicatedroppedTwo header cells match the same member; the first is used and the second ignored.
binding.cell-unconvertiblerepaired (fatal when strict)A cell cannot be read as the member's type (text that is not a number, a number out of range or not whole, an unknown enum name); the member keeps its default.
binding.cell-emptyfatal (strict types only)A cell is empty and the member cannot be null. Lenient types leave the default silently.
binding.sheet-not-foundfatalThe sheet the type names does not exist, or the workbook has no visible worksheet.
binding.value-out-of-rangefatalWriting: a date lies outside the range of the workbook's date system (DateTime.MinValue alone is written as an empty cell).

Workbook calculation (calc.)

Locations are the sheet and cell address. These are reported to OpenContext.Defects by Workbook.Recalculate; see spreadsheets-calc.md.

CodeSeverityMeaning
calc.circular-referencerepairedA formula is part of a circular reference (or reads itself). Without iterative calculation it reads as 0, and so does every formula on the cycle.
calc.formula-unparsabledroppedA formula's text cannot be read; the cell keeps its stored value and is left out of the dependency graph.
calc.limit-exceededrepairedEvaluating a formula passed a limit (steps, allocation); the cell shows #VALUE!.
calc.iteration-limitrepairedIterative calculation is on and a circular reference was still changing by more than the maximum change after the maximum number of iterations. The cells keep their last values. Located at the first cell of the cycle.
calc.external-resolve-failedrepairedThe IExternalWorkbookResolver threw an OfficeException or IOException for a link. The link's cached values are used. Located at the link's part.

Pivot refresh (pivot.)

Locations are the table's definition part (and offset). Reported to OpenContext.Defects by PivotTable.Refresh and Workbook.RefreshPivots; see spreadsheets-pivots.md.

CodeSeverityMeaning
pivot.source-field-missingdroppedThe source range no longer has a column the cache listed; the field leaves the cache.
pivot.axis-field-droppeddroppedA row, column or page field referred to a column that is gone; it leaves the table.
pivot.data-field-droppeddroppedA data field referred to a column that is gone; it leaves the table.
pivot.group-unsupporteddroppedA field is grouped in a way refresh does not reproduce (a groupBy it does not know); the group is dropped.
pivot.calculated-field-unparsabledroppedA calculated field's formula cannot be read; its cells show #VALUE!.
pivot.custom-subtotals-unsupportedrepairedA field asks for subtotal functions other than automatic; the automatic subtotal is shown.
pivot.show-data-as-unsupportedrepairedA data field uses a show-values-as form refresh does not compute (percent of parent, percent running total, rank); the normal value is shown.
pivot.filters-not-appliedrepairedThe table has label, value or date filters (filters); refresh does not apply them. Hidden items and report filters are applied.

Template engine (template.)

Located by the binder's unit location plus the offset in the unit's text, or by a character offset in the whole text for plain-text templates. Errors make ParsedTemplate.IsValid false and Render throws TemplateException with the first one; every error found is listed. Warnings are in TemplateResult.Defects.

CodeSeverityMeaning
template.unclosed-tagfatalA tag opener has no closer in its unit (a tag never spans two paragraphs, lines or shapes). The rest of the unit is kept as text.
template.unclosed-blockfatalA for, if or raw block is never closed. Located at its opening tag.
template.unexpected-tagfatalendfor, endif, elif or else with no matching open block, else twice, or elif after else.
template.unknown-tagfatalA block tag whose name is not one of the known tags.
template.empty-expressionfatal{{ }}, or a block tag that needs an expression and has none.
template.expression-syntaxfatalAn expression is not a formula. Located inside the expression; the message carries the formula. code.
template.bad-forfatalA loop is not written for item in expression.
template.bad-optionfatalAn option after an expression is not name=value, a value is not closed, or the tag takes no such option.
template.unknown-scopefatalscope= names a scope the engine does not know.
template.scope-invalidfatalThe binder's unit range for a block does not contain both of the block's tags.
template.unknown-functiondroppedAn expression calls a function that is not in the registry; it will evaluate to #NAME?. A warning, not an error.
template.missing-datarepaired (strict: fatal)The template names data the data does not have, and renders empty. Handled missing data (IFERROR(x, ...)) is not reported.
template.expression-errorrepaired (strict: fatal)A formula evaluated to an error value, which is printed as Excel shows it.
template.not-a-collectionrepaired (strict: fatal)A loop's source is a single value; the loop runs once for it.
template.include-deniedrepaired (strict: fatal)include was used but no ITemplateIncludes was supplied; nothing is read.
template.include-not-foundrepaired (strict: fatal)The supplied ITemplateIncludes has no template of that name.
template.sheet-overflowfatalA rendered workbook sheet would have more rows (or, for a column block, columns) than a sheet can hold. Located at the sheet's part.
template.sheet-name-repairedrepairedA rendered sheet name is empty, too long, uses a character sheet names cannot, or is taken; the sheet gets a cleaned or numbered name.
template.tag-not-bounddroppedAn html or markdown tag sits in a workbook cell, where it cannot be bound; it printed nothing. Located at the cell.
template.image-invaliddroppedThe value of an image tag in a workbook cell is not PNG, JPEG, GIF or BMP data (bytes, or base64 text, optionally a data: URI); no picture is added. Located at the cell the tag is in (after rendering).
template.scope-unusablerepairedA document block asks for a scope the structure cannot give (scope=table-row or table outside a table). Located at the part and the paragraph of the opening tag; the block repeats the paragraphs between its tags.
template.image-unsupporteddroppedAn {% image %} value that is not PNG, JPEG, GIF or BMP data (bytes, a stream, base64 or a data: URI). Nothing is inserted.
template.markup-droppeddroppedAn {% html %} or {% markdown %} value held markup the converter does not carry over (scripts, event handlers, unknown elements, disallowed link targets, images, tables, raw HTML, content over the size or nesting limit). The rest is inserted.

Limits surface as OfficeLimitException: limit.max-iterations, limit.max-output-characters, limit.max-block-depth (block nesting and include depth), limit.max-recursion-depth and the formula limits.

Mail merge (mailmerge.)

Reported in MailMergeResult.Warnings, with the part and offset of the field in the template. See mail-merge.md.

CodeActionMeaning
mailmerge.field-missingrepairedA MERGEFIELD names a field the record does not have; it merged as empty.
mailmerge.field-malformedrepairedA field instruction cannot be read (no name, bad switch argument); the field merged as empty or stays.
mailmerge.field-unsupporteddroppedADDRESSBLOCK, GREETINGLINE, DATABASE, MERGEBARCODE or COMPARE: the field is left as written.
mailmerge.field-unbalanceddroppedA field with no end marker, a stray end marker, or a field spanning paragraphs; it is left as written.

Content-control binding (binding., continued)

Reported in ContentBindingReport.Warnings. See docx-content-controls.md.

CodeActionMeaning
binding.store-not-founddroppedA control's w:storeItemID matches no custom XML part; the control is left.
binding.unsupported-pathdroppedThe binding path is outside the XPath subset or cannot be written to (for example a predicate-only path with nothing to create).
binding.no-datadroppedThe data has no value for the control; its content is kept.
binding.unsupported-controldroppedThe control type cannot show a bound value (group, picture, building block …).
binding.value-not-in-listrepairedA drop-down value is not one of its items; the control keeps its selection.
binding.no-template-itemdroppedA repeating section has no item to copy as its pattern.
html.damagedfatalThe HTML could not be imported (an unexpected failure, wrapped in a typed exception; the inner exception has the cause). Any text parses as HTML, so this means a bug worth reporting with the input.
html.export-failedfatalThe document could not be written as HTML (wrapped unexpected failure).
html.droppeddroppedAn element, attribute or value was left out of the import (a script, an event handler, an unsafe link, a form, a frame, an external image, hidden content, and so on); the location is the text position of the element in the decoded HTML. The loss report of the import counts the same things by kind (loss.html-*, see html.md).
rtf.not-rtffatalThe content does not start with {\rtf.
rtf.damagedfatalThe RTF could not be converted (an unexpected failure while reading, wrapped in a typed exception; the inner exception has the cause).
rtf.export-failedfatalThe document could not be written as RTF (wrapped unexpected failure).
markdown.too-deeprepairedBlock containers (quotes, list items) nested deeper than OfficeLimits.MaxRecursionDepth; the markers beyond the limit are read as text. Located by character offset of the first line over the limit.
markdown.encoding-replacedrepairedThe Markdown is not valid UTF-8 and has no UTF-16 byte-order mark; invalid bytes were replaced by U+FFFD. Located by byte offset of the first.
markdown.damagedfatalThe Markdown could not be converted (an unexpected failure while importing, wrapped in a typed exception).
markdown.export-failedfatalThe document could not be written as Markdown (wrapped unexpected failure).
rtf.parameter-overflowrepairedA control word parameter does not fit in 32 bits; it was clamped.
rtf.invalid-hex-escaperepaired\' was not followed by two hexadecimal digits; it was dropped.
rtf.binary-data-truncatedrepairedA \bin length is negative or runs past the end of the input; it was clamped.
rtf.truncated-tokenrepairedThe input ended inside a control word or escape.
rtf.unbalanced-group-endrepairedA } without a {; ignored.
rtf.unclosed-groupsrepairedThe input ended with groups still open; they are closed at the end.
rtf.nesting-limit-exceededdroppedGroup nesting reached the limit (MaxRecursionDepth, at most 1000); reading stopped there.
rtf.content-limit-exceededdroppedThe file holds more nodes than MaxRecordCount allows; the rest is ignored.
rtf.invalid-picture-datadroppedPicture data is empty, not valid for its declared format or not a format that can be carried; the picture is left out.
rtf.picture-limit-exceededdroppedA picture exceeds MaxPartSize, or the pictures together exceed MaxAllocationBytes; it is left out.
rtf.undefined-referencedroppedA paragraph uses a list override the list override table does not define.
rtf.unclosed-rowrepairedA table row has cells but no \row; it is closed at the end of the table.
rtf.too-many-defectsrepairedThe reader's defect list reached its cap of 256; later ones are not recorded.
rtf.header-truncated, rtf.unknown-compression-type, rtf.compressed-size-mismatch, rtf.missing-end-marker, rtf.crc-mismatch, rtf.raw-size-mismatch, rtf.reference-beyond-dictionary, rtf.output-limit-exceeded, rtf.expansion-ratio-exceededrepaired or droppedCompressed RTF (the mail body form): the header, size, checksum or dictionary reference is damaged, or a limit was hit; see RtfDefectKind.
rtf.not-encapsulated, rtf.ambiguous-unknown-code-page, rtf.lone-surrogate, rtf.ambiguous-html-rtf-in-plain-textrepairedThe mail layer's de-encapsulation resolved a known ambiguity in one documented way (see RtfDefectKind).
rtf.nested-table-flattened, rtf.ambiguous-picture-format, rtf.ambiguous-list-level, rtf.ambiguous-symbol-font, rtf.ambiguous-bare-cellrepaired or droppedThe mail layer's HTML conversion (RtfHtmlConverter) repaired or flattened something; the hub conversion reads these constructs fully.

Legacy workbooks (biff.)

Located by stream path and record offset (Record locations) unless the kind says otherwise. See xls.md.

CodeSeverityMeaning
biff.truncated-recorddroppedA record claims more data than the stream holds; it and everything after it are ignored.
biff.trailing-bytesdroppedFewer than a record header of bytes follow the last record.
biff.no-boffatalThe stream does not begin with a BOF record.
biff.no-workbook-streamfatalA compound file has neither a Workbook nor a Book stream.
biff.no-sheetfatalA BIFF2 to BIFF4 stream holds no worksheet.
biff.missing-eofrepairedA substream has no EOF record; it is read to the end of the stream.
biff.malformedfatalAn unexpected failure while reading damaged records (the inner exception names it).
biff.codepage-unavailablerepairedThe workbook's code page is not available in the runtime; 8-bit text is read as Windows-1252. Kind Encoding.
biff.sheet-missingdroppedA sheet in the sheet list has no substream; it is left empty.
biff.sheet-namerepairedA sheet name is invalid or repeated; the sheet is named Sheet<n>.
biff.no-visible-sheetrepairedEvery sheet is hidden; the first is shown.
biff.cell-out-of-rangedroppedA cell lies outside the sheet. Kind Reference.
biff.sst-indexdroppedA text cell refers to a shared string the table does not hold. Kind Reference.
biff.sst-truncatedrepairedThe shared string table ends inside a string.
biff.sst-shortrepairedThe table holds fewer strings than it declares.
biff.string-orphandroppedA STRING record does not follow a formula that needs one.
biff.colinfo-rangedroppedA column range is inverted or beyond column 255.
biff.merge-rangedroppedA merged range is inverted or beyond column 255.
biff.formula-lengthdroppedA formula claims more token bytes than its record holds.
biff.formula-tokendroppedA formula holds a token or function the converter does not know; the cell keeps its cached value. Kind Formula.
biff.formula-stackdroppedA formula's tokens do not reduce to one expression. Kind Formula.
biff.formula-exp, biff.formula-tabledroppedA shared-formula or data-table token reached a place it cannot be resolved. Kind Formula.
biff.formula-exp-missingdroppedA formula refers to a shared or array formula the sheet does not define. Kind Formula.
biff.formula-namedroppedA formula uses a name or external name the file does not define (replaced by #NAME?). Kind Formula.
biff.formula-pivot-name, biff.formula-macro-functiondroppedA pivot-table name or macro-command function is replaced by an error value. Kind Formula.
biff.formula-too-longdroppedA formula is longer than OfficeLimits.MaxFormulaLength. Kind Formula.
biff.formula-text-invaliddroppedA formula holds a character XML cannot carry (a control character in a text constant); the cell keeps its cached value. Kind Formula.
biff.cf-lengthdroppedA conditional-format rule is shorter than its parts.
biff.name-rejecteddroppedA defined name is invalid in the hub and is dropped. Kind Reference.
biff.object-count-mismatchrepairedThe shapes with object records in a sheet's drawing and the sheet's Obj records differ in number, so the embedded objects cannot be matched to their shapes; they stay pictures and are counted in loss.ole-objects.
biff.embedding-storage-missingdroppedAn Obj record names an embedding storage (MBD and eight hex digits) the file does not have; the object keeps its picture. Kind Reference.
biff.name-repeateddroppedA defined name repeats one of the same scope (LibreOffice writes some twice); the first is kept. Kind Reference.

OLE property sets and objects (ole.)

Reported by RecursiveAI.OneDocument.Ole (see ole.md). Property-set defects have a Record location: the stream name (/\u0005SummaryInformation) and the byte offset in the stream. A defect in one property drops that property only.

CodeActionMeaning
ole.propset-headerfatal, or repaired for the versionThe stream is shorter than the 28-byte header or its byte order mark is not 0xFFFE (fatal; TryRead reports it and returns false), or the version is above 1 (repaired: read as 1).
ole.propset-countrepairedThe header lists more property sets than fit, or more than 64; or a set lists more properties than its bytes can hold. The count is clamped.
ole.propset-bad-offsetdroppedA property set starts inside the header or outside the stream; the set is dropped.
ole.propset-sizerepairedA property set's declared size is under 8 or past the stream; the rest of the stream is read as the set.
ole.propset-truncateddropped (repaired for an odd UTF-16 byte count)A property's offset is outside its set, or its value, a string, a vector or an array runs past the bytes it may use; only that property is dropped.
ole.propset-duplicate-iddroppedA property identifier appears twice; the first is kept. Kind Structure.
ole.propset-type-unsupporteddroppedA property has a type number that is not a property type (or a code page property that is not a 16-bit integer). Kind Unsupported or Value.
ole.propset-dictionarydroppedThe dictionary is cut short, lists more entries than fit, or names a special or repeated identifier.
ole.propset-codepage-unsupportedrepairedThe set's code page is not available in the runtime, or the set has strings and no code page property; its strings are read as Windows-1252 and the set's CodePage says so. Kind Encoding.
ole.storage-too-largedroppedAn object storage holds more than MaxPartSize in one stream or more than MaxAllocationBytes in all; it is not copied. Kind Limit.
ole.storage-name-invalidfatalWriting a storage as a compound file met a name a compound file cannot hold (a damaged source). Raised as OfficeFormatException by OleStorageImage.ToCompoundFile; the converters report it as a dropped object. Kind Packaging.

OfficeArt (art.)

Reported by the shared OfficeArt reader (RecursiveAI.OneDocument.OfficeArt) with a Record location: the stream name the caller gave and the offset of the record. See officeart.md.

CodeActionMeaning
art.record-truncatedrepairedFewer than eight bytes remain where a record header should be; they are ignored.
art.record-overrunrepairedA record claims more bytes than remain in its parent or the data; it is clamped.
art.property-overrunrepairedA property table claims more entries, or a complex property more data, than the record holds; the excess is dropped.
art.bse-truncatedrepairedA BLIP store entry is shorter than its fixed part; the slot is empty.
art.blip-indexrepairedA picture refers to a BLIP index outside the store; the picture is dropped.
art.blip-missingrepairedA BLIP is not embedded and its offset is outside the delay (picture) stream.
art.blip-invaliddroppedA BLIP record is damaged, of an unknown type or compressed in a way the format does not define.

PowerPoint binary (ppt.)

Reported by the .ppt reader (RecursiveAI.OneDocument.Ppt.Binary) and the conversion to PresentationML, with a Record location in the PowerPoint Document stream (the Current User stream for ppt.current-user-missing). The conversion codes are also the items of Presentation.ImportLoss. See ppt.md.

CodeActionMeaning
ppt.no-document-streamfatalThe compound file has no PowerPoint Document stream (used directly; the sniffer calls such a file unknown).
ppt.current-user-missingrepairedThe Current User stream is missing or damaged; the newest edit is found by scanning.
ppt.edit-chain-brokenrepairedA user edit offset does not lead to a UserEditAtom; older edits are ignored or the chain is recovered by scanning.
ppt.edit-chain-looprepairedThe user edit chain does not move backwards; the walk stops.
ppt.no-user-editfatalThe stream holds no readable user edit, so the persist directory cannot be built.
ppt.persist-directory-missingdroppedA user edit points at a persist directory that is not there; the objects it defines are ignored.
ppt.persist-directory-truncatedrepairedA directory entry lists more offsets than the record holds.
ppt.persist-object-rangedroppedAn encrypted persist object lies outside the stream and is not decrypted.
ppt.persist-object-missingdroppedA persist identifier is not in the directory, or its offset is outside the stream.
ppt.document-container-recoveredrepairedThe document container was found by scanning, not through the directory.
ppt.no-document-containerfatalNeither the directory nor a scan leads to a document container.
ppt.document-atom-missingrepairedNo DocumentAtom; the default slide size is used.
ppt.master-missingdroppedA master list entry (or the file) has no usable master; a plain master is written.
ppt.ole-storage-unreadabledroppedAn ExOleObjStg record is not an object storage record, does not inflate, inflates to another size than it says, or its bytes are not a compound file; the object keeps its preview picture.
ppt.ole-storage-too-largedroppedAn object storage declares a decompressed size past the limits; it is not read. Kind Limit.
ppt.slide-missingdroppedA slide list entry does not lead to a slide container; the slide is dropped.
ppt.notes-missingdroppedA notes list entry does not lead to a notes container.
ppt.text-style-truncatedrepairedA paragraph, character, ruler or master style structure is cut short by the end of its record.
ppt.text-special-info-unreadrepairedSmart tags in a text special info record are not read; later language runs are ignored.
ppt.outline-referencerepairedA shape refers to slide-list text that does not exist.
ppt.malformedfatalA defensive wrapper: an unexpected exception while reading is reported as a format error (a bug if it is ever seen).
ppt.shape-approximated, ppt.shape-adjust-dropped, ppt.fill-approximated, ppt.path-escape, ppt.geometry-guides, ppt.wordart-flattened, ppt.picture-pict, ppt.picture-missing, ppt.table-as-group, ppt.table-borders-approximated, ppt.transition-dropped, ppt.animations-dropped, ppt.ole-object-flattened, ppt.vba-not-carried, ppt.document-properties-not-carried, ppt.header-footer-field, ppt.placeholder-unknowndroppedConversion losses; meanings in ppt.md.

Encrypted files are decrypted or raise encryption.password-required; PowerPoint 4.0/95 files raise unsupported.feature.

VBA projects (vba.)

Reading is in docs/vba.md. Locations are <container>!<stream path>@<offset>: the container is the project part (/word/vbaProject.bin), the storage (/Macros, /_VBA_PROJECT_CUR) or PowerPoint Document@<offset>; the offset is into the decompressed dir stream or the module stream. Every code is exercised by a crafted input in VbaDefectTests.

CodeSeverityMeaning
vba.project-stream-missingrepairedThe PROJECT stream is missing; module kinds come from the module type records and protection is reported as none.
vba.protection-unreadablerepairedCMG, DPB or GC is present but cannot be undone; the project is reported as locked.
vba.dir-missingdroppedThe VBA storage has no dir stream, so no module can be listed.
vba.dir-damagedrepairedThe dir stream's compressed container is damaged; the records decoded before the damage are used.
vba.dir-recordrepairedA dir record is cut short or has a size field the specification does not allow; reading stops there and keeps what it has.
vba.dir-record-unknownrepairedA dir record has an identifier the specification does not define; it is skipped by its size.
vba.codepage-unsupportedrepairedThe project code page is not available; Latin-1 decodes byte strings and source.
vba.module-list-shortrepairedThe module count announces more modules than the dir stream holds.
vba.module-stream-missingdroppedA module is listed but its stream is not in the VBA storage; the module has no source. Kind Reference.
vba.module-offset-invaliddroppedA module's source offset is past the end of its stream; the module has no source. Kind Reference.
vba.module-source-damagedrepairedA module's compressed source is damaged; the text decoded before the damage is kept.
vba.version-stream-missingrepairedThe _VBA_PROJECT stream is missing; the p-code version is unknown.
vba.version-stream-shortrepairedThe _VBA_PROJECT stream is shorter than its seven fixed bytes.
vba.project-not-compounddroppedThe project part is not a compound file; the project has no modules. Kind Packaging.
vba.workbook-stream-missingfatalAn Excel 97-2003 file has no Workbook or Book stream, so a removal cannot correct its record positions.

Removal reports (VbaRemovalReport.NotDone) carry the same style of code for what a removal left or could not do; they are notes, not defects:

CodeMeaning
vba.no-macro-free-typeThe format (add-in, binary workbook) has no macro-free counterpart; the file keeps its format without a project.
vba.project-unreadableThe project could not be read before it was removed (a limit, for example), so its modules are not counted. It is removed all the same.
vba.output-not-encryptedThe input was encrypted; the output is written without encryption.
vba.doc-customizations-keptA Word file's toolbar, menu and key customizations, and a signature kept in its user variables, are not interpreted and stay.
vba.ppt-signature-keptA PowerPoint file's signature kept in the property sets is not looked for and stays.

Office 2003 XML (wml2003., sml2003.)

Reported by the readers of Word 2003 XML and Excel 2003 XML while they convert (see xml-2003.md). Locations are the part / (the file itself) with a byte offset, or a cell address for cell problems.

CodeSeverityMeaning
wml2003.not-wordmlfatalThe root is not a w:wordDocument in the 2003 namespace.
wml2003.missing-picturedroppedA picture's v:imagedata names data (wordml://...) that the file does not hold.
wml2003.bad-base64droppedThe w:binData of a picture is not valid base64.
wml2003.number-formatrepairedA list level's w:nfc code has no known name; decimal was used.
wml2003.table-gridrepairedA table has no w:tblGrid; one was made from its widest row.
wml2003.style-idrepairedA style has no w:styleId; one was made from its name.
wml2003.bad-valuerepaired or droppedA fractional number where a whole one is needed (rounded), an empty attribute (left out), or a bad date or count in the document properties (left out).
wml2003.duplicate-propertyrepairedOne property list names a property twice; the last was kept.
sml2003.not-spreadsheetfatalThe root is not a Workbook in the SpreadsheetML 2003 namespace.
sml2003.no-sheetsrepairedThe workbook has no worksheet; an empty one was added.
sml2003.sheet-namerepairedA sheet name is empty, too long, has a forbidden character or repeats another (ignoring case); it was changed.
sml2003.duplicate-stylerepairedA style ID is defined twice; the first definition is used.
sml2003.bad-style-refrepairedA cell, row or style names a style that does not exist, or styles inherit from each other in a loop; the default style was used.
sml2003.bad-indexrepaired or droppedA row, column or cell index goes backwards (the item follows the previous one) or lies beyond the last row or column (dropped).
sml2003.bad-numberrepairedA Number cell does not hold a number; its text was kept as a string.
sml2003.bad-daterepairedA DateTime cell does not hold an ISO 8601 date or is outside the date range; its text was kept as a string.
sml2003.bad-formuladroppedA cell's ss:Formula is not an R1C1 formula the parser reads (files written by other programs may hold OpenFormula text); the cached value stays as a constant.
sml2003.bad-valuedroppedA bad date in the document properties.

Merge, copy and insert (merge.)

Reported in MergeReport.Problems (severity dropped), with the part or cell. Resolutions and loss items of the same operations have codes of the same form but are not defects; they are listed in operations-merge.md.

CodeSeverityMeaning
merge.note-missingdroppedThe copied content refers to a footnote or endnote the source does not have; the reference was left out.
merge.comment-missingdroppedThe copied content has comment markers for a comment the source does not have; the markers were left out.
merge.relationship-missingdroppedA relationship id used by the copied content is not in the source part's relationships; the attribute was kept as written.
merge.part-missingdroppedA relationship points at a part the source does not have; the attribute was kept as written.
merge.numbering-missingdroppedA paragraph uses a list the source's numbering part does not define; the reference was kept.
merge.namespace-prefix-clashdroppedA prefix of copied ignorable markup is bound to another namespace on the destination's root.
merge.formula-unreadabledroppedA formula of a copied sheet does not parse; it was copied as written.
merge.sheet-part-not-copieddroppedA sheet has parts (drawings, comments, pivot tables …) that a sheet copy does not carry.
merge.references-leftdroppedAfter a sheet move, formulas in the sheets left behind still name the moved sheet.

OpenDocument (packaging.odf-*, odf.)

The package layer (OdfPackage, see odf.md) reports under packaging.; the text conversion reports under odf.. Package locations are the entry name (mimetype, META-INF/manifest.xml, content.xml) with a byte offset where one is known; conversion locations are content.xml (or the flat file) with a byte offset.

CodeSeverityMeaning
packaging.not-odffatalA flat XML file whose root is not office:document, or a zip with no usable mimetype and no content.xml.
packaging.odf-no-mimetyperepairedThe package has no mimetype entry; the type is taken from the manifest or the body. A flat file without office:mimetype is repaired the same way.
packaging.odf-mimetype-not-firstrepairedmimetype is not the first entry; a saved package writes it first.
packaging.odf-mimetype-compressedrepairedmimetype is deflated; a saved package stores it.
packaging.odf-no-manifestrepairedThere is no META-INF/manifest.xml; saving writes one.
packaging.odf-manifest-unreadablerepairedThe manifest is not well-formed or its root is not manifest:manifest; it reads as empty.
packaging.odf-manifest-entrydroppedA manifest:file-entry has no manifest:full-path.
packaging.odf-manifest-missing-entryrepairedThe manifest lists a file the package does not hold.
packaging.odf-wrong-rootfatalA part does not start with its root element (office:document-content for content.xml, and so on).
packaging.invalid-part-name, packaging.duplicate-part-name, packaging.zip-damagedas for OPCEntry names that are empty, absolute or contain ..; an entry stored twice (the first is used); a damaged zip directory that was recovered.
odf.no-contentfatalThe package has no content.xml.
odf.not-textfatalThe document is not a text document (its body holds a spreadsheet or presentation).
odf.not-presentationfatalOpenDocumentPresentation.ToPackage was given a file whose body is not office:presentation.
odf.damagedfatalA defensive wrapper: an unexpected exception while converting is reported as a format error (a bug if it is ever seen).
odf.export-failedfatalThe same, while writing OpenDocument.
odf.style-cyclerepairedA style's parent chain loops; the loop was cut.
odf.bad-datedroppedA date in meta.xml is not a date.
odf.unknown-changerepairedA change mark refers to a changed region the file does not hold.
odf.missing-picturedroppedA picture names a package file that is not there.
odf.bad-base64droppedThe inline data (office:binary-data) of a picture is not valid base64.
odf.repeat-cappeddroppedA table repeats rows or cells by counts that would exceed the reader's budget (200,000 cells per table, 10,000 repeats per element); the rest were dropped.

OpenDocument spreadsheets (ods., openformula.)

See ods.md. Locations are content.xml (or the flat file) with a byte offset, a cell address (DefectLocation.InCell) for values and formulas, or the sheet name. Package problems report under packaging.; repeat budgets under odf.repeat-capped; limit.max-part-size stops a sheet that would build a part past the limit.

CodeSeverityMeaning
ods.not-spreadsheetfatalThe document is a valid OpenDocument file but not a spreadsheet (its body is text, a presentation or a drawing).
ods.no-sheetsrepairedThe spreadsheet holds no table; an empty sheet was added.
ods.sheet-namerepairedA table name is empty, too long, holds characters a workbook sheet name cannot, or repeats another name (compared without case); a valid unique name was used.
ods.namerepairedA defined name is not valid in a workbook (starts with a digit, looks like a cell address, holds other characters); a valid name was used.
ods.bad-namedroppedA named range has no readable cell range address.
ods.bad-formuladroppedA formula is not OpenFormula the parser reads (or, when writing, cannot be expressed); the cached value is kept as a constant. The message names the openformula. code.
ods.formula-dialectdroppedA formula is in a syntax other than of: (oooc:, msoxl: and others) and is not read; the cached value is kept.
ods.style-missingrepairedA cell, row, column, data style or conditional-format style is named but not defined; the default was used.
ods.bad-numberrepairedA float, percentage or currency cell has an office:value that is not a number; the displayed text was kept.
ods.bad-daterepaired or droppedA date cell's office:date-value is not a date (the displayed text was kept), or a date in meta.xml is not a date (dropped).
ods.bad-timerepairedA time cell's office:time-value is not an ISO 8601 duration; the displayed text was kept.
ods.bad-value-typerepairedA cell has an office:value-type the format does not define; the displayed text was kept.
ods.bad-repeatrepairedA number-rows-repeated or number-columns-repeated is not a positive integer; 1 was used.
ods.validation-missingdroppedA cell names a table:content-validation the file does not define.
ods.row-limitdroppedRows with content lie past the last row of a worksheet (1,048,576).
ods.column-limitdroppedCells with content lie past the last column of a worksheet (16,384).
openformula.syntaxfatal for the formulaThe text is not OpenFormula (reported inside ods.bad-formula). FormulaSyntaxError carries the offset.
openformula.bad-referencefatal for the formulaA reference without a ., with ends of different kinds, with no column or row, or outside the sheet's bounds.
openformula.external-referencefatal for the formulaA reference into another document (['file:///x.ods'#$S.A1]); never followed.
openformula.too-long, openformula.too-deepfatal for the formulaThe formula is longer or nests deeper than OfficeLimits.MaxFormulaLength or MaxFormulaDepth.

The printer reports through OpenFormulaProblem (not defects): openformula.function (a function other readers do not know; still written), and openformula.spill, openformula.structured-reference, openformula.member-path, openformula.invoke, openformula.unknown-node, openformula.error (the AST has no OpenFormula form; the formula is not written and its cached value stays).

Redaction report codes

Redaction does not report through the open-time defect list: what it could not remove or look into is in RedactionReport.Gaps, with codes of the form redaction.problem (redaction.part-name, redaction.part-not-xml, redaction.embedded-package, redaction.opaque-part, redaction.depth, redaction.region-not-applicable, redaction.region-failed, redaction.shared-formula-extent, redaction.pivot-cache-source, redaction.animations-removed). Their meaning and the tests that assert them are in redaction.md.

Inspection and sanitising (sanitize.)

Behaviour is in docs/sanitize.md. Items that sanitising leaves in place are not defects: they are NotRemovedItems of the report, with the codes sanitize.referenced, sanitize.unsupported-construct and sanitize.report-only.

CodeSeverityMeaning
sanitize.verification-failedfatalThe sanitised file, inspected again, still holds something in a category that was reported as removed (SanitizeVerificationException). Nothing was written; the location is the part that still holds it.
sanitize.failedfatalSanitising met markup it could not edit and stopped; nothing was written.
odf.repeat-cappeddroppedA table repeats rows or cells by counts that would exceed the reader's budget (200,000 cells per text table, 50,000 per presentation table, 10,000 repeats per element); the rest were dropped.
odp.no-master-pagerepairedThe presentation has no master page; a plain one was added.
odp.missing-master-pagerepairedA slide names a master page the file does not define; the first one was used.
odp.bad-viewboxdroppedA polygon or path has no usable svg:viewBox; it is drawn as a rectangle.
odp.bad-pathdroppedA path holds a command that is not SVG path data; the rest of the path was dropped.
odp.empty-tabledroppedA table has no columns or no rows.
odp.missing-fill-imagedroppedA bitmap fill names an image the file does not hold.
odp.group-too-deepdroppedGroups nested more than 24 deep; the inner shapes were dropped.