@cj-tech-master/excelts 7.6.0 → 8.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/README.md +99 -577
  2. package/README_zh.md +101 -577
  3. package/dist/browser/index.browser.d.ts +3 -0
  4. package/dist/browser/index.browser.js +2 -0
  5. package/dist/browser/index.d.ts +3 -0
  6. package/dist/browser/index.js +2 -0
  7. package/dist/browser/modules/archive/compression/compress.browser.js +4 -4
  8. package/dist/browser/modules/archive/compression/deflate-fallback.d.ts +24 -22
  9. package/dist/browser/modules/archive/compression/deflate-fallback.js +664 -360
  10. package/dist/browser/modules/archive/compression/streaming-compress.browser.d.ts +7 -0
  11. package/dist/browser/modules/archive/compression/streaming-compress.browser.js +15 -3
  12. package/dist/browser/modules/archive/compression/streaming-compress.d.ts +5 -0
  13. package/dist/browser/modules/archive/compression/streaming-compress.js +7 -0
  14. package/dist/browser/modules/archive/zip/stream.js +27 -3
  15. package/dist/browser/modules/excel/workbook.browser.d.ts +72 -0
  16. package/dist/browser/modules/excel/workbook.browser.js +226 -0
  17. package/dist/browser/modules/excel/workbook.d.ts +32 -1
  18. package/dist/browser/modules/excel/workbook.js +47 -2
  19. package/dist/browser/modules/excel/xlsx/xlsx.browser.js +42 -4
  20. package/dist/browser/modules/markdown/constants.d.ts +30 -0
  21. package/dist/browser/modules/markdown/constants.js +30 -0
  22. package/dist/browser/modules/markdown/errors.d.ts +21 -0
  23. package/dist/browser/modules/markdown/errors.js +23 -0
  24. package/dist/browser/modules/markdown/format/index.d.ts +54 -0
  25. package/dist/browser/modules/markdown/format/index.js +307 -0
  26. package/dist/browser/modules/markdown/index.d.ts +15 -0
  27. package/dist/browser/modules/markdown/index.js +22 -0
  28. package/dist/browser/modules/markdown/parse/index.d.ts +70 -0
  29. package/dist/browser/modules/markdown/parse/index.js +428 -0
  30. package/dist/browser/modules/markdown/types.d.ts +130 -0
  31. package/dist/browser/modules/markdown/types.js +6 -0
  32. package/dist/cjs/index.js +5 -1
  33. package/dist/cjs/modules/archive/compression/compress.browser.js +4 -4
  34. package/dist/cjs/modules/archive/compression/deflate-fallback.js +664 -360
  35. package/dist/cjs/modules/archive/compression/streaming-compress.browser.js +15 -2
  36. package/dist/cjs/modules/archive/compression/streaming-compress.js +8 -0
  37. package/dist/cjs/modules/archive/zip/stream.js +26 -2
  38. package/dist/cjs/modules/excel/workbook.browser.js +226 -0
  39. package/dist/cjs/modules/excel/workbook.js +46 -1
  40. package/dist/cjs/modules/excel/xlsx/xlsx.browser.js +42 -4
  41. package/dist/cjs/modules/markdown/constants.js +33 -0
  42. package/dist/cjs/modules/markdown/errors.js +28 -0
  43. package/dist/cjs/modules/markdown/format/index.js +310 -0
  44. package/dist/cjs/modules/markdown/index.js +30 -0
  45. package/dist/cjs/modules/markdown/parse/index.js +432 -0
  46. package/dist/cjs/modules/markdown/types.js +7 -0
  47. package/dist/esm/index.browser.js +2 -0
  48. package/dist/esm/index.js +2 -0
  49. package/dist/esm/modules/archive/compression/compress.browser.js +4 -4
  50. package/dist/esm/modules/archive/compression/deflate-fallback.js +664 -360
  51. package/dist/esm/modules/archive/compression/streaming-compress.browser.js +15 -3
  52. package/dist/esm/modules/archive/compression/streaming-compress.js +7 -0
  53. package/dist/esm/modules/archive/zip/stream.js +27 -3
  54. package/dist/esm/modules/excel/workbook.browser.js +226 -0
  55. package/dist/esm/modules/excel/workbook.js +47 -2
  56. package/dist/esm/modules/excel/xlsx/xlsx.browser.js +42 -4
  57. package/dist/esm/modules/markdown/constants.js +30 -0
  58. package/dist/esm/modules/markdown/errors.js +23 -0
  59. package/dist/esm/modules/markdown/format/index.js +307 -0
  60. package/dist/esm/modules/markdown/index.js +22 -0
  61. package/dist/esm/modules/markdown/parse/index.js +428 -0
  62. package/dist/esm/modules/markdown/types.js +6 -0
  63. package/dist/iife/excelts.iife.js +1342 -283
  64. package/dist/iife/excelts.iife.js.map +1 -1
  65. package/dist/iife/excelts.iife.min.js +38 -34
  66. package/dist/types/index.browser.d.ts +3 -0
  67. package/dist/types/index.d.ts +3 -0
  68. package/dist/types/modules/archive/compression/deflate-fallback.d.ts +24 -22
  69. package/dist/types/modules/archive/compression/streaming-compress.browser.d.ts +7 -0
  70. package/dist/types/modules/archive/compression/streaming-compress.d.ts +5 -0
  71. package/dist/types/modules/excel/workbook.browser.d.ts +72 -0
  72. package/dist/types/modules/excel/workbook.d.ts +32 -1
  73. package/dist/types/modules/markdown/constants.d.ts +30 -0
  74. package/dist/types/modules/markdown/errors.d.ts +21 -0
  75. package/dist/types/modules/markdown/format/index.d.ts +54 -0
  76. package/dist/types/modules/markdown/index.d.ts +15 -0
  77. package/dist/types/modules/markdown/parse/index.d.ts +70 -0
  78. package/dist/types/modules/markdown/types.d.ts +130 -0
  79. package/package.json +56 -32
package/README_zh.md CHANGED
@@ -1,648 +1,172 @@
1
1
  # ExcelTS
2
2
 
3
- [![Build Status](https://github.com/cjnoname/excelts/actions/workflows/ci.yml/badge.svg?branch=main&event=push)](https://github.com/cjnoname/excelts/actions/workflows/ci.yml)
3
+ [![构建状态](https://github.com/cjnoname/excelts/actions/workflows/ci.yml/badge.svg?branch=main&event=push)](https://github.com/cjnoname/excelts/actions/workflows/ci.yml)   [English](README.md)
4
4
 
5
- 现代化的 TypeScript Excel 工作簿管理器 - 读取、操作和写入电子表格数据和样式到 XLSX 和 JSON。
5
+ 零依赖、AI 友好的 TypeScript 工具包 Excel、PDF、CSV、Markdown、XML、ZIP 和流式处理,七大独立模块,一个库搞定。
6
6
 
7
7
  ## 关于本项目
8
8
 
9
- ExcelTS 是零依赖的 TypeScript 电子表格与文档工具包:
9
+ ExcelTS 是一个零依赖的 TypeScript 电子表格和文档工具包:
10
10
 
11
- - 🚀 **零运行时依赖** TypeScript 实现,无任何外部包依赖
12
- - 📦 **六大模块** Excel(XLSX/JSON)、PDF(独立引擎 + Excel 桥接)、CSV(RFC 4180)、XML(SAX/DOM/Writer)、Archive(ZIP/TAR)、Stream(跨平台)
13
- - 🤖 **AI 最佳伴侣** 简洁一致的 API 设计,让 AI 编程助手更容易生成处理各种文件的代码——一个库搞定 Excel、PDF、CSV、XML、ZIP 和流式处理,保持最高效率
14
- - **跨平台** — Node.js 22+、Bun、Chrome 89+、Firefox 102+、Safari 14.1+
15
- - **ESM 优先** — 原生 ES Modules,兼容 CommonJS,完整 tree-shaking 支持
11
+ - **AI 友好**简洁一致的 API,专为 AI 编程助手设计。每个模块都配有完整的文档和可运行的示例供 AI 学习
12
+ - **零运行时依赖** TypeScript,无外部包
13
+ - **七大模块** — Excel、PDF、CSV、Markdown、XML、Archive、Stream
14
+ - **跨平台** — Node.js 22+、Bun、Chrome 89+、Firefox 102+、Safari 14.1+
15
+ - **ESM 优先** — 原生 ES Modules,兼容 CommonJS,完整的 tree-shaking 支持
16
16
 
17
- ## 模块文档
17
+ ## 模块
18
18
 
19
- - [XML 模块](src/modules/xml/README.md) — 零依赖 SAX/DOM 解析器、查询引擎和双模式写入器
20
- - [PDF 模块](src/modules/pdf/README.md) — 零依赖 PDF 引擎,支持加密和字体嵌入
21
- - [CSV 模块](src/modules/csv/README.md) — RFC 4180 解析/格式化、流式处理、数据生成
22
- - [归档模块](src/modules/archive/README.md) — ZIP/TAR 创建/读取/编辑、压缩、加密
23
- - [流模块](src/modules/stream/README.md) — 跨平台 Readable/Writable/Transform/Duplex
19
+ ExcelTS 由七个独立模块组成,每个模块都有自己的文档和可运行示例。
24
20
 
25
- ## 翻译
21
+ ### Excel — XLSX/JSON 工作簿管理器
26
22
 
27
- - [English Documentation](README.md)
23
+ 创建、读取和修改 Excel 电子表格,完整支持样式、公式、图片和流式处理。
28
24
 
29
- ## 安装
25
+ - [文档](src/modules/excel/README.md) | [中文](src/modules/excel/README_zh.md)
26
+ - [示例](src/modules/excel/examples/)
30
27
 
31
- ```bash
32
- npm install @cj-tech-master/excelts
33
- ```
28
+ ### PDF — 零依赖 PDF 引擎
34
29
 
35
- ## 快速开始
30
+ 功能完整的 PDF 生成,支持字体嵌入、加密、图片和 Excel 转 PDF。
36
31
 
37
- ### 创建工作簿
32
+ - [文档](src/modules/pdf/README.md) | [中文](src/modules/pdf/README_zh.md)
33
+ - [示例](src/modules/pdf/examples/)
38
34
 
39
- ```javascript
40
- import { Workbook } from "@cj-tech-master/excelts";
35
+ ### CSV — RFC 4180 解析器/格式化器
41
36
 
42
- const workbook = new Workbook();
43
- const sheet = workbook.addWorksheet("我的工作表");
37
+ 高性能 CSV 解析和格式化,支持流式处理、动态类型、数据生成和工作线程池。
44
38
 
45
- // 添加数据
46
- sheet.addRow(["姓名", "年龄", "邮箱"]);
47
- sheet.addRow(["张三", 30, "zhang@example.com"]);
48
- sheet.addRow(["李四", 25, "li@example.com"]);
39
+ - [文档](src/modules/csv/README.md) | [中文](src/modules/csv/README_zh.md)
40
+ - [示例](src/modules/csv/examples/)
49
41
 
50
- // 保存文件
51
- // 仅 Node.js:写入到文件路径
52
- await workbook.xlsx.writeFile("output.xlsx");
42
+ ### Markdown — GFM 表格解析器/格式化器
53
43
 
54
- // 浏览器:使用 `writeBuffer()` 并保存为 Blob(见「浏览器支持」章节)
55
- ```
44
+ 解析和格式化 GitHub 风格 Markdown 表格,支持对齐方式保留和工作簿集成。
56
45
 
57
- ### 读取工作簿
46
+ - [文档](src/modules/markdown/README.md) | [中文](src/modules/markdown/README_zh.md)
47
+ - [示例](src/modules/markdown/examples/)
58
48
 
59
- ```javascript
60
- import { Workbook } from "@cj-tech-master/excelts";
49
+ ### XML — SAX/DOM 解析器、查询引擎、写入器
61
50
 
62
- const workbook = new Workbook();
63
- // 仅 Node.js:从文件路径读取
64
- await workbook.xlsx.readFile("input.xlsx");
51
+ 流式和缓冲式 XML 处理,含查询引擎、命名空间支持和双模式写入。
65
52
 
66
- // 浏览器:使用 `xlsx.load(arrayBuffer)`(见「浏览器支持」章节)
53
+ - [文档](src/modules/xml/README.md) | [中文](src/modules/xml/README_zh.md)
54
+ - [示例](src/modules/xml/examples/)
67
55
 
68
- const worksheet = workbook.getWorksheet(1);
69
- worksheet.eachRow((row, rowNumber) => {
70
- console.log("第 " + rowNumber + " 行 = " + JSON.stringify(row.values));
71
- });
72
- ```
56
+ ### Archive ZIP/TAR 创建/读取/编辑
73
57
 
74
- ### 单元格样式
75
-
76
- ```javascript
77
- // 设置单元格值和样式
78
- const cell = worksheet.getCell("A1");
79
- cell.value = "你好";
80
- cell.font = {
81
- name: "Arial",
82
- size: 16,
83
- bold: true,
84
- color: { argb: "FFFF0000" }
85
- };
86
- cell.fill = {
87
- type: "pattern",
88
- pattern: "solid",
89
- fgColor: { argb: "FFFFFF00" }
90
- };
91
- ```
58
+ ZIP 和 TAR 归档创建、读取、编辑、流式处理、加密和压缩工具。
92
59
 
93
- ## 功能特性
94
-
95
- - **Excel 操作**
96
- - 创建、读取和修改 XLSX 文件
97
- - 多工作表支持
98
- - 单元格样式(字体、颜色、边框、填充)
99
- - 单元格合并和格式化
100
- - 行和列属性
101
- - 冻结窗格和拆分视图
102
-
103
- - **数据处理**
104
- - 富文本支持
105
- - 公式和计算值
106
- - 数据验证
107
- - 条件格式
108
- - 图片和图表
109
- - 超链接
110
- - 数据透视表
111
-
112
- - **PDF 导出**
113
- - 零依赖 Excel 转 PDF
114
- - 完整的单元格样式支持(字体、颜色、边框、填充、对齐)
115
- - 自动分页与重复表头行
116
- - TrueType 字体嵌入,支持 Unicode/CJK 中文文本
117
- - JPEG 和 PNG 图片嵌入,支持透明度
118
- - 密码保护和加密
119
- - 每个工作表独立的页面设置(纸张大小、方向、页边距)
120
- - 支持 Tree-shaking(不导入 = 不打包)
121
-
122
- - **高级功能**
123
- - 大文件流式处理
124
- - CSV 导入/导出
125
- - 带自动筛选的表格
126
- - 页面设置和打印选项
127
- - 数据保护
128
- - 注释和批注
129
-
130
- ## 子路径导出
60
+ - [文档](src/modules/archive/README.md) | [中文](src/modules/archive/README_zh.md)
61
+ - [示例](src/modules/archive/examples/)
131
62
 
132
- ExcelTS 提供独立模块的子路径导出:
63
+ ### Stream — 跨平台流式处理
133
64
 
134
- ```typescript
135
- // 主入口 - Excel 核心(Workbook, Worksheet, Cell 等)
136
- import { Workbook, WorkbookWriter } from "@cj-tech-master/excelts";
137
-
138
- // XML 工具包(SAX 解析器、DOM 解析器、查询引擎、写入器)
139
- import { SaxParser, parseXml, XmlWriter, query } from "@cj-tech-master/excelts/xml";
65
+ 兼容 Node.js 的 Readable/Writable/Transform/Duplex,在 Node.js 和浏览器中行为一致。
140
66
 
141
- // ZIP/TAR 归档工具
142
- import { zip, unzip, ZipArchive, compress } from "@cj-tech-master/excelts/zip";
67
+ - [文档](src/modules/stream/README.md) | [中文](src/modules/stream/README_zh.md)
68
+ - [示例](src/modules/stream/examples/)
143
69
 
144
- // CSV 解析、格式化与流式处理
145
- import { parseCsv, formatCsv, CsvParserStream } from "@cj-tech-master/excelts/csv";
70
+ ## 安装
146
71
 
147
- // 跨平台流式原语
148
- import { Readable, pipeline, createTransform } from "@cj-tech-master/excelts/stream";
72
+ ```bash
73
+ npm install @cj-tech-master/excelts
149
74
  ```
150
75
 
151
- 每个子路径支持 `browser`、`import`(ESM)和 `require`(CJS)条件。
152
-
153
- ## PDF 导出
154
-
155
- 零依赖将任意工作簿导出为 PDF:
156
-
157
- ```javascript
158
- import { Workbook, excelToPdf } from "@cj-tech-master/excelts";
159
-
160
- const workbook = new Workbook();
161
- const sheet = workbook.addWorksheet("报告");
162
- sheet.columns = [
163
- { header: "产品", key: "product", width: 20 },
164
- { header: "收入", key: "revenue", width: 15 }
165
- ];
166
- sheet.addRow({ product: "组件A", revenue: 1000 });
167
- sheet.getColumn("revenue").numFmt = "¥#,##0.00";
168
-
169
- // 一行导出
170
- const pdf = excelToPdf(workbook, {
171
- showGridLines: true,
172
- showPageNumbers: true,
173
- title: "销售报告"
174
- });
175
-
176
- // Node.js:写入文件
177
- import { writeFileSync } from "fs";
178
- writeFileSync("report.pdf", pdf);
179
-
180
- // 浏览器:下载
181
- const blob = new Blob([pdf], { type: "application/pdf" });
182
- const url = URL.createObjectURL(blob);
183
- window.open(url);
184
- ```
76
+ ## 快速开始
185
77
 
186
- ### 将现有 XLSX 转换为 PDF
78
+ ```typescript
79
+ import { Workbook } from "@cj-tech-master/excelts";
187
80
 
188
- ```javascript
81
+ // 创建
189
82
  const workbook = new Workbook();
190
- await workbook.xlsx.readFile("input.xlsx");
191
- const pdf = excelToPdf(workbook);
192
- ```
193
-
194
- ### 加密
195
-
196
- ```javascript
197
- const pdf = excelToPdf(workbook, {
198
- encryption: {
199
- ownerPassword: "admin",
200
- userPassword: "reader",
201
- permissions: { print: true, copy: false }
202
- }
203
- });
204
- ```
205
-
206
- ### Unicode / CJK 中文支持
207
-
208
- ```javascript
209
- import { readFileSync } from "fs";
83
+ const sheet = workbook.addWorksheet("Sheet1");
84
+ sheet.addRow(["姓名", "年龄"]);
85
+ sheet.addRow(["Alice", 30]);
86
+ await workbook.xlsx.writeFile("output.xlsx");
210
87
 
211
- const pdf = excelToPdf(workbook, {
212
- font: readFileSync("NotoSansSC-Regular.ttf") // 嵌入 TrueType 字体以支持中文
213
- });
88
+ // 读取
89
+ const wb = new Workbook();
90
+ await wb.xlsx.readFile("output.xlsx");
91
+ wb.getWorksheet(1).eachRow((row, n) => console.log(n, row.values));
214
92
  ```
215
93
 
216
- ### 独立 PDF 生成(无需 Excel)
217
-
218
- 无需工作簿,直接从数组数据生成 PDF:
219
-
220
- ```javascript
94
+ ```typescript
95
+ // PDF — 直接从数据生成,无需 Workbook
221
96
  import { pdf } from "@cj-tech-master/excelts/pdf";
222
-
223
- // 最简方式 — 传入二维数组
224
- const bytes = pdf([
97
+ const pdfBytes = pdf([
225
98
  ["产品", "收入"],
226
- ["组件A", 1000],
227
- ["组件B", 2500]
99
+ ["小工具", 1000]
228
100
  ]);
229
101
 
230
- // 带列宽和样式
231
- const bytes = pdf(
232
- {
233
- name: "报告",
234
- columns: [
235
- { width: 25, header: "产品" },
236
- { width: 15, header: "收入" }
237
- ],
238
- data: [
239
- ["组件A", 1000],
240
- ["组件B", 2500]
241
- ]
242
- },
243
- { showGridLines: true }
244
- );
245
- ```
246
-
247
- 完整 API 参考和所有选项请查看 [PDF 模块文档](src/modules/pdf/README.md)。
248
-
249
- ## 归档工具(ZIP/TAR)
250
-
251
- ExcelTS 内置 ZIP/TAR 归档工具(用于 XLSX 管线)。若直接使用归档相关 API,
252
- 可通过 `ZipStringEncoding` 自定义 ZIP 字符串编码:
253
-
254
- - 默认:`"utf-8"`
255
- - 传统兼容:`"cp437"`
256
- - 自定义:提供带 `encode`/`decode` 的 codec,并可设置可选标记
257
-
258
- 当使用非 UTF-8 编码时,可写入 Unicode Extra Field 以提升跨工具兼容性。
259
-
260
- ## XML 工具包
261
-
262
- ExcelTS 内置一个独立的、零依赖的 XML 模块,支持流式和缓冲两种解析/写入模式。它为 XLSX 管线提供底层支持,也可作为独立子路径导出使用。
263
-
264
- ### 核心特性
265
-
266
- - **SAX 解析器** — 事件驱动的高性能流式解析器
267
- - **DOM 解析器** — 从字符串构建可查询的 XML 树
268
- - **查询引擎** — 简化路径表达式(`a/b[@id='1']`、`a//c`、`a/b[0]`)
269
- - **双模式写入** — 缓冲模式(`XmlWriter`)和流式模式(`XmlStreamWriter`)
270
- - **完整命名空间支持** — 前缀解析、保留命名空间强制、未绑定前缀检测
271
- - **安全加固** — 实体展开限制、嵌套深度限制、重复属性拒绝、BOM 处理
272
-
273
- ### 快速示例
274
-
275
- ```typescript
276
- import { SaxParser, parseXml, XmlWriter, queryAll } from "@cj-tech-master/excelts/xml";
277
-
278
- // SAX 流式解析
279
- const parser = new SaxParser();
280
- parser.on("opentag", tag => console.log(tag.name, tag.attributes));
281
- parser.write('<root><item id="1">hello</item></root>');
282
- parser.close();
283
-
284
- // DOM 解析 + 查询
285
- const doc = parseXml("<root><a><b>1</b><b>2</b></a></root>");
286
- const items = queryAll(doc.root, "a/b"); // 所有 <b> 元素
287
-
288
- // 写入 XML
289
- const w = new XmlWriter();
290
- w.openXml();
291
- w.openNode("root");
292
- w.leafNode("item", { id: "1" }, "hello");
293
- w.closeNode();
294
- console.log(w.xml);
295
- ```
296
-
297
- 完整 API 参考请见 [XML 模块文档](src/modules/xml/README.md)。
298
-
299
- ### 编辑现有 ZIP(ZipEditor)
300
-
301
- ExcelTS 也提供 ZIP 编辑器:对已有压缩包做类似文件系统的编辑,然后输出一个新的 ZIP。
302
-
303
- - 支持 `set()` / `delete()` / `rename()` / `deleteDirectory()` / `setComment()`
304
- - 对未改动条目会尽量走高效 passthrough(可用时不重压缩)
305
-
306
- ```js
307
- import { editZip } from "@cj-tech-master/excelts";
308
-
309
- const editor = await editZip(existingZipBytes, {
310
- reproducible: true,
311
-
312
- // 未改动条目的保留策略:
313
- // - "strict"(默认):必须能读取 raw passthrough,否则直接抛错
314
- // - "best-effort":raw 不可用时退化为 extract + 重新写入(可能更耗 CPU/内存)
315
- preserve: "best-effort",
316
- onWarning: w => console.warn(w.code, w.entry, w.message)
317
- });
318
-
319
- editor.delete("old.txt");
320
- editor.rename("a.txt", "renamed.txt");
321
- editor.set("new.txt", "hello");
322
-
323
- const out = await editor.bytes();
324
- ```
325
-
326
- ## 流式 API
327
-
328
- 处理大型 Excel 文件时无需将整个文件加载到内存中,ExcelTS 提供了流式读写 API。
329
-
330
- - **Node.js**:`WorkbookReader` 支持从文件路径读取;`WorkbookWriter` 支持写入到 `filename`。
331
- - **浏览器**:读取使用 `Uint8Array` / `ArrayBuffer` / Web `ReadableStream<Uint8Array>`;写入使用 Web `WritableStream<Uint8Array>`。
332
- - 说明:ExcelTS 不再从主入口 re-export 内部那套 stream 工具类(如 `Readable`、`Writable`)。建议直接使用标准 Web Streams(浏览器/Node 22+)或 Node.js 原生 streams。
333
-
334
- ### 流式读取器
335
-
336
- 以最小内存占用读取大型 XLSX 文件:
337
-
338
- ```javascript
339
- import { WorkbookReader } from "@cj-tech-master/excelts";
102
+ // CSV — 解析和格式化
103
+ import { parseCsv, formatCsv } from "@cj-tech-master/excelts/csv";
104
+ const rows = parseCsv("name,age\nAlice,30", { headers: true });
105
+ const csv = formatCsv([{ name: "Bob", age: 25 }], { headers: true });
340
106
 
341
- // Node.js:从文件路径读取
342
- const reader = new WorkbookReader("large-file.xlsx", {
343
- worksheets: "emit", // 触发工作表事件
344
- sharedStrings: "cache", // 缓存共享字符串以获取单元格值
345
- hyperlinks: "ignore", // 忽略超链接
346
- styles: "ignore" // 忽略样式以加快解析
347
- });
107
+ // XML — 解析、查询、写入
108
+ import { parseXml, queryAll, XmlWriter } from "@cj-tech-master/excelts/xml";
109
+ const titles = queryAll(parseXml(xmlString).root, "book/title");
348
110
 
349
- for await (const worksheet of reader) {
350
- console.log(`正在读取: ${worksheet.name}`);
351
- for await (const row of worksheet) {
352
- console.log(row.values);
353
- }
354
- }
355
- ```
356
-
357
- ### Web Streams(Node.js 22+ 与浏览器)
358
-
359
- `WorkbookWriter` 支持写入 Web `WritableStream<Uint8Array>`,`WorkbookReader` 支持从 Web `ReadableStream<Uint8Array>` 读取。
360
-
361
- 这里直接使用标准 Web Streams API,**不需要**从 ExcelTS 额外导入一堆 stream 工具类。
362
-
363
- - 可运行完整示例: [src/modules/excel/examples/web-streams-reader-writer.ts](src/modules/excel/examples/web-streams-reader-writer.ts)
111
+ // ZIP 创建和解压
112
+ import { zip, unzip } from "@cj-tech-master/excelts/zip";
113
+ const archive = await zip().add("hello.txt", "Hello!").bytes();
364
114
 
365
- 本地运行(Node.js 22+):
366
-
367
- ```bash
368
- npx tsx src/modules/excel/examples/web-streams-reader-writer.ts
115
+ // Markdown — 解析和格式化表格
116
+ import { parseMarkdown, formatMarkdown } from "@cj-tech-master/excelts/markdown";
117
+ const table = parseMarkdown("| A | B |\n|---|---|\n| 1 | 2 |");
369
118
  ```
370
119
 
371
- 最小端到端示例:
372
-
373
- ```javascript
374
- import { WorkbookWriter, WorkbookReader } from "@cj-tech-master/excelts";
375
-
376
- // 1) 写入工作簿 -> Web WritableStream
377
- const chunks = [];
378
- const writable = new WritableStream({
379
- write(chunk) {
380
- chunks.push(chunk);
381
- }
382
- });
383
-
384
- const writer = new WorkbookWriter({ stream: writable });
385
- const sheet = writer.addWorksheet("Sheet1");
386
- sheet.addRow(["Name", "Score"]).commit();
387
- sheet.addRow(["Alice", 98]).commit();
388
- await sheet.commit();
389
- await writer.commit();
390
-
391
- // 2) 读取工作簿 <- Web ReadableStream
392
- const bytes = new Uint8Array(chunks.reduce((n, c) => n + c.length, 0));
393
- let offset = 0;
394
- for (const c of chunks) {
395
- bytes.set(c, offset);
396
- offset += c.length;
397
- }
398
-
399
- const readable = new ReadableStream({
400
- start(controller) {
401
- controller.enqueue(bytes);
402
- controller.close();
403
- }
404
- });
405
-
406
- const reader = new WorkbookReader(readable, { worksheets: "emit" });
407
- for await (const ws of reader) {
408
- for await (const row of ws) {
409
- console.log(row.values);
410
- }
411
- }
412
- ```
413
-
414
- ### 流式写入器
415
-
416
- 逐行写入大型 XLSX 文件:
417
-
418
- ```javascript
419
- import { WorkbookWriter } from "@cj-tech-master/excelts";
420
-
421
- // Node.js:写入到 filename
422
- const workbook = new WorkbookWriter({
423
- filename: "output.xlsx",
424
- useSharedStrings: true,
425
- useStyles: true
426
- });
427
-
428
- const sheet = workbook.addWorksheet("Data");
429
-
430
- // 逐行写入
431
- for (let i = 0; i < 1000000; i++) {
432
- sheet.addRow([`第 ${i} 行`, i, new Date()]).commit();
433
- }
434
-
435
- // 提交工作表并完成
436
- sheet.commit();
437
- await workbook.commit();
438
- ```
439
-
440
- ## CSV 支持
441
-
442
- ### Node.js(完整流式支持)
443
-
444
- ```javascript
445
- import { Workbook } from "@cj-tech-master/excelts";
446
- import fs from "fs";
447
-
448
- const workbook = new Workbook();
449
-
450
- // 从文件读取 CSV
451
- await workbook.readCsvFile("data.csv");
452
-
453
- // 从流读取 CSV
454
- const stream = fs.createReadStream("data.csv");
455
- await workbook.readCsv(stream, { sheetName: "Imported" });
456
-
457
- // 写入 CSV 到文件
458
- await workbook.writeCsvFile("output.csv");
120
+ ## 子路径导出
459
121
 
460
- // 写入 CSV 到流
461
- const writeStream = fs.createWriteStream("output.csv");
462
- await workbook.writeCsv(writeStream);
122
+ 每个模块都可以作为独立的子路径导出使用:
463
123
 
464
- // 写入 CSV 为字符串 / 字节
465
- const csvText = workbook.writeCsv();
466
- const bytes = await workbook.writeCsvBuffer();
124
+ ```typescript
125
+ import { Workbook, WorkbookWriter } from "@cj-tech-master/excelts";
126
+ import { SaxParser, parseXml, XmlWriter, query } from "@cj-tech-master/excelts/xml";
127
+ import { zip, unzip, ZipArchive, compress } from "@cj-tech-master/excelts/zip";
128
+ import { parseCsv, formatCsv, CsvParserStream } from "@cj-tech-master/excelts/csv";
129
+ import { parseMarkdown, formatMarkdown, parseMarkdownAll } from "@cj-tech-master/excelts/markdown";
130
+ import { Readable, pipeline, createTransform } from "@cj-tech-master/excelts/stream";
467
131
  ```
468
132
 
469
- ### 浏览器(内存中)
470
-
471
- ```javascript
472
- import { Workbook } from "@cj-tech-master/excelts";
473
-
474
- const workbook = new Workbook();
475
-
476
- // 从字符串读取 CSV
477
- await workbook.readCsv(csvString);
478
-
479
- // 从 ArrayBuffer 读取 CSV(例如从 fetch)
480
- const response = await fetch("data.csv");
481
- const arrayBuffer = await response.arrayBuffer();
482
- await workbook.readCsv(arrayBuffer);
483
-
484
- // 从 File 读取 CSV(例如 <input type="file">)
485
- await workbook.readCsv(file);
486
-
487
- // 写入 CSV 为字符串
488
- const csvOutput = workbook.writeCsv();
489
-
490
- // 写入 CSV 为 Uint8Array 字节
491
- const bytes = await workbook.writeCsvBuffer();
492
- ```
133
+ 每个子路径均支持 `browser`、`import`(ESM)和 `require`(CJS)条件导出。
493
134
 
494
135
  ## 浏览器支持
495
136
 
496
- ExcelTS 原生支持浏览器环境,现代打包工具**无需任何配置**。
497
-
498
- ### 在打包工具中使用(Vite, Webpack, Rollup, esbuild)
137
+ ExcelTS 原生支持浏览器,现代打包工具**零配置**即可使用。
499
138
 
500
- 直接导入 ExcelTS - 无需 polyfills 或额外配置:
501
-
502
- ```javascript
139
+ ```typescript
140
+ // 打包工具(Vite、Webpack、Rollup、esbuild)— 直接导入
503
141
  import { Workbook } from "@cj-tech-master/excelts";
504
-
505
- const workbook = new Workbook();
506
- const sheet = workbook.addWorksheet("Sheet1");
507
- sheet.getCell("A1").value = "你好,浏览器!";
508
-
509
- // 写入 buffer 并下载
510
- const buffer = await workbook.xlsx.writeBuffer();
511
- const blob = new Blob([buffer], {
512
- type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
513
- });
514
- const url = URL.createObjectURL(blob);
515
- // ... 触发下载
142
+ const buffer = await new Workbook().addWorksheet("S1").workbook.xlsx.writeBuffer();
516
143
  ```
517
144
 
518
- ### 使用 Script 标签(无打包工具)
519
-
520
145
  ```html
146
+ <!-- Script 标签(无需打包工具) -->
521
147
  <script src="https://unpkg.com/@cj-tech-master/excelts/dist/iife/excelts.iife.min.js"></script>
522
- <script>
523
- const { Workbook } = ExcelTS;
524
- const wb = new Workbook();
525
- // ... 使用 workbook API
526
- </script>
527
148
  ```
528
149
 
529
- ### 手动浏览器示例(本地)
530
-
531
- 如果你想在真实浏览器里做快速手动冒烟测试(创建/下载/读取 XLSX、工作表保护等),可以用这个页面:
532
-
533
- - [src/modules/excel/examples/browser-smoke.html](src/modules/excel/examples/browser-smoke.html)
534
-
535
- 使用方式:
536
-
537
- ```bash
538
- npm run build:browser:bundle
539
- npx serve .
540
- ```
541
-
542
- 然后打开 `http://localhost:3000/src/modules/excel/examples/browser-smoke.html`。
543
-
544
- ### 浏览器版本注意事项
545
-
546
- - **完全支持 PDF 导出**(浏览器端零配置即可使用)
547
- - **支持 CSV 操作**(使用原生 RFC 4180 标准实现)
548
- - 使用 `await workbook.readCsv(input)` 读取 CSV
549
- - 使用 `workbook.writeCsv()` 或 `await workbook.writeCsvBuffer()` 写入 CSV
550
- - 使用 `xlsx.load(arrayBuffer)` 代替 `xlsx.readFile()`
551
- - 使用 `xlsx.writeBuffer()` 代替 `xlsx.writeFile()`
552
- - 完全支持带密码的工作表保护(纯 JS SHA-512 实现)
553
-
554
- ## 工具导出
555
-
556
- 主入口还导出了常用工具函数:
557
-
558
- ```typescript
559
- import {
560
- // Excel 日期转换
561
- dateToExcel, // JS Date -> Excel 序列号
562
- excelToDate, // Excel 序列号 -> JS Date
563
-
564
- // 日期解析/格式化(高性能,零依赖)
565
- DateParser, // 批量日期解析器,支持格式自动检测
566
- DateFormatter, // 批量日期格式化器
567
-
568
- // 二进制工具(跨平台)
569
- base64ToUint8Array,
570
- uint8ArrayToBase64,
571
- concatUint8Arrays,
572
- toUint8Array,
573
- stringToUint8Array,
574
- uint8ArrayToString,
575
-
576
- // XML 工具
577
- xmlEncode,
578
- xmlDecode,
579
- xmlEncodeAttr,
580
- validateXmlName,
581
-
582
- // PDF 导出
583
- pdf, // 最简单:pdf([["A", 1], ["B", 2]]) → Uint8Array
584
- excelToPdf, // Workbook -> Uint8Array(Excel 转 PDF)
585
- PageSizes, // 内置页面尺寸定义
586
- PdfError, // PDF 基础错误
587
- PdfRenderError, // 布局/渲染错误
588
- PdfFontError, // 字体解析/嵌入错误
589
- PdfStructureError, // PDF 结构组装错误
590
- isPdfError, // PDF 错误类型守卫
591
-
592
- // 错误基础设施
593
- BaseError, // 所有库错误的基类
594
- ExcelError, // Excel 基础错误(支持 instanceof 检查)
595
- toError, // 将 unknown 标准化为 Error
596
- errorToJSON, // 序列化错误(包含 cause 链)
597
- getErrorChain, // 获取完整的错误 cause 链数组
598
- getRootCause // 获取 cause 链中最深层的错误
599
- } from "@cj-tech-master/excelts";
600
- ```
150
+ 对于不支持原生 `CompressionStream` API 的旧版浏览器,ExcelTS 自动使用内置的纯 JavaScript DEFLATE 实现 — 无需 polyfill。
601
151
 
602
152
  ## 系统要求
603
153
 
604
- ### Node.js
605
-
606
- - **Node.js >= 22.0.0**(原生支持 ES2020)
607
-
608
- ### 浏览器(无需 Polyfills)
609
-
610
- - **Chrome >= 89**(2021年3月)
611
- - **Edge >= 89**(2021年3月)
612
- - **Firefox >= 102**(2022年6月)
613
- - **Safari >= 14.1**(2021年4月)
614
- - **Opera >= 75**(2021年3月)
615
-
616
- 对于不支持原生 `CompressionStream` API 的旧浏览器(Firefox < 113, Safari < 16.4),ExcelTS 会自动使用内置的纯 JavaScript DEFLATE 实现 - 无需任何配置或 polyfills。
154
+ - **Node.js >= 22.0.0**
617
155
 
618
- 浏览器端不要求必须支持 `crypto.randomUUID()`:ExcelTS 内置了 UUID v4 生成器,并会优先使用 `crypto.getRandomValues()` 作为 fallback。
619
-
620
- ## API 文档
621
-
622
- 详细的 API 文档,请参考以下综合文档部分:
623
-
624
- - 工作簿管理
625
- - 工作表
626
- - 单元格和值
627
- - 样式
628
- - 公式
629
- - 数据验证
630
- - 条件格式
631
- - 文件输入输出
632
-
633
- ## 许可证
634
-
635
- MIT License
636
-
637
- 详见 LICENSE。
638
-
639
- 第三方软件的声明与归属信息请见 THIRD_PARTY_NOTICES.md。
156
+ | 浏览器 | 最低版本 |
157
+ | ------- | ------------------ |
158
+ | Chrome | 89+(2021年3月) |
159
+ | Edge | 89+(2021年3月) |
160
+ | Firefox | 102+(2022年6月) |
161
+ | Safari | 14.1+(2021年4月) |
162
+ | Opera | 75+(2021年3月) |
640
163
 
641
164
  ## 链接
642
165
 
643
- - [GitHub 仓库](https://github.com/cjnoname/excelts)
644
- - [问题跟踪](https://github.com/cjnoname/excelts/issues)
645
-
646
- ## 更新日志
647
-
648
- 详细版本历史请查看 [CHANGELOG.md](CHANGELOG.md)
166
+ - 🏠 [GitHub 仓库](https://github.com/cjnoname/excelts)
167
+ - 🐛 [问题追踪](https://github.com/cjnoname/excelts/issues)
168
+ - 📋 [更新日志](CHANGELOG.md)
169
+ - 🔄 [迁移指南](MIGRATION.md)
170
+ - 🗺️ [路线图](ROADMAP.md)
171
+ - 📄 [许可证 (MIT)](LICENSE)
172
+ - 📦 [第三方声明](THIRD_PARTY_NOTICES.md)