Skip to content

v3.1.0

Latest

Choose a tag to compare

@GabrielMarquezMatte GabrielMarquezMatte released this 14 Sep 15:50
883df26

What's Changed

Added

  • Batch-at-a-time reads across the C ABI and all three bindings — a sheet no longer has
    to be materialized in one call, so peak memory is one batch instead of one sheet. New
    exports: xl_typed_reader_open/xl_typed_reader_next/xl_typed_reader_close for typed
    reads, and xl_parse_arrow_stream over the Arrow C stream interface.

    • Python: Workbook.iter_parse_typed, to_record_batch_reader, plus iter_pandas and
      iter_polars.
    • C++: xl::typed_reader<T> and xl::arrow_stream<T>.
    • Rust: Workbook::typed_chunks and arrow::parse_arrow_stream (behind the arrow
      feature).

    The .NET reader already streams row-by-row by construction and is unchanged. Each
    binding's README documents the semantics: one chunked read per workbook, what
    batch_size means, and what invalidates a live reader.

  • find_package(excelreader) for the C++ packagecmake --install now installs the
    headers, the native binary and a config package, so a downstream project can consume an
    install prefix instead of vendoring the repo. The existing FetchContent route is
    unchanged, and the install rules stay off when cpp is pulled in as a subproject.

  • Shared column style and width validation across the XLSX, XLSB and XLS sheet writers, so
    an invalid column definition is rejected the same way in all three.

Fixed

  • A second chunked read on the same workbook is now rejected instead of producing undefined
    results, and xl_typed_reader_open zeroes *out_reader on every failure path — a caller
    that checks the out-param rather than the return code can no longer read a stale pointer.
  • Guards against double-buffered batches and against use of an already-released Arrow
    stream; the Arrow stream's release, error and schema contracts were tightened to match
    what the C Data Interface requires.
  • OpenTransient fault ordering, and several inaccuracies in the native C header.
  • Agile encryption: the CBC path now verifies the transform consumed the whole segment
    instead of silently accepting a short read.
  • Python: iter_pandas got its own pyarrow guard, and split_blocks is pinned so the
    pandas conversion no longer depends on a pyarrow default that can change.

Performance

  • Agile package encryption reuses one CBC transform across segments instead of rebuilding
    it per segment.
  • xl_parse_arrow now routes through the same resumable session as the chunked path, with
    its memory ceiling pinned by the test suite.

No public .NET API changes in this release — PublicAPI.Shipped.txt is untouched across
ExcelReader.Core and ExcelReader.Arrow, both target frameworks. The C ABI only gains
exports; every existing one keeps its signature and behavior.

Full Changelog: v3.0.2...v3.1.0