@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.
- package/README.md +99 -577
- package/README_zh.md +101 -577
- package/dist/browser/index.browser.d.ts +3 -0
- package/dist/browser/index.browser.js +2 -0
- package/dist/browser/index.d.ts +3 -0
- package/dist/browser/index.js +2 -0
- package/dist/browser/modules/archive/compression/compress.browser.js +4 -4
- package/dist/browser/modules/archive/compression/deflate-fallback.d.ts +24 -22
- package/dist/browser/modules/archive/compression/deflate-fallback.js +664 -360
- package/dist/browser/modules/archive/compression/streaming-compress.browser.d.ts +7 -0
- package/dist/browser/modules/archive/compression/streaming-compress.browser.js +15 -3
- package/dist/browser/modules/archive/compression/streaming-compress.d.ts +5 -0
- package/dist/browser/modules/archive/compression/streaming-compress.js +7 -0
- package/dist/browser/modules/archive/zip/stream.js +27 -3
- package/dist/browser/modules/excel/workbook.browser.d.ts +72 -0
- package/dist/browser/modules/excel/workbook.browser.js +226 -0
- package/dist/browser/modules/excel/workbook.d.ts +32 -1
- package/dist/browser/modules/excel/workbook.js +47 -2
- package/dist/browser/modules/excel/xlsx/xlsx.browser.js +42 -4
- package/dist/browser/modules/markdown/constants.d.ts +30 -0
- package/dist/browser/modules/markdown/constants.js +30 -0
- package/dist/browser/modules/markdown/errors.d.ts +21 -0
- package/dist/browser/modules/markdown/errors.js +23 -0
- package/dist/browser/modules/markdown/format/index.d.ts +54 -0
- package/dist/browser/modules/markdown/format/index.js +307 -0
- package/dist/browser/modules/markdown/index.d.ts +15 -0
- package/dist/browser/modules/markdown/index.js +22 -0
- package/dist/browser/modules/markdown/parse/index.d.ts +70 -0
- package/dist/browser/modules/markdown/parse/index.js +428 -0
- package/dist/browser/modules/markdown/types.d.ts +130 -0
- package/dist/browser/modules/markdown/types.js +6 -0
- package/dist/cjs/index.js +5 -1
- package/dist/cjs/modules/archive/compression/compress.browser.js +4 -4
- package/dist/cjs/modules/archive/compression/deflate-fallback.js +664 -360
- package/dist/cjs/modules/archive/compression/streaming-compress.browser.js +15 -2
- package/dist/cjs/modules/archive/compression/streaming-compress.js +8 -0
- package/dist/cjs/modules/archive/zip/stream.js +26 -2
- package/dist/cjs/modules/excel/workbook.browser.js +226 -0
- package/dist/cjs/modules/excel/workbook.js +46 -1
- package/dist/cjs/modules/excel/xlsx/xlsx.browser.js +42 -4
- package/dist/cjs/modules/markdown/constants.js +33 -0
- package/dist/cjs/modules/markdown/errors.js +28 -0
- package/dist/cjs/modules/markdown/format/index.js +310 -0
- package/dist/cjs/modules/markdown/index.js +30 -0
- package/dist/cjs/modules/markdown/parse/index.js +432 -0
- package/dist/cjs/modules/markdown/types.js +7 -0
- package/dist/esm/index.browser.js +2 -0
- package/dist/esm/index.js +2 -0
- package/dist/esm/modules/archive/compression/compress.browser.js +4 -4
- package/dist/esm/modules/archive/compression/deflate-fallback.js +664 -360
- package/dist/esm/modules/archive/compression/streaming-compress.browser.js +15 -3
- package/dist/esm/modules/archive/compression/streaming-compress.js +7 -0
- package/dist/esm/modules/archive/zip/stream.js +27 -3
- package/dist/esm/modules/excel/workbook.browser.js +226 -0
- package/dist/esm/modules/excel/workbook.js +47 -2
- package/dist/esm/modules/excel/xlsx/xlsx.browser.js +42 -4
- package/dist/esm/modules/markdown/constants.js +30 -0
- package/dist/esm/modules/markdown/errors.js +23 -0
- package/dist/esm/modules/markdown/format/index.js +307 -0
- package/dist/esm/modules/markdown/index.js +22 -0
- package/dist/esm/modules/markdown/parse/index.js +428 -0
- package/dist/esm/modules/markdown/types.js +6 -0
- package/dist/iife/excelts.iife.js +1342 -283
- package/dist/iife/excelts.iife.js.map +1 -1
- package/dist/iife/excelts.iife.min.js +38 -34
- package/dist/types/index.browser.d.ts +3 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/modules/archive/compression/deflate-fallback.d.ts +24 -22
- package/dist/types/modules/archive/compression/streaming-compress.browser.d.ts +7 -0
- package/dist/types/modules/archive/compression/streaming-compress.d.ts +5 -0
- package/dist/types/modules/excel/workbook.browser.d.ts +72 -0
- package/dist/types/modules/excel/workbook.d.ts +32 -1
- package/dist/types/modules/markdown/constants.d.ts +30 -0
- package/dist/types/modules/markdown/errors.d.ts +21 -0
- package/dist/types/modules/markdown/format/index.d.ts +54 -0
- package/dist/types/modules/markdown/index.d.ts +15 -0
- package/dist/types/modules/markdown/parse/index.d.ts +70 -0
- package/dist/types/modules/markdown/types.d.ts +130 -0
- package/package.json +56 -32
package/README_zh.md
CHANGED
|
@@ -1,648 +1,172 @@
|
|
|
1
1
|
# ExcelTS
|
|
2
2
|
|
|
3
|
-
[](https://github.com/cjnoname/excelts/actions/workflows/ci.yml) [English](README.md)
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
零依赖、AI 友好的 TypeScript 工具包 — Excel、PDF、CSV、Markdown、XML、ZIP 和流式处理,七大独立模块,一个库搞定。
|
|
6
6
|
|
|
7
7
|
## 关于本项目
|
|
8
8
|
|
|
9
|
-
ExcelTS
|
|
9
|
+
ExcelTS 是一个零依赖的 TypeScript 电子表格和文档工具包:
|
|
10
10
|
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
-
|
|
15
|
-
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
40
|
-
import { Workbook } from "@cj-tech-master/excelts";
|
|
35
|
+
### CSV — RFC 4180 解析器/格式化器
|
|
41
36
|
|
|
42
|
-
|
|
43
|
-
const sheet = workbook.addWorksheet("我的工作表");
|
|
37
|
+
高性能 CSV 解析和格式化,支持流式处理、动态类型、数据生成和工作线程池。
|
|
44
38
|
|
|
45
|
-
|
|
46
|
-
|
|
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
|
-
|
|
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
|
-
|
|
60
|
-
import { Workbook } from "@cj-tech-master/excelts";
|
|
49
|
+
### XML — SAX/DOM 解析器、查询引擎、写入器
|
|
61
50
|
|
|
62
|
-
|
|
63
|
-
// 仅 Node.js:从文件路径读取
|
|
64
|
-
await workbook.xlsx.readFile("input.xlsx");
|
|
51
|
+
流式和缓冲式 XML 处理,含查询引擎、命名空间支持和双模式写入。
|
|
65
52
|
|
|
66
|
-
|
|
53
|
+
- [文档](src/modules/xml/README.md) | [中文](src/modules/xml/README_zh.md)
|
|
54
|
+
- [示例](src/modules/xml/examples/)
|
|
67
55
|
|
|
68
|
-
|
|
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
|
-
|
|
63
|
+
### Stream — 跨平台流式处理
|
|
133
64
|
|
|
134
|
-
|
|
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
|
-
|
|
142
|
-
|
|
67
|
+
- [文档](src/modules/stream/README.md) | [中文](src/modules/stream/README_zh.md)
|
|
68
|
+
- [示例](src/modules/stream/examples/)
|
|
143
69
|
|
|
144
|
-
|
|
145
|
-
import { parseCsv, formatCsv, CsvParserStream } from "@cj-tech-master/excelts/csv";
|
|
70
|
+
## 安装
|
|
146
71
|
|
|
147
|
-
|
|
148
|
-
|
|
72
|
+
```bash
|
|
73
|
+
npm install @cj-tech-master/excelts
|
|
149
74
|
```
|
|
150
75
|
|
|
151
|
-
|
|
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
|
-
|
|
78
|
+
```typescript
|
|
79
|
+
import { Workbook } from "@cj-tech-master/excelts";
|
|
187
80
|
|
|
188
|
-
|
|
81
|
+
// 创建
|
|
189
82
|
const workbook = new Workbook();
|
|
190
|
-
|
|
191
|
-
|
|
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
|
-
|
|
212
|
-
|
|
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
|
-
|
|
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
|
-
["
|
|
227
|
-
["组件B", 2500]
|
|
99
|
+
["小工具", 1000]
|
|
228
100
|
]);
|
|
229
101
|
|
|
230
|
-
//
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
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
|
-
//
|
|
342
|
-
|
|
343
|
-
|
|
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
|
-
|
|
350
|
-
|
|
351
|
-
|
|
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
|
-
|
|
366
|
-
|
|
367
|
-
|
|
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
|
-
|
|
461
|
-
const writeStream = fs.createWriteStream("output.csv");
|
|
462
|
-
await workbook.writeCsv(writeStream);
|
|
122
|
+
每个模块都可以作为独立的子路径导出使用:
|
|
463
123
|
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
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
|
-
- [
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
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)
|