You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The schema is required so empty streams and one-pass producers remain deterministic. Rows cross a
141
+
bounded channel and are disk-spooled before the blocking constant-memory writer runs. Producer
142
+
errors, cancellation, dropped futures, validation failures, and destination races leave an existing
143
+
target byte-identical or a missing target absent. `with_overwrite_file(true)` enables atomic
144
+
replacement. The returned count excludes the header.
145
+
128
146
## Borrowed Readers And Writers
129
147
130
148
Use visitor APIs for caller-owned `Read + Seek` sources without materializing all rows or transferring ownership:
@@ -573,7 +591,7 @@ Version 1 does not implement `@group`, `@if`, parametrized sheet cloning, `$=` f
573
591
-`MiniExcel::query()` and `query_as()` strictly stream worksheet XML from paths.
574
592
- Grouped analytics retain state proportional to distinct groups and stop at `max_groups`.
575
593
- RAG exports never recalculate formulas and reject hidden sheets unless explicitly allowed.
576
-
- Synchronous streaming queries use one worker thread per active query. Optional async query and Insert APIs use bounded channels around blocking XLSX workers; ZIP/XML/filesystem work is not async I/O.
594
+
- Synchronous streaming queries use one worker thread per active query. Optional async query, explicit-schema export, and Insert APIs use bounded channels around blocking XLSX workers; ZIP/XML/filesystem work is not async I/O.
577
595
- Save creates new workbooks and refuses existing target paths by default. `MiniExcel::insert*()` atomically appends or strictly replaces a worksheet in an existing `.xlsx` path, or creates a workbook when the path is missing. `copy_and_add_sheet*()` creates a validated source-derived destination. `rename_sheet()`, `set_sheet_visibility()`, and `reorder_sheet()` atomically change existing workbook sheet metadata.
Copy file name to clipboardExpand all lines: docs/compatibility.md
+3-1Lines changed: 3 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -55,6 +55,7 @@ The latest `calamine 0.36` and `rust_xlsxwriter 0.97` require Rust 1.88. The MVP
55
55
|`InsertSheet` append/replace |`insert()` / `insert_with_schema()` / `insert_serialized()` / borrowed reader-to-writer variants | Path APIs are atomic; separate borrowed streams require an empty sink and preserve package behavior without atomic commit |
56
56
| Async Insert producer |`insert_with_schema_async*()`| Optional `async` feature; bounded producer channel with blocking XLSX work on a dedicated thread |
| Per-sheet visibility |`WriteOptions::with_sheet_visibility()`| Visible, hidden, and very hidden; first visible sheet is active |
59
60
|`overwriteFile`|`WriteOptions::with_overwrite_file()`| Defaults to `false`; existing paths require explicit opt-in |
60
61
|`FreezeRowCount` / `FreezeColumnCount`|`WriteOptions::with_freeze_row_count()` / `with_freeze_column_count()`| Defaults to one frozen row and zero frozen columns |
@@ -184,6 +185,7 @@ The contract covers only the current common surface: dynamic/typed path queries,
184
185
| Addressed JSONL/Markdown/manifest RAG export | Rust research extension | No |
| DataReader and broader stream ownership | Deferred | No |
188
190
| Append worksheet to existing `.xlsx` workbook | Implemented and atomically committed | Rust tests; shared parity contract not yet extended |
189
191
| Strict worksheet replacement | Implemented for plain targets and supported target-owned closures | Rust tests; stale calcChain removed and full recalculation requested |
@@ -198,4 +200,4 @@ This matrix is the coverage claim: Rust does not yet provide complete API parity
198
200
199
201
## Deferred Work
200
202
201
-
SQL text parsing, `HAVING`, `ORDER BY`, joins, windows, pivots, disk-spill aggregation, vector indexing, model calls, old Excel formats, advanced template directives and sheet cloning, image authoring, merged-cell APIs, formula calculation/dependency expansion, formula authoring, general styling, async export/template I/O, async borrowed readers, and borrowed XLSX lazy readers require separate design and acceptance milestones. CSV DataReader/DataTable adapters are intentionally replaced by Rust iterators, and a one-call CSV/XLSX converter is not exposed; callers compose query and save APIs. See the [Insert migration guide](insert-v1-migration.md) for supported workflows and deliberate differences.
203
+
SQL text parsing, `HAVING`, `ORDER BY`, joins, windows, pivots, disk-spill aggregation, vector indexing, model calls, old Excel formats, advanced template directives and sheet cloning, image authoring, merged-cell APIs, formula calculation/dependency expansion, formula authoring, general styling, async template I/O, inferred/typed async export sources, async borrowed readers/writers, and borrowed XLSX lazy readers require separate design and acceptance milestones. CSV DataReader/DataTable adapters are intentionally replaced by Rust iterators, and a one-call CSV/XLSX converter is not exposed; callers compose query and save APIs. See the [Insert migration guide](insert-v1-migration.md) for supported workflows and deliberate differences.
The comparison uses the .NET public APIs, their controlling implementations, and focused tests under the sibling `../MiniExcel` checkout. Rust status is based on the public `MiniExcel` facade, options, integration tests, and [compatibility boundary](compatibility.md).
| Named tables | Implemented | Dynamic/typed path queries, byte queries, and borrowed-reader visitors use table metadata headers and bounds with case-insensitive table-name matching. |
32
32
| DataReader and DataTable | Different by design | Rust exposes iterators and borrowed visitors instead of .NET tabular interfaces. A Rust-native Arrow/record-batch adapter is deferred until a concrete integration requires it and does not block parity completion. |
33
33
| Caller-owned streams | Partial | Borrowed synchronous dynamic/typed/structured visitors, metadata reads, dynamic/schema/typed/multi-sheet writers, and separate reader-to-writer Insert are implemented with leave-open semantics. Borrowed lazy iterators, borrowed async streams, and template streams remain unsupported. |
34
-
| Async and cancellation | Partial | Optional runtime-neutral dynamic/Serde path queriesand explicit-schema Insert support bounded streams and cooperative cancellation. Async export/template operations, async write sources, borrowed async readers, and progress callbacks remain unsupported. ZIP and filesystem work remains blocking on dedicated workers. |
34
+
| Async and cancellation | Partial | Optional runtime-neutral dynamic/Serde path queries, explicit-schema path export, and explicit-schema Insert support bounded streams and cooperative cancellation. Async template operations, inferred/typed async write sources, borrowed async I/O, and progress callbacks remain unsupported. ZIP and filesystem work remains blocking on dedicated workers. |
35
35
| General save inputs | Partial | Export from general objects/enumerables, dictionaries, `DataTable`, `IDataReader`, and async enumerables, with progress. Rust accepts dynamic or same-type Serde slices and reports per-sheet row counts. |
36
36
| Multi-sheet export | Partial | Rust creates ordered visible, hidden, and very-hidden worksheets, but does not yet accept heterogeneous Serde row types in one call. |
37
37
| Existing-workbook operations | Implemented | Rust atomically appends, strictly replaces, renames, changes visibility, reorders, and performs .NET-style source-workbook copy-and-add while preserving unrelated package parts and worksheet identity. Rename preserves formula text; visibility rejects hiding the final visible sheet; reorder remaps active/view/local-name indices; copy-and-add preserves the source and atomically publishes a separate destination. |
| DataReader/DataTable | Rust iterators and borrowed visitors are the native abstraction; no literal .NET tabular adapter is planned |`OpenXmlImporter.GetDataReader`, `GetAsyncDataReader`, `QueryAsDataTableAsync`; `tests/MiniExcel.OpenXml.Tests/DataReader/`|
@@ -66,7 +67,7 @@ The .NET APIs marked with `Async` also have generated synchronous counterparts t
66
67
67
68
## Suggested Implementation Order
68
69
69
-
1.**Async export/template APIs**: extend runtime-neutral producer/cancellation patterns without presenting blocking ZIP work as async I/O.
70
+
1.**Async template and broader export APIs**: extend runtime-neutral cancellation to templates and typed/inferred producers without presenting blocking ZIP work as async I/O.
70
71
2.**Advanced templates and Fluent Mapping**: add grouped/conditional templates, parametrized sheets, and mapping through separate compatibility milestones.
71
72
3.**Selected-sheet cloning**: not part of .NET `CopyAndAddSheet`; add only for a concrete Rust use case with a relationship-closure cloning contract.
0 commit comments