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_closefor typed
reads, andxl_parse_arrow_streamover the Arrow C stream interface.- Python:
Workbook.iter_parse_typed,to_record_batch_reader, plusiter_pandasand
iter_polars. - C++:
xl::typed_reader<T>andxl::arrow_stream<T>. - Rust:
Workbook::typed_chunksandarrow::parse_arrow_stream(behind thearrow
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_sizemeans, and what invalidates a live reader. - Python:
-
find_package(excelreader)for the C++ package —cmake --installnow 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 existingFetchContentroute is
unchanged, and the install rules stay off whencppis 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, andxl_typed_reader_openzeroes*out_readeron 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. OpenTransientfault 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_pandasgot its own pyarrow guard, andsplit_blocksis 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_arrownow 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