Per-probe lossiness report. Currently 46 of 46 pristine.
Generated by tests/e2e/xlsx-lossiness-audit.spec.ts. Build a rich xlsx with
ExcelJS, push it through our parser → snapshot → exporter pipeline, re-parse
the result with ExcelJS, and compare feature-by-feature.
Legend: ✅ survived · ⚠️ partial (present but shape differs) · ❌ dropped
Totals: 54 ✅ · 0 ⚠️ · 0 ❌ (of 54 probes)
Sheets
| Probe | Reference | Actual | Status |
|---|
| sheet order + names | ["Data","Hidden","Tabular"] | ["Data","Hidden","Tabular"] | ✅ |
Values
| Probe | Reference | Actual | Status |
|---|
| A1 header | "Quarter" | "Quarter" | ✅ |
| B2 number | 1234.56 | 1234.56 | ✅ |
| Probe | Reference | Actual | Status |
|---|
| B5 SUM formula text | "SUM(B2:B4)" | "SUM(B2:B4)" | ✅ |
| C5 cross-sheet formula references Hidden!A1 | "Hidden!A1" | "Hidden!A1" | ✅ |
Styles · font
| Probe | Reference | Actual | Status |
|---|
| bold preserved | true | true | ✅ |
| size preserved | 12 | 12 | ✅ |
| family preserved | "Calibri" | "Calibri" | ✅ |
| color preserved | {"argb":"FFFFFFFF"} | {"argb":"FFFFFFFF"} | ✅ |
Styles · fill
| Probe | Reference | Actual | Status |
|---|
| header fill preserved | {"type":"pattern","pattern":"solid","fgColor":{"argb":"FF2563EB"}} | {"type":"pattern","pattern":"solid","fgColor":{"argb":"FF2563EB"}} | ✅ |
Styles · alignment
| Probe | Reference | Actual | Status |
|---|
| header horizontal | "center" | "center" | ✅ |
| header vertical | "middle" | "middle" | ✅ |
Styles · border
| Probe | Reference | Actual | Status |
|---|
| header borders (4 sides) preserved | ["bottom","left","right","top"] | ["bottom","left","right","top"] | ✅ |
| Probe | Reference | Actual | Status |
|---|
| B2 currency | "\"$\"#,##0.00" | "\"$\"#,##0.00" | ✅ |
| B3 percent | "0.00%" | "0.00%" | ✅ |
| B4 date | "yyyy-mm-dd" | "yyyy-mm-dd" | ✅ |
| E2 accounting w/ red negatives | "#,##0.00_);[Red](#,##0.00)" | "#,##0.00_);[Red](#,##0.00)" | ✅ |
| E3 thousand-suffix “K” | "#,##0.0,\"K\"" | "#,##0.0,\"K\"" | ✅ |
| E4 fraction (# ?/?) | "# ?/?" | "# ?/?" | ✅ |
| E5 scientific | "0.00E+00" | "0.00E+00" | ✅ |
| E6 locale tag [$$-409] | "[$$-409]#,##0.00" | "[$$-409]#,##0.00" | ✅ |
| E7 datetime w/ seconds | "yyyy-mm-dd hh:mm:ss" | "yyyy-mm-dd hh:mm:ss" | ✅ |
| E8 conditional bracket [>=100000] | "[>=100000]#,##0,\"k\";#,##0" | "[>=100000]#,##0,\"k\";#,##0" | ✅ |
| E9 literal text suffix “USD” | "#,##0.00 \"USD\"" | "#,##0.00 \"USD\"" | ✅ |
Merges
| Probe | Reference | Actual | Status |
|---|
| A7:C7 merged | true | true | ✅ |
Hyperlinks
| Probe | Reference | Actual | Status |
|---|
| C2 → github.com/schnsrw/sheets | "https://github.com/schnsrw/sheets" | "https://github.com/schnsrw/sheets" | ✅ |
| Probe | Reference | Actual | Status |
|---|
| B2 comment text | "This is a comment on Q1 revenue." | "This is a comment on Q1 revenue." | ✅ |
Defined names
| Probe | Reference | Actual | Status |
|---|
| RevenueRange | "Data!$B$2:$B$4" | "Data!$B$2:$B$4" | ✅ |
Data validation
| Probe | Reference | Actual | Status |
|---|
| D2:D4 list constraint | "list" | "list" | ✅ |
Sheet props
| Probe | Reference | Actual | Status |
|---|
| tab color (Data) | {"argb":"FFFF5722"} | {"argb":"FFFF5722"} | ✅ |
| tab color survives round-trip | {"argb":"FFFF5722"} | {"argb":"FFFF5722"} | ✅ |
| frozen rows | 1 | 1 | ✅ |
| frozen columns | 1 | 1 | ✅ |
| hidden sheet survives | "hidden" | "hidden" | ✅ |
Dimensions
| Probe | Reference | Actual | Status |
|---|
| column A width (18) | 18 | 18 | ✅ |
| column B width (12) | 12 | 12 | ✅ |
| row 1 height (24) | 24 | 24 | ✅ |
Page setup
| Probe | Reference | Actual | Status |
|---|
| orientation landscape | "landscape" | "landscape" | ✅ |
| header (left text) | "&LCasual Sheets Audit" | "&LCasual Sheets Audit" | ✅ |
Tables
| Probe | Reference | Actual | Status |
|---|
| PeopleTable defined | true | true | ✅ |
| Probe | Reference | Actual | Status |
|---|
| creator | "casual-sheets audit" | "casual-sheets audit" | ✅ |
Macros (VBA passthrough)
| Probe | Reference | Actual | Status |
|---|
| xl/vbaProject.bin survives round-trip | "1024 bytes" | "1024 bytes" | ✅ |
| xl/vbaProject.bin byte-equal to original | "byte-identical" | "byte-identical" | ✅ |
| [Content_Types].xml has vbaProject Override | "present" | "present" | ✅ |
| xl/_rels/workbook.xml.rels has vbaProject relationship | "present" | "present" | ✅ |
| export blob MIME → macroEnabled.12 | "application/vnd.ms-excel.sheet.macroEnabled.12" | "application/vnd.ms-excel.sheet.macroenabled.12" | ✅ |
Pivots (cache passthrough)
| Probe | Reference | Actual | Status |
|---|
| xl/pivotCaches/pivotCacheDefinition1.xml survives round-trip | "contains marker CASUAL-AUDIT-CACHE-DEF" | "present + marker" | ✅ |
| xl/pivotCaches/pivotCacheRecords1.xml survives round-trip | "contains marker CASUAL-AUDIT-CACHE-REC" | "present + marker" | ✅ |
| xl/pivotTables/pivotTable1.xml survives round-trip | "contains marker CASUAL-AUDIT-PIVOT-TABLE" | "present + marker" | ✅ |
| [Content_Types].xml has pivotCacheDefinition Override | "present" | "present" | ✅ |
| [Content_Types].xml has pivotTable Override | "present" | "present" | ✅ |
| xl/workbook.xml has element | "present" | "present" | ✅ |
| xl/_rels/workbook.xml.rels has pivotCacheDefinition relationship | "present" | "present" | ✅ |
| pivot sheet rels has pivotTable relationship | "present" | "present" | ✅ |
Synced from docs/xlsx-lossiness.md in schnsrw/sheets. To update: edit upstream and re-run npm run sync-docs.