42 of 42 Excel cases pass. Last run on October 11, 2026, on Node 22 (macOS, arm64).
All cases are in one benchmark script, packages/xlsx/scripts/benchmark-xlsx-0410-v2.ts, in Runstamp's source repository, which is not public. Each builds or edits a real .xlsx file with @runstamp/xlsx, writes it to disk, then checks the bytes.
What the cases cover
| Group | What it checks |
|---|---|
| A | Generation speed for small, styled and multi-sheet workbooks |
| B | 50,000 to 200,000 rows without running out of memory |
| C | Conditional formatting: value rules, fonts, data bars, color scales, rule order, data validation |
| D | Bar, line and pie charts, and a chart that reads from a named table |
| E | 1,000, 5,000 and 10,000 merged regions |
| F | Formulas: shared formulas with no stray @, FILTER, SORT, UNIQUE, cross-sheet VLOOKUP, server-side evaluation |
| G | Dates: the 1900 boundary, the 1904 date system, CJK date formats, Strict Open XML |
| H | Streaming writes: dates, rich text, shared strings, 100,000 rows |
| I | Filling templates: named ranges, explicit cells, row expansion with formula shifting, charts and tables left byte for byte |
| J | 10 renders at once, with no output mixed between them |
How a case passes
A case passes only if all four hold:
- The workbook is produced without an error.
- The case's own check holds. For example, the 1904 flag is set in
workbook.xml, shifted formulas point at the new rows, or a template's chart part is byte-identical to the original. - The structure check (
validateXlsxStructure) passes: the zip, content types, relationships and required parts are all present and consistent. - Where it runs, the independent Open XML validator
(
@xarsh/ooxml-validator) reports no errors.
A failed check fails the case. A skipped check shows as "Not run" and never counts as a pass.
Limits
- Excel itself was not opened, so these cases do not test its repair dialog or how it draws the file.
- The structure check is skipped for the 5,000 and 10,000 merged-region files. The Open XML validator is skipped for files over 5 MB and for template cases. Skipped checks show "Not run" in the table.
- Timings depend on the machine and are not part of the pass rule.
Check it yourself
The benchmark script lives in the source repository, which is not public, so you cannot run it. The cases, the pass rule above and the results table below are the record of the October 11, 2026 run.
You can check the published package on your own files. Install it and follow the quick start:
npm install @runstamp/sdkResults from October 11, 2026
| Case | Name | Result | Structure check | Open XML validator |
|---|---|---|---|---|
BM-XLSX-A01 | Single-cell generation speed | Pass | Pass | Pass |
BM-XLSX-A02 | 500-row styled workbook speed | Pass | Pass | Pass |
BM-XLSX-A03 | 10-sheet workbook speed | Pass | Pass | Pass |
BM-XLSX-B01 | 50,000 rows variable-length strings | Pass | Pass | Not run |
BM-XLSX-B02 | 50,000 rows fixed-length strings | Pass | Pass | Not run |
BM-XLSX-B03 | 100,000 rows numeric only | Pass | Pass | Not run |
BM-XLSX-B04 | 200,000 rows memory stability | Pass | Pass | Not run |
BM-XLSX-C01 | Conditional formatting cell value rules | Pass | Pass | Pass |
BM-XLSX-C02 | Conditional formatting with bold font | Pass | Pass | Pass |
BM-XLSX-C03 | Conditional formatting with italic font | Pass | Pass | Pass |
BM-XLSX-C04 | Data bar conditional formatting | Pass | Pass | Pass |
BM-XLSX-C05 | Color scale conditional formatting | Pass | Pass | Pass |
BM-XLSX-C06 | Multiple rules priority order | Pass | Pass | Pass |
BM-XLSX-C07 | Conditional formatting + data validation | Pass | Pass | Pass |
BM-XLSX-D01 | Bar chart with data range | Pass | Pass | Pass |
BM-XLSX-D02 | Line chart with 3 series | Pass | Pass | Pass |
BM-XLSX-D03 | Pie chart with data labels | Pass | Pass | Pass |
BM-XLSX-D04 | Chart referencing a named table | Pass | Pass | Pass |
BM-XLSX-E01 | 1,000 merged regions | Pass | Pass | Pass |
BM-XLSX-E02 | 5,000 merged regions | Pass | Not run | Not run |
BM-XLSX-E03 | 10,000 merged regions | Pass | Not run | Not run |
BM-XLSX-F01 | Shared formula no spurious @ | Pass | Pass | Pass |
BM-XLSX-F02 | Dynamic array FILTER | Pass | Pass | Pass |
BM-XLSX-F03 | Dynamic array SORT | Pass | Pass | Pass |
BM-XLSX-F04 | Dynamic array UNIQUE | Pass | Pass | Pass |
BM-XLSX-F05 | Cross-sheet VLOOKUP with spaces | Pass | Pass | Pass |
BM-XLSX-F06 | Formula builder API | Pass | Pass | Pass |
BM-XLSX-F07 | Server-side formula evaluation | Pass | Pass | Pass |
BM-XLSX-G01 | Date 1/1/1900 serial boundary | Pass | Pass | Pass |
BM-XLSX-G02 | 1904 date system flag | Pass | Pass | Pass |
BM-XLSX-G04 | CJK date format standard/stream | Pass | Pass | Pass |
BM-XLSX-G03 | Strict Open XML date parsing | Pass | Pass | Not run |
BM-XLSX-H01 | Streaming dates | Pass | Pass | Pass |
BM-XLSX-H02 | Streaming rich text | Pass | Pass | Pass |
BM-XLSX-H03 | Streaming shared strings | Pass | Pass | Pass |
BM-XLSX-H04 | Streaming 100K memory | Pass | Pass | Not run |
BM-XLSX-I01 | Template named-range injection | Pass | Pass | Not run |
BM-XLSX-I02 | Template explicit-cell injection | Pass | Pass | Not run |
BM-XLSX-I03 | Template row expansion with formula shifting | Pass | Pass | Not run |
BM-XLSX-I04 | Template streaming assembly parity | Pass | Pass | Not run |
BM-XLSX-I05 | Template chart and table preservation | Pass | Pass | Not run |
BM-XLSX-J01 | 10 concurrent renders isolation | Pass | Not run | Not run |