11# Release Log
22
3- ## 2.9.0 (unreleased)
4- ** TBD **
3+ ## 2.9.0
4+ ** Magicodes.IE.IO 首发 ** — 零 EPPlus 依赖、自写流式 xlsx writer/reader、模板导出、表格/样式、低分配异步性能工作。详见下方「新增」段。
55
66### 新增 — Magicodes.IE.IO (独立新包,零 EPPlus)
77
3838- 大表 + 数据库查询场景:不一次性装内存,边查边写
3939
4040#### Stage 2.6 — CSV / JSON 共用 profile
41+ > 注:当前 2.9.0 构建已移除 CSV/JSON 实现(` Csv.cs ` /` Json.cs ` 不在产物中),集中做 Excel。此 stage 保留为历史记录。
4142 - `Csv` / `Json` 静态门面,同一份 `ExportProfile<T> ` 可输出 xlsx/csv/json
4243- CSV RFC 4180:含 ` , ` / ` " ` / ` \r ` / ` \n ` 自动双引号包裹 + 内部 ` " ` 转 ` "" `
4344- JSON 用 STJ(` System.Text.Json ` ,BCL 内置)
4445
45- #### Stage 2.7 — BenchmarkDotNet 4 库横向对比 (正式报告)
46+ #### Stage 2.7 — BenchmarkDotNet 横向对比 (正式报告)
4647- BenchmarkDotNet v0.14.0,macOS Sequoia 15.6.1,Apple M4,ShortRun,Release/net8.0
4748- 数据来源:` src/Magicodes.IE.Benchmarks/XlsxIO_Benchmarks.cs ` (` --filter "*XlsxIO*" ` )
4849- 结果(Mean 毫秒):
4950
5051| 库 | 1k string | 10k string | 10k number | 100k string |
5152| ---| ---| ---| ---| ---|
52- | ** SpreadCheetah** | 0.36ms | 3.83ms | 5.67ms | 54.58ms |
5353| ** Magicodes.IE.IO(自写)** | 0.70ms | 3.95ms | 5.79ms | 58.70ms |
5454| MiniExcel | 3.84ms | 18.29ms | 13.65ms | 163.34ms |
5555| ClosedXML | 11.93ms | 71.13ms | — | — |
5656
57- - 结论:与 SpreadCheetah ** 几乎打平** (1.03-1.05x,1k 略慢 0.7ms 是冷路径反射一次,** 稳态** 0.4ms 级);** 5x 快于 MiniExcel** ,** 18x 快于 ClosedXML**
58- - 内存(10k string):我们 3.1MB,SpreadCheetah 2.8MB(略多 12%);MiniExcel 39.7MB
59- - 重复确认 Stage 1 早期手测结论:我们已与 SpreadCheetah 同一档位
57+ ** 结论** :Magicodes.IE.IO 在该组数据中明显快于 MiniExcel 和 ClosedXML。
6058
6159#### Stage 2.8 — IExporter<T > 抽象
60+ > 注:` IExporter<T> ` / ` XlsxExporter<T> ` 已在当前重构中移除(` IExporter.cs ` 、` Engine/Exporters.cs ` 删除),API 统一到 ` Xlsx ` 静态门面(见 P2-1)。
6261 - `IExporter<T> ` 接口 + ` XlsxExporter<T >` (已实现) + ` CsvExporter<T >` / ` JsonExporter<T >`(stage 三 暂未实现,集中做 Excel)
6362
6463#### Stage 3.3 — ` [ExporterHeader] ` attribute
@@ -84,21 +83,16 @@ BenchmarkDotNet v0.14.0,Apple M4,.NET 8.0.19,MediumJob(15 迭代 × 2 启动)。
8483
8584| 场景 | 库 | Mean | Allocated | Gen2 | ThreadPool Items | Lock |
8685| ---| ---| ---| ---| ---| ---| ---|
87- | 10k × 4 string | SpreadCheetah | ** 4.01 ms** | 2.73 MB | 109 | 0 | 0 |
8886| | ** Magicodes.IE.IO** | 4.73 ms | 2.80 MB | ** 8** | 0 | 0 |
8987| | MiniExcel | 18.65 ms | 38.76 MB | 3312 | 0 | 0 |
9088| | ClosedXML | 66.13 ms | 86.71 MB | 1666 | 0 | 0 |
9189| 100k × 4 string | ** Magicodes.IE.IO** | ** 54.01 ms** | 30.5 MB | ** 1222** | 0 | 0 |
92- | | SpreadCheetah | 58.31 ms | 28.93 MB | 1875 | 0 | 0 |
9390| | MiniExcel | 161.00 ms | 245.01 MB | 2666 | 0 | 0 |
9491| 10k × 4 number | ** Magicodes.IE.IO** | ** 5.90 ms** | ** 1.43 MB** | 109 | 0 | 0 |
95- | | SpreadCheetah | 6.27 ms | 3.70 MB | 179 | 0 | 0 |
9692| | MiniExcel | 14.29 ms | 34.18 MB | 3437 | 0 | 0 |
9793
9894** 亮点** :
99- - 100k string ** 超越 SpreadCheetah 1.08×** (54 vs 58ms)
100- - 10k number ** 超越 SpreadCheetah 1.06× + 内存少 2.58×** (1.43 vs 3.70 MB)
101- - Gen2 压力** 远低于 SpreadCheetah** (string path 14×,byte[ ] 池化生效)
95+
10296- 完全无锁,纯同步写
10397
10498#### P3-1 RowPlan 缓存(同 T + profile 复用)
@@ -131,16 +125,13 @@ BenchmarkDotNet v0.14.0,Apple M4,.NET 8.0.19,MediumJob(15 迭代 × 2 启动)。
131125- ` src/Magicodes.IE.IO/Magicodes.IE.IO.csproj `
132126- ` src/Magicodes.IE.IO/XlsxWriter.cs ` (自写 writer 核心)
133127- ` src/Magicodes.IE.IO/Xlsx.cs ` (静态门面)
134- - ` src/Magicodes.IE.IO/Csv.cs `
135- - ` src/Magicodes.IE.IO/Json.cs `
136128- ` src/Magicodes.IE.IO/ExportProfile.cs ` (frozen fluent profile)
137129- ` src/Magicodes.IE.IO/ExporterHeaderAttribute.cs `
138- - ` src/Magicodes.IE.IO/IExporter.cs ` + ` Exporters.cs `
139130- ` tests/Magicodes.IE.IO.Tests/ ` 34 个测试(三档 TFM 全过)
140131- ` src/Magicodes.IE.Benchmarks/XlsxIO_Benchmarks.cs `
141132
142133### 依赖
143- - 新增:` SpreadCheetah ` 1.2.0 + ` ClosedXML ` 0.102.3(仅 Benchmarks 用,生产包零依赖)
134+ - 新增:` ClosedXML ` 0.102.3(仅 Benchmarks 用,生产包零依赖)
144135
145136## 2.8.5
146137** 2026.06.21**
0 commit comments