Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Changelog

ABCrimson edited this page Mar 3, 2026 · 18 revisions

Changelog

v0.5.1 — Audit Patch (2026年03月03日)

Critical bug fixes found during comprehensive codebase audit.

Bug Fixes

  • Image embedding brokengenerateDrawingXml rId off-by-one causing images to silently fail
  • Frozen panes: wrong activePane — column-only freeze wrote "bottomLeft" instead of "topRight"
  • Invalid JSON for NaN/Infinitywrite_f64_json now writes null instead of crashing JSON.parse
  • Custom numFmt ID collisionresolveNumFmtId now always assigns IDs >= 164 per ECMA-376

Performance

  • HashMap::with_capacity in ZIP reader
  • col_index_to_letter delegates to optimized col_to_letters
  • TextEncoder hoisted to module-level constant

v0.5.0 — Tables, Print Layout & Parity Sprint (2026年03月03日)

Closed 7 SheetJS advantage categories + added native Excel Tables, headers/footers, row/column grouping, and print layout. 704 tests (217 Rust + 487 TypeScript).

Cell Reference Utilities

  • encodeRow() — convert 0-based row index to 1-based string
  • decodeRow() — convert 1-based row string to 0-based index
  • splitCellRef() — decompose $A1ドル into { col, row, absCol, absRow }

Document Properties

  • appVersion — roundtrip <AppVersion> from app.xml
  • hyperlinkBase — roundtrip <HyperlinkBase> from app.xml
  • revision — roundtrip <cp:revision> from core.xml
  • application, company, manager — now fully parsed and written

Sheet Conversion Utilities

  • sheetToTxt() — tab-separated text output (reuses CSV engine with \t delimiter)
  • sheetToFormulae() — extract all cell values and formulas as ["A1=100", "A3='SUM(A1:A2)"]

Number Formatting

  • Conditional sections — parse [>100]#,##0;[<=100]0.00 with condition evaluation
  • Bracket color codes — extract [Red], [Blue], [Color3][Color56] from format strings
  • formatCellRich() — returns { text, color } with color metadata
  • loadFormat() — register custom format code at runtime
  • loadFormatTable() — bulk-register format codes by ID

Worksheet Operations

  • ws.usedRange — computed getter returning cell extent (e.g., "B2:D5") or null
  • ws.tabColor — getter/setter for sheet tab RGB hex color, roundtrips through WASM

Cell Operations

  • cell.numberFormat — resolves style index → numFmtId → format code string
  • cell.dateValue — returns Date if cell contains a date-formatted number
  • Stub cell type'stub' in CellType union for explicitly empty cells (SheetJS type "z")

Formulas

  • dynamicArray — roundtrip cm="1" attribute on <f> element for SPILL/dynamic array formulas

Scorecard Changes (v0.4.0 → v0.5.0)

Category v0.4.0 v0.5.0
Worksheet operations Tie modern-xlsx wins
Cell operations Tie modern-xlsx wins
Formulas Tie modern-xlsx wins
Document properties SheetJS wins modern-xlsx wins
Cell ref utilities SheetJS wins Tie
Number formatting SheetJS wins modern-xlsx wins
Sheet conversion SheetJS wins SheetJS (gap narrowed)

Excel Tables (ListObjects)

  • Full OOXML Table read/write — native xl/tables/table{n}.xml support with SAX parser and XML writer
  • ws.tables — getter returning all tables on a worksheet
  • ws.getTable(name) — find table by name
  • ws.addTable(opts) — create table with name, ref, columns, style, totalsRow, autoFilter
  • ws.removeTable(name) — delete table by name
  • 60 built-in table stylesTABLE_STYLES.light (1-21), .medium (1-28), .dark (1-11)
  • VALID_TABLE_STYLES — ReadonlySet for style name validation
  • TotalsRowFunction — type for totals row calculations (sum, count, average, etc.)

Headers & Footers

  • ws.headerFooter — getter/setter for HeaderFooterData with odd/even/first header/footer
  • HeaderFooterBuilder — fluent builder with left(), center(), right(), build()
  • Static formatting helperspageNumber(), totalPages(), date(), time(), fileName(), sheetName(), filePath()
  • Text formattingbold(), italic(), underline(), strikethrough(), fontSize(), fontName(), color()

Row & Column Grouping

  • ws.groupRows(start, end, level?) — set outline level (0-7) on row range
  • ws.ungroupRows(start, end) — remove outline level from rows
  • ws.collapseRows(start, end) — collapse grouped rows
  • ws.expandRows(start, end) — expand collapsed rows
  • ws.groupColumns(start, end, level?) — set outline level on column range
  • ws.ungroupColumns(start, end) — remove outline level from columns
  • ws.outlineProperties — getter/setter for summary row/column position

Print Titles & Print Areas

  • wb.setPrintTitles(sheet, opts) — set repeating rows/columns via _xlnm.Print_Titles defined name
  • wb.getPrintTitles(sheet) — get current print title configuration
  • wb.setPrintArea(sheet, area) — set print area via _xlnm.Print_Area defined name
  • wb.getPrintArea(sheet) — get current print area

v0.4.0 — Table Layout Engine (2026年03月02日)

Declarative table generation API with styled headers, zebra striping, auto-width, merge cells, and multi-table composition. Critical bug fixes across WASM init, writer performance, and sheet conversion utilities.

Table Layout Engine

  • drawTable(wb, ws, opts) — generate styled XLSX tables from declarative options, no manual cell coordinate math
  • drawTableFromData(wb, ws, data, opts?) — create tables from JSON arrays with auto-extracted headers and headerMap display names
  • Header styling — customizable font, background color, and alignment with sensible defaults (bold white on #4472C4)
  • Body styling — zebra striping via alternateRowColor, configurable borders, font, and alignment
  • Auto-width — content-aware column width calculation with CJK double-width character support
  • Per-cell style overridescellStyles map with "row,col" keys for targeted formatting on top of base styles
  • Merge cells — row and column spanning via merges array (0-based, relative to data area)
  • Column definitionsTableColumn with per-column width, alignment, and number format (e.g. '$#,##0.00')
  • Freeze headerfreezeHeader: true freezes the header row for scrolling
  • Auto-filterautoFilter: true adds filter dropdown arrows to header cells
  • Nested composition — use TableResult.lastDataRow to stack tables vertically with gap rows
  • Side-by-side composition — use origin column offsets to place tables horizontally

Bug Fixes

  • jsonToSheet startColwriteDataRow now respects the startCol parameter instead of ignoring it
  • resolveNumFmtId sort assumption — no longer assumes the numFmt array is sorted, uses correct lookup
  • initWasmSync race condition — concurrent initWasm calls no longer conflict with synchronous initialization
  • frozenPane field names — table engine uses correct rows/cols field names for frozen pane data
  • WASM reader HashSet rebuild — eliminated unnecessary HashSet reconstruction on every read operation
  • Comments clone — removed avoidable .clone() in comments path handling
  • Writer insert shift — replaced Vec::insert(0, ...) O(n) shift with efficient prepend pattern

Documentation Fixes

  • columnToLetter / letterToColumn — corrected examples that used wrong indices
  • serialToDate — fixed example showing wrong return type
  • addValidation — corrected example using wrong field name
  • Rich text — fixed example that accessed private fields

v0.3.0 — Barcode & QR Code Generation (2026年03月02日)

Pure TypeScript barcode/QR generation with 9 formats, PNG renderer, and XLSX embedding. Full codebase audit with critical bug fixes. 437 tests (157 Rust + 280 TypeScript).

Barcode & QR Generation

  • 9 barcode formats — Code 39, Code 128, EAN-13, UPC-A, ITF-14, GS1-128, QR Code, Data Matrix, PDF417
  • renderBarcodePNG() — pure TypeScript PNG renderer (no external dependencies)
  • generateBarcode() — one-call XLSX embedding with drawing XML and relationships
  • generateDrawingXml() / generateDrawingRels() — low-level drawing XML generation
  • Multi-image accumulation — multiple images per sheet without data loss

Critical Bug Fixes

  • Unicode panicvalidate.rs byte-indexing multi-byte characters → chars().take(n).collect()
  • Multi-image data lossaddImage() now accumulates via Maps instead of overwriting drawing XML
  • SST insert performance — Entry API replaces double hash lookup in shared_strings.rs
  • Comments author dedup — Entry::Vacant pattern eliminates double lookup in comments.rs
  • DXF diagonal attrs — eliminated redundant UTF-8 decoding in styles.rs

Performance

  • GF(256) lookup tables hoisted to module-level constants (Data Matrix encoder)
  • Array.prototype.at(-1) for O(1) sorted-array access (utils.ts, style-builder.ts)
  • split_once(':') replaces split(':').collect::<Vec<>>() in validators
  • Single TextEncoder instance in QR encoder (was creating two)

Documentation

  • All docs updated for v0.3.0 accuracy
  • Barcode generation examples in playground
  • Migration guides updated with barcode comparison

v0.2.0 — Browser & CDN Distribution (2026年03月02日)

Browser-first release with IIFE bundle, CDN distribution, Web Worker support, and framework examples. 419 tests (171 Rust + 248 TypeScript).

Browser Bundle

  • IIFE build — self-contained modern-xlsx.min.js (~29 KB) exposing window.ModernXlsx
  • CDN distribution — available on jsDelivr and unpkg, no bundler required
  • detectWasmUrl() — auto-detection of WASM binary URL from document.currentScript.src
  • initWasmSync(module) — synchronous WASM initialization from pre-loaded buffer
  • ensureReady() — lazy auto-initialization on first use (cached Promise pattern)
  • Source maps.map files generated for all build outputs (ESM, IIFE, Worker)

Web Worker

  • createXlsxWorker() — off-thread XLSX read/write via Web Worker message passing
  • modern-xlsx.worker.js — dedicated worker script with auto WASM init
  • Transferable buffers — zero-copy transfer of Uint8Array results back to main thread

Build Pipeline

  • tsdown 3-build config — ESM (primary), IIFE (browser), Worker (off-thread)
  • Package exports"." (ESM), "./browser" (IIFE), "./worker" (Worker script)
  • browser / unpkg / jsdelivr fields in package.json for CDN auto-resolution

Playground

  • Interactive browser playground at docs/site/playground.html
  • 6 built-in examples: Hello World, Styled Workbook, Read & Inspect, Batch Data, JSON to Sheet, Formulas & Dates
  • Live WASM status indicator, Ctrl+Enter execution, download integration

Framework Examples

  • React — hooks-based integration with useEffect WASM init
  • Vue 3 — Composition API with onMounted WASM init
  • Svelte 5$effect rune-based WASM init
  • Angular — service-based WASM init with standalone components

Edge Runtime Examples

  • Cloudflare Workers — XLSX generation at the edge
  • Deno Deploy — server-side XLSX with Deno-native imports
  • Service Worker — offline XLSX generation with custom WASM URL

v0.1.9 — Hardening & Performance Audit (2026年03月02日)

Complete 0.1.x hardening series. 419 tests (171 Rust + 248 TypeScript).

Tests (+77 new)

  • Style roundtrip: gradient fills, diagonal borders, DXF styles, cell named styles
  • Formula metadata: array formulas, shared formulas, formulaRef, sharedIndex
  • Feature roundtrip: hyperlinks, comments, data validation, conditional formatting, sheet protection, page setup
  • Edge cases: empty workbooks, malformed XML, boundary values
  • Error handling: corrupted files, invalid inputs, graceful degradation
  • Streaming & benchmarks: 100K row read/write, parallel parsing, buffer scaling
  • Utilities: cell refs, dates, format codes, CSV/HTML/JSON conversion

Performance (Rust Core)

  • push_entity() — zero-allocation XML entity resolution
  • Vec::with_capacity() on all XML parse buffers (11 sites)
  • from_utf8().unwrap_or_default() replaces from_utf8_lossy() (6 sites)
  • entries.remove() in StreamingReader — moves data instead of cloning
  • drain() in collect_preserved() — moves preserved entries
  • #[non_exhaustive] on error enum

TypeScript

  • Module-scoped CELL_REF_RE regex (hoisted from hot loop)
  • isolatedDeclarations: true in tsconfig
  • Shared WASM init via __tests__/setup.ts

Documentation

  • Migration guide: SheetJS
  • Migration guide: ExcelJS
  • Usage examples cookbook
  • Release roadmap

CI

  • GitHub Actions pinned to stable versions
  • Rust toolchain: @stable
  • Node.js engine: >=24.0.0

v0.1.0 — Initial Release (2026年03月02日)

First public release.

Features

  • Full XLSX read/write with Rust WASM core
  • Cell styling — fonts, fills, borders, alignment, number formats via StyleBuilder
  • Data validation — list, number, date, text length, custom formula
  • Conditional formatting — color scales, data bars, icon sets, formula-based rules
  • Frozen panes, hyperlinks, comments, sheet protection, page setup
  • Rich text with RichTextBuilder
  • Named ranges, document properties, workbook views, calc chain
  • Streaming reader/writer for large files
  • Parallel sheet parsing (rayon)
  • Cell reference utilities, date utilities, format utilities
  • Sheet conversion utilities (JSON, CSV, HTML, array-of-arrays)
  • Browser Blob download support
  • 342 tests (170 Rust + 172 TypeScript)

Performance

Operation modern-xlsx SheetJS CE Factor
Read 100K 1,155 ms 4,927 ms 4.3x faster
Write 100K 5,048 ms 5,048 ms 1.0x
sheetToJson 10K 54 ms 103 ms 1.9x faster

Clone this wiki locally

AltStyle によって変換されたページ (->オリジナル) /