[Unreleased]
[0.1.14] - 2026-10-10
Added
-
Non-self-closing
<sheet>and<xf>tag compatibility: Verify and support spreadsheet XML where<sheet>...</sheet>inworkbook.xmlor<xf>...</xf>instyles.xmlare serialized with explicit closing tags rather than self-closing syntax. -
Namespace prefix resilience for relationship and embed attributes: Match relationship and embed attributes by local name or any namespace prefix (
r:id,d3p1:id,rel:id,id,r:embed,embed) acrossWorkbookListener,HyperlinksListener,DrawingListener, andWorksheetParser, ensuring reliable sheet, hyperlink, and media resolution for non-standard XML generators. -
UTF-16LE, UTF-16BE, and UTF-8 BOM encoding normalization in
ZipReader: Automatically detect and transcode Byte Order Mark (BOM) encoded XML streams (\xFF\xFE,\xFE\xFF, and\xEF\xBB\xBF) to UTF-8 inZipReader#read_entryandEntryStreamIO, enabling seamless parsing of workbooks generated on Windows Phone and legacy platforms. -
XML 1.0 line ending normalization (
\r\nand\rto\n): Normalize line breaks in shared strings, inline strings, and cell text values per W3C XML 1.0 §2.11 acrossSharedStringsParserandWorksheetParser. -
Whitespace and newline tolerance in cell regex scanning: Allow whitespace and newline sequences between
<c>child tags (<f>,<v>,<is>) and strip whitespace on extracted values inWorksheetParser, ensuring reliable parsing of pretty-printed or formatted worksheet XML. -
Sequential row index fallback for omitted
rattributes: Track previous row index and fall back to sequential 1-based indexing when<row>elements omit therattribute per ECMA-376 Part 1 §18.3.1.73 across direct string scanning, chunked stream scanning, and event scanning inWorksheetParser. -
Case-insensitive part name lookup in
ZipReader: Fall back to case-insensitive lookup for package part entries per ECMA-376 Part 2 §8.1.1, allowing workbooks with case-varying part names (such as lower-casexl/sharedstrings.xmlorxl/styles.xml) to resolve transparently. -
Windows backslash path separator normalization in
ZipReader: Normalize Windows backslash separators (\) in ZIP central directory and local headers to standard forward slashes (/), enabling transparent extraction and catalog lookup for XLSX archives generated on Windows. -
First-class sparkline groups on worksheet and
add_sparklinehelper: Exposesparkline_groupsreader and keyword argument onElements::Worksheet, propagatews.sparkline_groupsduringXlsxrb.writeDOM serialization, and addadd_sparkline(location:, range:, type:, **opts)helper toWorksheetBuilder,StreamWriter, andStreamWriter::SheetContextsupporting:win_lossmapping to"stacked". -
High-level print area and print titles DSL: Add
print_area,print_titles,repeat_rows, andrepeat_columnstoWorksheetBuilder,StreamWriter::SheetContext, andStreamWriter, exposeprint_areaandprint_titlesonElements::Worksheet, and auto-generate_xlnm.Print_Areaand_xlnm.Print_Titlesdefined names inWorkbookBuilder#buildandXlsxrb.writeDOM export. -
ECMA-376 indexed color palette and
Xlsxrb::Colors: AddXlsxrb::ColorsprovidingINDEXED_COLORS(indices 0..63 per ECMA-376 Part 4 §18.8.27),palette_color, andto_hexutilities, exposeXlsxrb.palette_colorandXlsxrb.to_hex_colorfacade methods, and resolve integer palette indices 0..63 automatically inStyleBuilder.resolve_color. -
Flexible rich text run input in
Xlsxrb.rich_text: Support[text, font_hash]pair arrays, alternating varargs of plain strings and format hashes or objects responding toto_font_hash, and mixedElements::RichTextRuninstances. -
First-class
Elements::Hyperlink,Xlsxrb.hyperlink, andCell#tooltip: AddElements::Hyperlinkdata class andXlsxrb.hyperlinkfactory helper withtooltip:support, exposeCell#tooltipand:tooltip,:urlsymbol key access onElements::Cell, and supportElements::Hyperlinkinstances inWorksheetBuilder#hyperlink,StreamWriter#hyperlink, andOoxml::Writer#hyperlink. -
Array and dynamic array formula serialization and
Xlsxrb.array_formula: AddXlsxrb.array_formula(expression, ref, cached_value:)factory method, extendXlsxrb.formulawith optionaltype:andref:keywords, and serialize<f t="array" ref="...">and shared formula attributes across allWorksheetWriterserialization paths. -
First-class
style_index:keyword onElements::Column: Addstyle_index:keyword argument directly toElements::Column.new, storing it inData.defineattributes and populating it fromrc[:style_index]during worksheet parsing and DSL column definitions. -
In-memory streaming write and row append chaining: Support
Xlsxrb.writewith omitted target in block mode to return an in-memory binary String, support self-returning<<row appending for chaining acrossStreamWriter,SheetContext, andWorksheetBuilder, and addadd_rowaliases. -
Unified color and border style normalizers in
StyleBuilder: AddStyleBuilder.normalize_color(supporting 140+ CSS named colors,#RGB,#RRGGBB,#AARRGGBBhex strings, numeric RGB integers, and optional alpha channel) andStyleBuilder.normalize_border_style(supporting border style symbols, aliases, strings, and 0..13 numeric border indices). -
Public date and time serial conversion utilities: Expose
date_to_serial,serial_to_date,datetime_to_serial, andserial_to_time(aliasedserial_to_datetime) onXlsxrbandXlsxrb::Utilsfor converting RubyDateandTimeinstances to and from Excel 1900 and 1904 serial numbers. -
Cascade style inheritance and column styles: Support cascade style inheritance (Cell Style > Row Style > Column Style) in
WorksheetWriter, and addstyle:parameter toStreamWriter#columnandWorksheetBuilder#column. -
Embedded drawing and image extraction: Add
Elements::Imagerepresenting anchored embedded images, exposeimages,images_at, andwith_imagesacrossStreamSheetandElements::Worksheet, and exposeimagesandimages_atacrossElements::Workbook. -
Configurable sparse vs padded row and cell iteration: Add
pad_empty_rowsandpad_empty_cellsoptions toXlsxrb.read,Xlsxrb.build_worksheet,StreamSheet,WorksheetParser.each_row, andElements::Worksheetto pad skipped rows or missing cells up to the maximum column, and addStreamRow#to_handElements::Row#cells_hashfor coordinate-keyed row maps. -
Row XML metadata accessors and serialization: Expose row XML metadata (
collapsed,collapsed?,hidden?,custom_height?,attributes) onStreamRowandElements::Row, supportcollapsed:inStreamWriter#rowandWorksheetBuilder#row, and serializecollapsed="1"inWorksheetWriter. -
Format classification helpers: Add
Elements::Styles#format_code_forand#classification_foraliases, allowNumberFormatterformat predicates (date_format?,time_format?, etc.) to resolve built-in formats bynum_fmt_id, and exposeformat_type,date_format?, andtime_format?onElements::Cell. -
Date1904 accessor: Expose
Ooxml::Reader#date1904?and adddate1904:keyword argument toElements::Workbook#initialize. -
Coordinate utilities module: Add
Xlsxrb::Utilsexposing public coordinate helpers (ref_to_row_col,row_col_to_ref,col_name_to_index,col_index_to_name,split_coordinate). -
Configurable trailing empty row trimming: Add
trim_empty_rowsoption acrossXlsxrb.read,Xlsxrb.build_worksheet,WorksheetParser.each_row,StreamSheet#initialize,StreamSheet#each_row,StreamSheet#each_row_values,StreamSheet#each,Elements::Worksheet#initialize,Elements::Worksheet#each_row, andElements::Worksheet#each_row_valuesto omit trailing empty rows, and addempty?predicate toStreamRowandElements::Row. -
Direct typed values streaming iterator: Add
StreamSheet#each_row_valuesandElements::Worksheet#each_row_valuesto stream row values directly as Arrays without allocatingElements::Cellobjects, and addtype_cast: truesupport acrossStreamSheet#each_row_values,Elements::Worksheet#each_row_values,StreamRow#values, andElements::Row#valuesto coerce date/time serial numbers intoDateandTimeinstances. -
Precomputed number format classifications in Styles: Add
Xlsxrb::Elements::Styles(subclass ofHash) with precomputed $O(1)$ format classification lookups (number_format,format_type,date_format?,datetime_format?,time_format?,date_only_format?), updateStylesParser.parseto returnElements::Styles, and add classification helper methods toXlsxrb::NumberFormatter. -
Worksheet dimension and coordinate bounds: Expose
dimension,first_row,first_column(aliasedfirst_col),last_row, andlast_column(aliasedlast_col) onStreamSheetandElements::Worksheet(andElements::CoordinateAccess), lazily extracting<dimension ref="..."/>in $O(1)$ memory without scanning the full sheet. -
Date1904 propagation to streaming sheets and rows: Propagate the workbook’s 1904 date system flag to
StreamSheetandStreamRow, exposedate1904?onStreamSheet,StreamRow,Elements::Worksheet, andElements::Cell, and defaultCell#to_dateandCell#to_timeto the cell’sdate1904setting. -
Elements::RichTextRun: AddRichTextRundata class representing formatted text runs withinRichText, supporting hash-like bracket access and seamless integration withXlsxrb.rich_text. -
First-class conditional formatting and data validation on
Elements::Worksheet: Exposeconditional_formatting(and aliasconditional_formats) anddata_validationsas first-class fields onElements::Worksheet, populate them during round-trip parsing inXlsxrb.build_worksheet, and serialize them in in-memory workbook serialization. -
Date1904 calendar system arithmetic: Support the 1904 date system (1904-01-01 base epoch) across serial date conversions,
Cell#to_date,Cell#to_time,Elements::Workbook#date1904?,Ooxml::Reader,Ooxml::WorksheetWriter,Ooxml::WorkbookWriter, andStreamWriter. -
Row and column styles persistence: Expose
style_indexonRow,Column, andStreamRow, and persist row and column styles (<row s="..." customFormat="1">and<col style="..."/>) during serialization and round-trip parsing. -
Styles metadata persistence: Support border colors, cell alignment, and protection attributes in stylesheet generation and round-trip parsing.
-
Dual format support for
num_fmts: Support bothHash({ 164 => "format" }) andArray([{ num_fmt_id: 164, format_code: "format" }]) structures for custom number formats inWorkbookWriter. -
Initial shared strings table seeding: Support pre-seeding
sstinXlsxrb.writewhenworkbook.shared_stringsis provided. -
Sheet visibility state: Support worksheet visibility state (
state,hidden?,visible?) acrossStreamSheet,Elements::Worksheet,WorkbookParser,WorkbookBuilder, andWorkbookWriter, preserving:visible,:hidden, and:very_hiddenvisibility in streaming read, in-memory representations, and XML serialization. -
Workbook defined names: Parse
<definedNames>inWorkbookParserand exposedefined_namesarray anddefined_name(name, sheet: nil)lookup onElements::Workbook, supporting global and sheet-scoped named ranges and formula constants. -
Cell formula query and expression methods: Expose
formula?predicate andformula_expressionstring accessor onElements::Cell, and normalize empty formula expressions tonilin streaming and DOM cell parsing. -
Worksheet and cell hyperlinks: Parse and expose hyperlink metadata across
StreamSheet#hyperlinks,Elements::Worksheet#hyperlinks, andElements::Cell#hyperlink,#link?, and#url, supporting external targets and internal sheet references in streaming read, DOM models, and builders. -
Worksheet and cell comments: Parse and expose comment and note metadata across
StreamSheet#comments,StreamSheet#comment,Elements::Worksheet#comments, andElements::Cell#comment,#comment?, and#comment_text, supporting comment annotations and coordinate lookups in streaming read, DOM models, and builders. -
Number formatting engine and extended cell metadata: Add
Xlsxrb::NumberFormattersupporting standard and custom OpenXML format codes (currencies, percentages, date/time, fixed-point padding, accounting patterns, scientific notation, and text), exposeformatted_value,raw_value, andformat_codeonElements::Cell, addformatted_valuecoordinate lookups onElements::Worksheet,StreamSheet, andElements::Workbook, and exposeraw_values,formatted_values, andformulasmetadata onElements::RowandStreamRow. -
Fallback serialization for DOM model attributes: Support serializing first-class
ws.state,ws.comments,ws.hyperlinks, andworkbook.defined_namesinXlsxrb.write(workbook)when not explicitly packaged insideunmapped_data[:facade]metadata.
Changed
-
Optimize chunked streaming read performance: Hoist
</sheetData>tag lookup outside row iteration, eliminate byte delimiter array allocations, and terminate entry inflation early once worksheet rows are fully parsed, restoring streaming read throughput faster than in-memory read while preserving $O(1)$ memory consumption.
Fixed
-
Fallback cached value for formula cells: Emit
<v>0</v>instead of omitting<v>when a formula cell does not specify a cached value, ensuring compatibility with OpenXML parsers (such as Roo and LibreOffice) that discard formula cells lacking<v>elements. -
Shared formula cell parsing: Support self-closing formula tags (e.g.
<f t="shared" si="0"/>) inWorksheetParserregex scanners, preventing cells containing shared formulas from being silently omitted. -
Fixed missing
dcterms:createdanddcterms:modifiedserialization inWorkbookWritercore properties (docProps/core.xml). -
Prevent
Encoding::CompatibilityErrorinXlsxrb.readandCfb::Reader.cfb?when inspecting raw string buffers in UTF-8 encoding.
[0.1.13] - 2026-09-25
Added
-
Non-destructive template modification: Support modifying existing XLSX templates while preserving unmapped parts, media, charts, drawings, and VBA macros via
Xlsxrb.modify. -
StreamSheet structural metadata accessors: Expose
merged_cells,auto_filter,data_validations, andconditional_formatsonStreamSheet. -
Pre-Push Smart Change Detection: Optimized
bin/pre-push --allto automatically skip runtime RBS validation and pure logic mutation testing when unrelated files are modified, adding--lastand--forcecontrols.
Changed
-
True O(1) memory streaming read via chunked entry inflation in
ZipReaderandWorksheetParser, preventing unbounded memory retention on large worksheets. -
Extracted pure DSL normalizers (
Xlsxrb::DslHelpers) and fast XML unescape utilities (Ooxml::XmlBuilder.unescape). -
Constrained
rexmlruntime dependency to~> 3.0and excluded documentation, build assets, and developer configurations from the gem package.
Removed
-
OpenTelemetry runtime dependency and tracer spans.
[0.1.12] - 2026-09-20
Added
-
Mutation Testing Framework (
mutant): -
Full-scale integration of mutant test suite targeting the Functional Core (10 classes and modules, 38 subjects).
-
Achieved 100.00% Kill Rate (1,091 / 1,091 mutations killed, 0 alive) without exclusions.
-
Added dedicated root configuration
.mutant.ymlfor streamlined CLI execution (bundle exec mutant run -- '...'). -
Integrated
bundle exec rake mutant:pureinto GitHub Actions CI pipeline (main.yml), guaranteeing mutation-tested quality on every push and pull request. -
Added architecture and testing guide in
docs/MUTATION_TESTING.md. -
Pre-Push Quality Verification Script (
bin/pre-push): Added automated pre-push verification script running RuboCop, Steep type checking, RBS sync validation, Unit & Contract tests, RBS runtime type validation, and pure logic mutation testing, with automatic hook installation inbin/setup.
Changed
-
Functional Core & Imperative Shell Architecture:
-
Purified core business logic and domain entities into deterministic, side-effect-free class methods and predicates:
-
Extracted coordinate and validation predicates:
Elements::Cell.valid_value?,Cell.valid_coordinates?,Cell.calculate_column_letter,Cell.calculate_column_index. -
Extracted domain validation predicates:
Elements::Row.valid_index?,Elements::Column.valid_index?,Elements::Worksheet.valid_name?. -
Replaced date/time serial calculations in
Ooxml::Utilswith pure mathematical conversions (Julian Day math fordate_to_serial,divmodarithmetic forserial_to_datetime, and 1900 leap year bug handling). -
Extracted binary packing utilities in
Ooxml::ZipGenerator(le16,le32, and bitfield arithmetic fordos_datetime). -
Extracted pure XML character escaping logic in
Ooxml::XmlBuilder.escape.
-
-
Modularized
Ooxml::Writerinto domain-specific mixin modules (DrawingXml,FeaturesXml,StylesXml). -
Extracted shared DSL parameter normalization and range expansion into
Xlsxrb::DslHelpers. -
Modularized reader SAX listeners into domain-specific parser components.
Fixed
-
Boundary Validation & Error Reporting:
-
Strictly validate row number digits in
Elements::Cell.parse_refto reject malformed cell coordinate strings (e.g.A0,A01). -
Harmonized supported value type checks and nil/empty handling across
Elements::Cell.validate. -
Corrected maximum row index boundary error messages in
Elements::Row.validate. -
Hardened cryptographic stream boundary checks and corrupted header handling in Standard and Agile encryption modes.
-
RBS Runtime Type Validation:
-
Expanded
Elements::Workbook#initialize,#sheet, and[]type annotations to acceptStreamSheetinstances used by streaming readers. -
Made update block parameter optional in
Elements::Workbook#update_sheetto allow testing missing block validation. -
Supported
Numerictypes (Float and Integer) inChartBuilderandSeriesBuilderkwargs (width, etc.). -
Handled
RBS::Test::Tester::TypeErrorin unit tests verifying block return type validation.
[0.1.11] - 2026-08-19
Performance
-
Sub-Second Streaming Write (< 1.0s / 1,000,000 cells):
-
Achieved sub-second streaming write performance (0.97 s median for 1M cells) while maintaining 100% full SST (Shared String Table) XML deduplication and ISO/IEC 29500 compatibility.
-
Implemented 1-Pass Direct ZIP streaming pipeline, eliminating all intermediate tempfiles, disk seek-backs, and extra deflate flush cycles.
-
Added dedicated unstyled fast-path in
WorksheetWriter#write_row_valueswith precomputed coordinate and integer lookup tables. -
Pre-registered default date/time formatting styles, completely eliminating redundant per-row scan loops.
-
Streamlined
ZipWriterinstance variable lookups to eliminate per-chunk hash overhead. -
Added
alias << rowtoWorksheetProxyandStreamWriterfor idiomatic Ruby streaming. -
High-Speed Streaming Read (1.61s / 1,000,000 cells):
-
Reduced streaming read execution time from 3.40 s down to 1.61 s (over 2x speedup).
-
Refactored
Elements::Cellinto an optimized lightweight class withCell.fast_create, reducing 1M cell instantiation overhead by 5.2x (0.92s → 0.17s) while maintaining full pattern matching (deconstruct,deconstruct_keys) and immutability. -
Replaced per-byte Ruby scanning in
WorksheetParser.fast_scan_cells_directwith an Onigmo C-level regular expression scanner (CELL_FAST_RE), eliminating 100,000 intermediate XML substring allocations and nested byte loops. -
Optimized
StreamRow#cellsto populate cell arrays via direct block traversal, eliminating Enumerator object allocations.
Documentation
-
Updated benchmark results, performance comparisons, and linear-scale SVG charts across
README.mdanddocs/PEER_LIBRARIES.md.
[0.1.10] - 2026-08-19
Added
-
Peer Libraries Ecosystem Guide (docs/PEER_LIBRARIES.md): Introduced a respectful overview of the Ruby XLSX ecosystem featuring official self-descriptions, architectural tradeoffs (SST vs. Inline Strings, Streaming vs. In-Memory), and reproducible benchmarks across 9 popular Ruby XLSX gems.
-
Visual Assets & Screen Previews:
-
Embedded interactive WebAssembly Playground live demo preview in
README.md. -
Added real-world Ruby LSP autocompletion and RBS type hint preview in
README.md. -
Created accurate, neutral linear-scale SVG benchmark performance chart.
-
Multi-Layered Test Suite Expansion:
-
ECMA-376 XSD Schema Validation: XML schema validation suite ensuring strict element ordering and ISO/IEC 29500 compliance.
-
Contract Testing Suite: Parity verification between Streaming (
Xlsxrb.write) and In-Memory (Xlsxrb.build) APIs. -
Property-Based Testing (PBT): Expanded automated random generation tests for Row/Column invariants, styles, and edge cases.
-
Visual Regression Testing (VRT): Added new visual baselines for table styles, drawing shapes, and pivot tables.
-
E2E Interoperability Suite: Added tests for namespace-prefixed XML streaming, conditional formatting, and table structures.
Fixed
-
WebAssembly (ruby.wasm) Compatibility: Bundled
ppandprettyprintstandard libraries inruby.wasmpackage to resolve REXML LoadError during browser-based evaluation.
Changed
-
Streamlined README: Refactored README from 363 to 175 lines, focusing on core motivation, clean 4-column feature matrix, concise usage examples, and direct links to specialized documentation.
[0.1.9] - 2026-08-18
Added
-
Password Protection & Document Encryption ([MS-OFFCRYPTO] / [MS-CFB]): Full native Pure-Ruby support for reading, writing, and modifying password-protected Excel spreadsheets without any external C-extension dependencies.
-
Standard Encryption: AES-128-ECB and SHA-1 Key Derivation with CryptoAPI 50,000-spin hashing, fully interoperable across Microsoft Excel, LibreOffice, and Google Sheets.
-
Agile Encryption: Modern AES-256-CBC, PBKDF2/SHA-512, and HMAC-SHA512 data integrity verification.
-
Compound File Binary (CFB) Engine: Pure-Ruby reader and writer for OLE structured storage containers with Mini Stream, FAT/MiniFAT sectors, and Red-Black tree directory management.
-
Transparent Public API Integration: Added
password:andencryption_mode:arguments toXlsxrb.read,Xlsxrb.write, andXlsxrb.modify. -
Security & Threat Model Hardening:
-
Constant-time hash verification via
OpenSSL.secure_compareto prevent timing attacks (CWE-208). -
CSPRNG-backed salt, IV, and session key generation via
SecureRandom(CWE-330). -
DoS defense: spinCount limit ($\le 10\text{M}$), CFB circular sector chain loop detection in directory/FAT parsing, and
total_sizebounds validation (CWE-400, CWE-835). -
Strict exception hierarchy (
EncryptedFileError,InvalidPasswordError,DecryptionError).
-
-
Cross-Platform & Interoperability Validation: Bidirectional validation with Microsoft .NET OpenXML SDK and LibreOffice Calc.
-
WebAssembly (ruby.wasm) Support: Pre-packaged
docs/wasm/ruby.wasmupdated with document encryption support for browser playground.
[0.1.8] - 2026-08-18
Changed
-
Unified Symmetric Entrypoints: Consolidated reading into
Xlsxrb.read(supporting file path, IO, and raw binary string) and writing intoXlsxrb.write(supporting streaming blocks or in-memory Workbooks). Removed legacyopen,foreach, andgeneratemethods. -
Streaming-First Defaults:
Xlsxrb.readyields and returns lightweightStreamSheetinstances with $O(1)$ constant-memory consumption by default. -
Explicit In-Memory Materialization (
#load): Stripped accidental random-access memory traps fromStreamSheet; introduced explicitStreamSheet#load/Workbook#load(inspired by ActiveRecord Relations) to transition from lazy streaming to in-memoryElements::Worksheet/Elements::Workbook. -
CoordinateAccessModule: Extracted coordinate lookup methods ([],cell_value,row_at,first_row,last_row,cells,cells_hash) into a dedicatedXlsxrb::Elements::CoordinateAccessmixin module included inElements::Worksheet.
Added
-
Default Cell Streaming (
Xlsxrb::StreamRow): Enabled streaming along both row and cell dimensions viarow.each_cellandsheet.each_cell, parsing cells on-demand to handle sheets with thousands of columns in $O(1)$ constant memory.
[0.1.7] - 2026-08-16
Added
-
Bundled native Ruby LSP Add-on (
RubyLsp::Xlsxrb::Addon) for zero-configuration, context-aware method autocompletion and rich markdown documentation in VS Code and LSP-enabled editors for block arguments (wb.,s.,sheet.,stream_writer.,stream_sheet.). -
YARD documentation (
@param,@return,@example) across all public APIs, builders, proxies, and elements.
Developer Experience
-
Enhanced
rbs-inlinetype signatures across all facade methods and builder objects with automated RBS generation. -
Added VS Code Steep extension configuration for Dev Containers.
[0.1.6] - 2026-08-15
Added
-
Support for unseekable IO streams (pipes,
ActionDispatch::Response::Buffer, socket streams) across streaming reader and writer. -
Complete
rbs-inlinetype annotations across all library source files and automatedsig/generated/synchronization in CI. -
Automated Steep static type-checking workflow in GitHub Actions.
-
Hash-compatible symbol indexing in
Elements::Row#[](:cells,:index,:height,:attrs) andElements::Cell#[](:value,:ref,:style_index).
Performance
-
Streaming Write: Replaced per-cell micro IO calls with row-level string buffering and fast-path serialization for unstyled cells (1,000,000 cells in 1.62s with standard SST).
-
In-Memory Write: Optimized DOM serialization (
WorksheetWriter#write_row) with row-level buffer aggregation, boosting 1,000,000 cells write from 22.33s to 4.06s (5.5x faster) and reducing GC count by 83%. -
Streaming Read: Implemented zero-allocation byte scanning for cell attributes (
r="...",t="...",s="...") and direct integer conversion for SST indexes, cutting GC count by ~70% (129 -> 40) and boosting 1,000,000 cells read to 3.38s. -
In-Memory Read: Reduced peak memory footprint by 57% (582 MB -> 250 MB).
Documentation
-
Overhauled
benchmark.rbwithbundler/inlinefor deterministic, zero-setup benchmark reproduction pinning peer gem versions. -
Updated README.md Motivation and Benchmark tables with verified default vs optional string storage architecture (SST vs Inline) and latest 1,000,000 cells measurements.
[0.1.5] - 2026-08-11
Added
-
Functional API for updating existing files (
Xlsxrb.modify). -
New
Workbook#update_sheetandWorksheet#update_cellhelpers for immutable data structures. -
Syntactic sugar for
styles:insheet.rowusingHashandRangekeys (e.g.styles: { 0..4 => "header" }). -
Support for inline anonymous styles as Hash objects (e.g.
styles: { 0 => { font: { bold: true } } }). -
Support for
RangeandArrayarguments insheet.columnto modify multiple columns at once. -
WorkbookBuilder#[]andStreamWriter#[]aliased to#sheetfor elegant context switching. -
Block-based configuration for
fontandborderproperties insideStyleBuilder. -
Extensive inline RBS typing with strict generic types (eliminated
untypedfrom the public API). -
Full
RBS::Testruntime type validation enabled for the entire test suite. -
Extensive Excel limit warnings documented via YARD tags.
-
Formal SemVer API contract with
@api publictags for user-facing methods. -
Mutation testing (Mutant) and test coverage (SimpleCov) integrations.
Changed
-
Replaced
method_missingwith statically defined, fully typed methods inWorksheetProxy,ChartBuilder, andSeriesBuilder. -
Removed deprecated
instance_evalblock context for builders; explicit block arguments are now required. -
Hardened security and bounds checking across the DSL for
strict_excel_mode. -
Fixed numerous Rubocop linting violations and standardized style rules.
-
Add specification reference policy and implemented specification mapping (
docs/SPEC_SOURCES.md). -
Introduce unified event-based streaming and parsing architecture (
Ooxml::Eventand event streams for WorksheetParser/SharedStringsParser). -
Restructure test suite into four distinct tiers (Unit, Contract, E2E, Visual) and renamed
facade_test.rbtopublic_api_test.rb. -
Add visual examples gallery (
examples/visual/anddocs/visual/README.md) and promoted it via animated GIF in the main README. -
Implement visual regression testing (VRT) pipeline comparing generated sheets against reference baselines.
[0.1.0] - 2026-03-25
-
Initial release