@cj-tech-master/excelts 7.6.0 → 8.0.0-canary.20260405103449.75270cb

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 (176) hide show
  1. package/README.md +109 -574
  2. package/README_zh.md +105 -575
  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.d.ts +4 -0
  15. package/dist/browser/modules/archive/zip/stream.js +80 -3
  16. package/dist/browser/modules/excel/workbook.browser.d.ts +72 -0
  17. package/dist/browser/modules/excel/workbook.browser.js +226 -0
  18. package/dist/browser/modules/excel/workbook.d.ts +32 -1
  19. package/dist/browser/modules/excel/workbook.js +47 -2
  20. package/dist/browser/modules/excel/xlsx/xlsx.browser.js +42 -4
  21. package/dist/browser/modules/markdown/constants.d.ts +30 -0
  22. package/dist/browser/modules/markdown/constants.js +30 -0
  23. package/dist/browser/modules/markdown/errors.d.ts +21 -0
  24. package/dist/browser/modules/markdown/errors.js +23 -0
  25. package/dist/browser/modules/markdown/format/index.d.ts +54 -0
  26. package/dist/browser/modules/markdown/format/index.js +307 -0
  27. package/dist/browser/modules/markdown/index.d.ts +15 -0
  28. package/dist/browser/modules/markdown/index.js +22 -0
  29. package/dist/browser/modules/markdown/parse/index.d.ts +70 -0
  30. package/dist/browser/modules/markdown/parse/index.js +428 -0
  31. package/dist/browser/modules/markdown/types.d.ts +130 -0
  32. package/dist/browser/modules/markdown/types.js +6 -0
  33. package/dist/browser/modules/pdf/core/crypto.d.ts +65 -0
  34. package/dist/browser/modules/pdf/core/crypto.js +637 -0
  35. package/dist/browser/modules/pdf/core/encryption.d.ts +23 -20
  36. package/dist/browser/modules/pdf/core/encryption.js +88 -261
  37. package/dist/browser/modules/pdf/core/pdf-writer.d.ts +6 -4
  38. package/dist/browser/modules/pdf/core/pdf-writer.js +19 -10
  39. package/dist/browser/modules/pdf/index.d.ts +23 -2
  40. package/dist/browser/modules/pdf/index.js +21 -3
  41. package/dist/browser/modules/pdf/reader/annotation-extractor.d.ts +63 -0
  42. package/dist/browser/modules/pdf/reader/annotation-extractor.js +155 -0
  43. package/dist/browser/modules/pdf/reader/cmap-parser.d.ts +70 -0
  44. package/dist/browser/modules/pdf/reader/cmap-parser.js +321 -0
  45. package/dist/browser/modules/pdf/reader/content-interpreter.d.ts +57 -0
  46. package/dist/browser/modules/pdf/reader/content-interpreter.js +715 -0
  47. package/dist/browser/modules/pdf/reader/font-decoder.d.ts +58 -0
  48. package/dist/browser/modules/pdf/reader/font-decoder.js +1513 -0
  49. package/dist/browser/modules/pdf/reader/form-extractor.d.ts +48 -0
  50. package/dist/browser/modules/pdf/reader/form-extractor.js +355 -0
  51. package/dist/browser/modules/pdf/reader/image-extractor.d.ts +55 -0
  52. package/dist/browser/modules/pdf/reader/image-extractor.js +220 -0
  53. package/dist/browser/modules/pdf/reader/metadata-reader.d.ts +56 -0
  54. package/dist/browser/modules/pdf/reader/metadata-reader.js +275 -0
  55. package/dist/browser/modules/pdf/reader/pdf-decrypt.d.ts +26 -0
  56. package/dist/browser/modules/pdf/reader/pdf-decrypt.js +443 -0
  57. package/dist/browser/modules/pdf/reader/pdf-document.d.ts +191 -0
  58. package/dist/browser/modules/pdf/reader/pdf-document.js +818 -0
  59. package/dist/browser/modules/pdf/reader/pdf-parser.d.ts +65 -0
  60. package/dist/browser/modules/pdf/reader/pdf-parser.js +285 -0
  61. package/dist/browser/modules/pdf/reader/pdf-reader.d.ts +143 -0
  62. package/dist/browser/modules/pdf/reader/pdf-reader.js +200 -0
  63. package/dist/browser/modules/pdf/reader/pdf-tokenizer.d.ts +101 -0
  64. package/dist/browser/modules/pdf/reader/pdf-tokenizer.js +543 -0
  65. package/dist/browser/modules/pdf/reader/reader-utils.d.ts +15 -0
  66. package/dist/browser/modules/pdf/reader/reader-utils.js +27 -0
  67. package/dist/browser/modules/pdf/reader/stream-filters.d.ts +20 -0
  68. package/dist/browser/modules/pdf/reader/stream-filters.js +456 -0
  69. package/dist/browser/modules/pdf/reader/text-reconstruction.d.ts +44 -0
  70. package/dist/browser/modules/pdf/reader/text-reconstruction.js +463 -0
  71. package/dist/cjs/index.js +5 -1
  72. package/dist/cjs/modules/archive/compression/compress.browser.js +4 -4
  73. package/dist/cjs/modules/archive/compression/deflate-fallback.js +664 -360
  74. package/dist/cjs/modules/archive/compression/streaming-compress.browser.js +15 -2
  75. package/dist/cjs/modules/archive/compression/streaming-compress.js +8 -0
  76. package/dist/cjs/modules/archive/zip/stream.js +79 -2
  77. package/dist/cjs/modules/excel/workbook.browser.js +226 -0
  78. package/dist/cjs/modules/excel/workbook.js +46 -1
  79. package/dist/cjs/modules/excel/xlsx/xlsx.browser.js +42 -4
  80. package/dist/cjs/modules/markdown/constants.js +33 -0
  81. package/dist/cjs/modules/markdown/errors.js +28 -0
  82. package/dist/cjs/modules/markdown/format/index.js +310 -0
  83. package/dist/cjs/modules/markdown/index.js +30 -0
  84. package/dist/cjs/modules/markdown/parse/index.js +432 -0
  85. package/dist/cjs/modules/markdown/types.js +7 -0
  86. package/dist/cjs/modules/pdf/core/crypto.js +649 -0
  87. package/dist/cjs/modules/pdf/core/encryption.js +88 -263
  88. package/dist/cjs/modules/pdf/core/pdf-writer.js +19 -10
  89. package/dist/cjs/modules/pdf/index.js +23 -4
  90. package/dist/cjs/modules/pdf/reader/annotation-extractor.js +158 -0
  91. package/dist/cjs/modules/pdf/reader/cmap-parser.js +326 -0
  92. package/dist/cjs/modules/pdf/reader/content-interpreter.js +718 -0
  93. package/dist/cjs/modules/pdf/reader/font-decoder.js +1518 -0
  94. package/dist/cjs/modules/pdf/reader/form-extractor.js +358 -0
  95. package/dist/cjs/modules/pdf/reader/image-extractor.js +223 -0
  96. package/dist/cjs/modules/pdf/reader/metadata-reader.js +278 -0
  97. package/dist/cjs/modules/pdf/reader/pdf-decrypt.js +447 -0
  98. package/dist/cjs/modules/pdf/reader/pdf-document.js +822 -0
  99. package/dist/cjs/modules/pdf/reader/pdf-parser.js +301 -0
  100. package/dist/cjs/modules/pdf/reader/pdf-reader.js +203 -0
  101. package/dist/cjs/modules/pdf/reader/pdf-tokenizer.js +517 -0
  102. package/dist/cjs/modules/pdf/reader/reader-utils.js +30 -0
  103. package/dist/cjs/modules/pdf/reader/stream-filters.js +459 -0
  104. package/dist/cjs/modules/pdf/reader/text-reconstruction.js +467 -0
  105. package/dist/esm/index.browser.js +2 -0
  106. package/dist/esm/index.js +2 -0
  107. package/dist/esm/modules/archive/compression/compress.browser.js +4 -4
  108. package/dist/esm/modules/archive/compression/deflate-fallback.js +664 -360
  109. package/dist/esm/modules/archive/compression/streaming-compress.browser.js +15 -3
  110. package/dist/esm/modules/archive/compression/streaming-compress.js +7 -0
  111. package/dist/esm/modules/archive/zip/stream.js +80 -3
  112. package/dist/esm/modules/excel/workbook.browser.js +226 -0
  113. package/dist/esm/modules/excel/workbook.js +47 -2
  114. package/dist/esm/modules/excel/xlsx/xlsx.browser.js +42 -4
  115. package/dist/esm/modules/markdown/constants.js +30 -0
  116. package/dist/esm/modules/markdown/errors.js +23 -0
  117. package/dist/esm/modules/markdown/format/index.js +307 -0
  118. package/dist/esm/modules/markdown/index.js +22 -0
  119. package/dist/esm/modules/markdown/parse/index.js +428 -0
  120. package/dist/esm/modules/markdown/types.js +6 -0
  121. package/dist/esm/modules/pdf/core/crypto.js +637 -0
  122. package/dist/esm/modules/pdf/core/encryption.js +88 -261
  123. package/dist/esm/modules/pdf/core/pdf-writer.js +19 -10
  124. package/dist/esm/modules/pdf/index.js +21 -3
  125. package/dist/esm/modules/pdf/reader/annotation-extractor.js +155 -0
  126. package/dist/esm/modules/pdf/reader/cmap-parser.js +321 -0
  127. package/dist/esm/modules/pdf/reader/content-interpreter.js +715 -0
  128. package/dist/esm/modules/pdf/reader/font-decoder.js +1513 -0
  129. package/dist/esm/modules/pdf/reader/form-extractor.js +355 -0
  130. package/dist/esm/modules/pdf/reader/image-extractor.js +220 -0
  131. package/dist/esm/modules/pdf/reader/metadata-reader.js +275 -0
  132. package/dist/esm/modules/pdf/reader/pdf-decrypt.js +443 -0
  133. package/dist/esm/modules/pdf/reader/pdf-document.js +818 -0
  134. package/dist/esm/modules/pdf/reader/pdf-parser.js +285 -0
  135. package/dist/esm/modules/pdf/reader/pdf-reader.js +200 -0
  136. package/dist/esm/modules/pdf/reader/pdf-tokenizer.js +543 -0
  137. package/dist/esm/modules/pdf/reader/reader-utils.js +27 -0
  138. package/dist/esm/modules/pdf/reader/stream-filters.js +456 -0
  139. package/dist/esm/modules/pdf/reader/text-reconstruction.js +463 -0
  140. package/dist/iife/excelts.iife.js +2044 -549
  141. package/dist/iife/excelts.iife.js.map +1 -1
  142. package/dist/iife/excelts.iife.min.js +38 -34
  143. package/dist/types/index.browser.d.ts +3 -0
  144. package/dist/types/index.d.ts +3 -0
  145. package/dist/types/modules/archive/compression/deflate-fallback.d.ts +24 -22
  146. package/dist/types/modules/archive/compression/streaming-compress.browser.d.ts +7 -0
  147. package/dist/types/modules/archive/compression/streaming-compress.d.ts +5 -0
  148. package/dist/types/modules/archive/zip/stream.d.ts +4 -0
  149. package/dist/types/modules/excel/workbook.browser.d.ts +72 -0
  150. package/dist/types/modules/excel/workbook.d.ts +32 -1
  151. package/dist/types/modules/markdown/constants.d.ts +30 -0
  152. package/dist/types/modules/markdown/errors.d.ts +21 -0
  153. package/dist/types/modules/markdown/format/index.d.ts +54 -0
  154. package/dist/types/modules/markdown/index.d.ts +15 -0
  155. package/dist/types/modules/markdown/parse/index.d.ts +70 -0
  156. package/dist/types/modules/markdown/types.d.ts +130 -0
  157. package/dist/types/modules/pdf/core/crypto.d.ts +65 -0
  158. package/dist/types/modules/pdf/core/encryption.d.ts +23 -20
  159. package/dist/types/modules/pdf/core/pdf-writer.d.ts +6 -4
  160. package/dist/types/modules/pdf/index.d.ts +23 -2
  161. package/dist/types/modules/pdf/reader/annotation-extractor.d.ts +63 -0
  162. package/dist/types/modules/pdf/reader/cmap-parser.d.ts +70 -0
  163. package/dist/types/modules/pdf/reader/content-interpreter.d.ts +57 -0
  164. package/dist/types/modules/pdf/reader/font-decoder.d.ts +58 -0
  165. package/dist/types/modules/pdf/reader/form-extractor.d.ts +48 -0
  166. package/dist/types/modules/pdf/reader/image-extractor.d.ts +55 -0
  167. package/dist/types/modules/pdf/reader/metadata-reader.d.ts +56 -0
  168. package/dist/types/modules/pdf/reader/pdf-decrypt.d.ts +26 -0
  169. package/dist/types/modules/pdf/reader/pdf-document.d.ts +191 -0
  170. package/dist/types/modules/pdf/reader/pdf-parser.d.ts +65 -0
  171. package/dist/types/modules/pdf/reader/pdf-reader.d.ts +143 -0
  172. package/dist/types/modules/pdf/reader/pdf-tokenizer.d.ts +101 -0
  173. package/dist/types/modules/pdf/reader/reader-utils.d.ts +15 -0
  174. package/dist/types/modules/pdf/reader/stream-filters.d.ts +20 -0
  175. package/dist/types/modules/pdf/reader/text-reconstruction.d.ts +44 -0
  176. package/package.json +56 -32
package/README.md CHANGED
@@ -1,650 +1,185 @@
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
+ [![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)   [中文](README_zh.md)
4
4
 
5
- Modern TypeScript Excel Workbook Manager - Read, manipulate and write spreadsheet data and styles to XLSX and JSON.
5
+ Zero-dependency, AI-friendly TypeScript toolkit — Excel, PDF, CSV, Markdown, XML, ZIP, and streaming in one library with seven standalone modules.
6
6
 
7
7
  ## About This Project
8
8
 
9
9
  ExcelTS is a zero-dependency TypeScript toolkit for spreadsheets and documents:
10
10
 
11
- - 🚀 **Zero Runtime Dependencies** — Pure TypeScript, no external packages
12
- - 📦 **Six Modules** — Excel (XLSX/JSON), PDF (standalone engine + Excel bridge), CSV (RFC 4180), XML (SAX/DOM/Writer), Archive (ZIP/TAR), Stream (cross-platform)
13
- - 🤖 **AI-Friendly**Clean, consistent API designed to be easily generated and consumed by AI coding agents — one library handles Excel, PDF, CSV, XML, ZIP, and streaming with maximum efficiency
14
- - **Cross-Platform** — Node.js 22+, Bun, Chrome 89+, Firefox 102+, Safari 14.1+
15
- - **ESM First** — Native ES Modules with CommonJS compatibility and full tree-shaking
11
+ - **AI-Friendly** — Clean, consistent API designed for AI coding agents. Every module has comprehensive documentation and runnable examples for AI to learn from
12
+ - **Zero Runtime Dependencies** — Pure TypeScript, no external packages
13
+ - **Seven Modules** — Excel, PDF, CSV, Markdown, XML, Archive, Stream
14
+ - **Cross-Platform** — Node.js 22+, Bun, Chrome 89+, Firefox 102+, Safari 14.1+
15
+ - **ESM First** — Native ES Modules with CommonJS compatibility and full tree-shaking
16
16
 
17
- ## Module Documentation
17
+ ## Motivation
18
18
 
19
- - [XML Module](src/modules/xml/README.md)Zero-dependency SAX/DOM parser, query engine, and dual-mode writer
20
- - [PDF Module](src/modules/pdf/README.md) — Full-featured zero-dependency PDF engine with encryption and font embedding
21
- - [CSV Module](src/modules/csv/README.md) — RFC 4180 parser/formatter, streaming, data generation
22
- - [Archive Module](src/modules/archive/README.md) — ZIP/TAR create/read/edit, compression, encryption
23
- - [Stream Module](src/modules/stream/README.md) — Cross-platform Readable/Writable/Transform/Duplex
19
+ The TypeScript ecosystem is heavily fragmented when it comes to document and data processing. To handle Excel, PDF, CSV, XML, ZIP, and streaming, developers often need to pull in a different package for each task and then yet another set of packages to make them work in the browser, plus separate streaming wrappers on top. These libraries vary in API style, quality, and maintenance status, creating a tax on every project that needs more than one of them.
24
20
 
25
- ## Translations
21
+ ExcelTS was built to fix this. One package, one consistent API, one codebase — working identically across Node.js, Bun, and browsers. Streaming is a first-class citizen in every module, not an afterthought bolted on through a third-party adapter. The goal is simple: install once, import what you need, and get the same reliable behavior everywhere — with maximum streaming performance out of the box.
26
22
 
27
- - [中文文档](README_zh.md)
23
+ ## Modules
28
24
 
29
- ## Installation
30
-
31
- ```bash
32
- npm install @cj-tech-master/excelts
33
- ```
25
+ ExcelTS is organized into seven standalone modules. Each module has its own documentation and runnable examples.
34
26
 
35
- ## Quick Start
27
+ ### Excel — XLSX/JSON Workbook Manager
36
28
 
37
- ### Creating a Workbook
29
+ Create, read, and modify Excel spreadsheets with full styling, formulas, images, and streaming support.
38
30
 
39
- ```javascript
40
- import { Workbook } from "@cj-tech-master/excelts";
31
+ - [Documentation](src/modules/excel/README.md) | [中文](src/modules/excel/README_zh.md)
32
+ - [Examples](src/modules/excel/examples/)
41
33
 
42
- const workbook = new Workbook();
43
- const sheet = workbook.addWorksheet("My Sheet");
34
+ ### PDF Zero-Dependency PDF Engine
44
35
 
45
- // Add data
46
- sheet.addRow(["Name", "Age", "Email"]);
47
- sheet.addRow(["John Doe", 30, "john@example.com"]);
48
- sheet.addRow(["Jane Smith", 25, "jane@example.com"]);
36
+ Full-featured PDF generation and reading. Write PDFs with font embedding, AES-256 encryption, images, and Excel-to-PDF conversion. Read any PDF with text, image, annotation, form field, and metadata extraction.
49
37
 
50
- // Save to file
51
- // Node.js only: write to a file path
52
- await workbook.xlsx.writeFile("output.xlsx");
38
+ - [Documentation](src/modules/pdf/README.md) | [中文](src/modules/pdf/README_zh.md)
39
+ - [Examples](src/modules/pdf/examples/)
53
40
 
54
- // Browser: use `writeBuffer()` and save as a Blob (see the Browser Support section)
55
- ```
41
+ ### CSV RFC 4180 Parser/Formatter
56
42
 
57
- ### Reading a Workbook
58
-
59
- ```javascript
60
- import { Workbook } from "@cj-tech-master/excelts";
61
-
62
- const workbook = new Workbook();
63
- // Node.js only: read from a file path
64
- await workbook.xlsx.readFile("input.xlsx");
65
-
66
- // Browser: use `xlsx.load(arrayBuffer)` (see the Browser Support section)
67
-
68
- const worksheet = workbook.getWorksheet(1);
69
- worksheet.eachRow((row, rowNumber) => {
70
- console.log("Row " + rowNumber + " = " + JSON.stringify(row.values));
71
- });
72
- ```
73
-
74
- ### Styling Cells
75
-
76
- ```javascript
77
- // Set cell value and style
78
- const cell = worksheet.getCell("A1");
79
- cell.value = "Hello";
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
- ```
43
+ High-performance CSV parsing and formatting with streaming, dynamic typing, data generation, and worker pool support.
92
44
 
93
- ## Features
94
-
95
- - **Excel Operations**
96
- - Create, read, and modify XLSX files
97
- - Multiple worksheet support
98
- - Cell styling (fonts, colors, borders, fills)
99
- - Cell merging and formatting
100
- - Row and column properties
101
- - Freeze panes and split views
102
-
103
- - **Data Handling**
104
- - Rich text support
105
- - Formulas and calculated values
106
- - Data validation
107
- - Conditional formatting
108
- - Images and charts
109
- - Hyperlinks
110
- - Pivot tables
111
-
112
- - **PDF Export**
113
- - Full-featured, zero-dependency PDF engine (standalone or with Excel)
114
- - Full cell styling (fonts, colors, borders, fills, alignment)
115
- - Automatic pagination with repeat header rows
116
- - TrueType font embedding for Unicode/CJK text
117
- - JPEG and PNG image embedding with transparency
118
- - Password protection and encryption
119
- - Per-worksheet page setup (size, orientation, margins)
120
- - Tree-shakeable (not imported = not bundled)
121
-
122
- - **Advanced Features**
123
- - Streaming for large files
124
- - CSV import/export
125
- - Tables with auto-filters
126
- - Page setup and printing options
127
- - Data protection
128
- - Comments and notes
45
+ - [Documentation](src/modules/csv/README.md) | [中文](src/modules/csv/README_zh.md)
46
+ - [Examples](src/modules/csv/examples/)
129
47
 
130
- ## Subpath Exports
48
+ ### Markdown — GFM Table Parser/Formatter
131
49
 
132
- ExcelTS provides focused subpath exports for standalone module usage:
50
+ Parse and format GitHub Flavored Markdown tables with alignment round-trip and Workbook integration.
133
51
 
134
- ```typescript
135
- // Main entry - Excel core (Workbook, Worksheet, Cell, etc.)
136
- import { Workbook, WorkbookWriter } from "@cj-tech-master/excelts";
52
+ - [Documentation](src/modules/markdown/README.md) | [中文](src/modules/markdown/README_zh.md)
53
+ - [Examples](src/modules/markdown/examples/)
137
54
 
138
- // XML toolkit (SAX parser, DOM parser, query engine, writers)
139
- import { SaxParser, parseXml, XmlWriter, query } from "@cj-tech-master/excelts/xml";
55
+ ### XML SAX/DOM Parser, Query Engine, Writer
140
56
 
141
- // ZIP/TAR archive utilities
142
- import { zip, unzip, ZipArchive, compress } from "@cj-tech-master/excelts/zip";
57
+ Streaming and buffered XML processing with query engine, namespace support, and dual-mode writing.
143
58
 
144
- // CSV parsing, formatting, and streaming
145
- import { parseCsv, formatCsv, CsvParserStream } from "@cj-tech-master/excelts/csv";
59
+ - [Documentation](src/modules/xml/README.md) | [中文](src/modules/xml/README_zh.md)
60
+ - [Examples](src/modules/xml/examples/)
146
61
 
147
- // Cross-platform stream primitives
148
- import { Readable, pipeline, createTransform } from "@cj-tech-master/excelts/stream";
149
- ```
62
+ ### Archive ZIP/TAR Create/Read/Edit
150
63
 
151
- Each subpath supports `browser`, `import` (ESM), and `require` (CJS) conditions.
64
+ ZIP and TAR archive creation, reading, editing, streaming, encryption, and compression utilities.
152
65
 
153
- ## PDF Export
66
+ - [Documentation](src/modules/archive/README.md) | [中文](src/modules/archive/README_zh.md)
67
+ - [Examples](src/modules/archive/examples/)
154
68
 
155
- Export any workbook to PDF with zero external dependencies:
69
+ ### Stream Cross-Platform Streaming
156
70
 
157
- ```javascript
158
- import { Workbook, excelToPdf } from "@cj-tech-master/excelts";
71
+ Node.js-compatible Readable/Writable/Transform/Duplex that works identically in Node.js and browsers.
159
72
 
160
- const workbook = new Workbook();
161
- const sheet = workbook.addWorksheet("Report");
162
- sheet.columns = [
163
- { header: "Product", key: "product", width: 20 },
164
- { header: "Revenue", key: "revenue", width: 15 }
165
- ];
166
- sheet.addRow({ product: "Widget", revenue: 1000 });
167
- sheet.getColumn("revenue").numFmt = "$#,##0.00";
168
-
169
- // One-line export
170
- const pdf = excelToPdf(workbook, {
171
- showGridLines: true,
172
- showPageNumbers: true,
173
- title: "Sales Report"
174
- });
175
-
176
- // Node.js: write to file
177
- import { writeFileSync } from "fs";
178
- writeFileSync("report.pdf", pdf);
179
-
180
- // Browser: download
181
- const blob = new Blob([pdf], { type: "application/pdf" });
182
- const url = URL.createObjectURL(blob);
183
- window.open(url);
184
- ```
73
+ - [Documentation](src/modules/stream/README.md) | [中文](src/modules/stream/README_zh.md)
74
+ - [Examples](src/modules/stream/examples/)
185
75
 
186
- ### Convert Existing XLSX to PDF
76
+ ## Installation
187
77
 
188
- ```javascript
189
- const workbook = new Workbook();
190
- await workbook.xlsx.readFile("input.xlsx");
191
- const pdf = excelToPdf(workbook);
78
+ ```bash
79
+ npm install @cj-tech-master/excelts
192
80
  ```
193
81
 
194
- ### Encryption
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
- ```
82
+ ## Quick Start
205
83
 
206
- ### Unicode / CJK
84
+ ```typescript
85
+ import { Workbook } from "@cj-tech-master/excelts";
207
86
 
208
- ```javascript
209
- import { readFileSync } from "fs";
87
+ // Create
88
+ const workbook = new Workbook();
89
+ const sheet = workbook.addWorksheet("Sheet1");
90
+ sheet.addRow(["Name", "Age"]);
91
+ sheet.addRow(["Alice", 30]);
92
+ await workbook.xlsx.writeFile("output.xlsx");
210
93
 
211
- const pdf = excelToPdf(workbook, {
212
- font: readFileSync("NotoSansSC-Regular.ttf") // TrueType font for CJK text
213
- });
94
+ // Read
95
+ const wb = new Workbook();
96
+ await wb.xlsx.readFile("output.xlsx");
97
+ wb.getWorksheet(1).eachRow((row, n) => console.log(n, row.values));
214
98
  ```
215
99
 
216
- ### Standalone PDF (No Excel)
217
-
218
- Generate PDFs from plain data — no workbook, no Map objects, no boilerplate:
219
-
220
- ```javascript
100
+ ```typescript
101
+ // PDF — generate from data, no Workbook needed
221
102
  import { pdf } from "@cj-tech-master/excelts/pdf";
222
-
223
- // Simplest — pass a 2D array
224
- const bytes = pdf([
103
+ const pdfBytes = pdf([
225
104
  ["Product", "Revenue"],
226
- ["Widget", 1000],
227
- ["Gadget", 2500]
105
+ ["Widget", 1000]
228
106
  ]);
229
107
 
230
- // With column widths and styled cells
231
- const bytes = pdf(
232
- {
233
- name: "Report",
234
- columns: [
235
- { width: 25, header: "Product" },
236
- { width: 15, header: "Revenue" }
237
- ],
238
- data: [
239
- ["Widget", 1000],
240
- ["Gadget", 2500]
241
- ]
242
- },
243
- { showGridLines: true }
244
- );
245
- ```
246
-
247
- For the full API reference and all options, see the [PDF Module documentation](src/modules/pdf/README.md).
108
+ // PDF read text, images, and metadata from any PDF
109
+ import { readPdf } from "@cj-tech-master/excelts/pdf";
110
+ const result = readPdf(pdfBytes);
111
+ console.log(result.text); // extracted text
112
+ console.log(result.metadata); // title, author, etc.
248
113
 
249
- ## Archive Utilities (ZIP/TAR)
114
+ // CSV parse and format
115
+ import { parseCsv, formatCsv } from "@cj-tech-master/excelts/csv";
116
+ const rows = parseCsv("name,age\nAlice,30", { headers: true });
117
+ const csv = formatCsv([{ name: "Bob", age: 25 }], { headers: true });
250
118
 
251
- ExcelTS includes internal ZIP/TAR utilities used by the XLSX pipeline. If you use the
252
- archive APIs directly, ZIP string encoding can be customized via `ZipStringEncoding`:
119
+ // XML parse, query, write
120
+ import { parseXml, queryAll, XmlWriter } from "@cj-tech-master/excelts/xml";
121
+ const titles = queryAll(parseXml(xmlString).root, "book/title");
253
122
 
254
- - Default: `"utf-8"`
255
- - Legacy: `"cp437"`
256
- - Custom: provide a codec with `encode`/`decode` plus optional flags
123
+ // ZIP — create and extract
124
+ import { zip, unzip } from "@cj-tech-master/excelts/zip";
125
+ const archive = await zip().add("hello.txt", "Hello!").bytes();
257
126
 
258
- When a non-UTF-8 encoding is used, Unicode extra fields can be emitted for better
259
- cross-tool compatibility.
260
-
261
- ## XML Toolkit
262
-
263
- ExcelTS includes a standalone, zero-dependency XML module with streaming and buffered parsing/writing. It powers the XLSX pipeline internally and is available as a standalone subpath export.
264
-
265
- ### Key Features
127
+ // Markdown parse and format tables
128
+ import { parseMarkdown, formatMarkdown } from "@cj-tech-master/excelts/markdown";
129
+ const table = parseMarkdown("| A | B |\n|---|---|\n| 1 | 2 |");
130
+ ```
266
131
 
267
- - **SAX Parser** — Event-driven streaming parser with high throughput
268
- - **DOM Parser** — Build a queryable XML tree from a string
269
- - **Query Engine** — Simplified path expressions (`a/b[@id='1']`, `a//c`, `a/b[0]`)
270
- - **Dual-Mode Writer** — Buffered (`XmlWriter`) and streaming (`XmlStreamWriter`)
271
- - **Full Namespace Support** — Prefix resolution, reserved namespace enforcement, unbound prefix detection
272
- - **Security Hardened** — Entity expansion limits, nesting depth limits, duplicate attribute rejection, BOM handling
132
+ ## Subpath Exports
273
133
 
274
- ### Quick Example
134
+ Each module is available as a standalone subpath export:
275
135
 
276
136
  ```typescript
137
+ import { Workbook, WorkbookWriter } from "@cj-tech-master/excelts";
138
+ import { pdf, readPdf, excelToPdf } from "@cj-tech-master/excelts/pdf";
277
139
  import { SaxParser, parseXml, XmlWriter, query } from "@cj-tech-master/excelts/xml";
278
-
279
- // SAX streaming parse
280
- const parser = new SaxParser();
281
- parser.on("opentag", tag => console.log(tag.name, tag.attributes));
282
- parser.write('<root><item id="1">hello</item></root>');
283
- parser.close();
284
-
285
- // DOM parse + query
286
- const doc = parseXml("<root><a><b>1</b><b>2</b></a></root>");
287
- const items = queryAll(doc.root, "a/b"); // all <b> elements
288
-
289
- // Write XML
290
- const w = new XmlWriter();
291
- w.openXml();
292
- w.openNode("root");
293
- w.leafNode("item", { id: "1" }, "hello");
294
- w.closeNode();
295
- console.log(w.xml);
296
- ```
297
-
298
- For the full API reference, see the [XML Module documentation](src/modules/xml/README.md).
299
-
300
- ### Editing an existing ZIP (ZipEditor)
301
-
302
- ExcelTS also includes a ZIP editor that can apply filesystem-like edits to an existing archive
303
- and then output a new ZIP.
304
-
305
- - Supports `set()`, `delete()`, `rename()`, `deleteDirectory()`, `setComment()`
306
- - Unchanged entries are passed through efficiently when possible
307
-
308
- ```js
309
- import { editZip } from "@cj-tech-master/excelts";
310
-
311
- const editor = await editZip(existingZipBytes, {
312
- reproducible: true,
313
-
314
- // Passthrough behavior for unchanged entries:
315
- // - "strict" (default): raw passthrough must be available or it throws
316
- // - "best-effort": if raw passthrough is unavailable, fall back to extract+re-add
317
- preserve: "best-effort",
318
- onWarning: w => console.warn(w.code, w.entry, w.message)
319
- });
320
-
321
- editor.delete("old.txt");
322
- editor.rename("a.txt", "renamed.txt");
323
- editor.set("new.txt", "hello");
324
-
325
- const out = await editor.bytes();
326
- ```
327
-
328
- ## Streaming API
329
-
330
- For processing large Excel files without loading them entirely into memory, ExcelTS provides streaming reader and writer APIs.
331
-
332
- - **Node.js**: `WorkbookReader` supports reading from a file path, and `WorkbookWriter` supports writing to a filename.
333
- - **Browsers**: use `Uint8Array` / `ArrayBuffer` / Web `ReadableStream<Uint8Array>` for reading, and Web `WritableStream<Uint8Array>` for writing.
334
- - Note: ExcelTS does not re-export the internal stream utility surface (e.g. `Readable`, `Writable`). Prefer standard Web Streams (browser/Node 22+) or Node.js streams.
335
-
336
- ### Streaming Reader
337
-
338
- Read large XLSX files with minimal memory usage:
339
-
340
- ```javascript
341
- import { WorkbookReader } from "@cj-tech-master/excelts";
342
-
343
- // Node.js: read from file path
344
- const reader = new WorkbookReader("large-file.xlsx", {
345
- worksheets: "emit", // emit worksheet events
346
- sharedStrings: "cache", // cache shared strings for cell values
347
- hyperlinks: "ignore", // ignore hyperlinks
348
- styles: "ignore" // ignore styles for faster parsing
349
- });
350
-
351
- for await (const worksheet of reader) {
352
- console.log(`Reading: ${worksheet.name}`);
353
- for await (const row of worksheet) {
354
- console.log(row.values);
355
- }
356
- }
357
- ```
358
-
359
- ### Streaming Writer
360
-
361
- Write large XLSX files row by row:
362
-
363
- ```javascript
364
- import { WorkbookWriter } from "@cj-tech-master/excelts";
365
-
366
- // Node.js: write to filename
367
- const workbook = new WorkbookWriter({
368
- filename: "output.xlsx",
369
- useSharedStrings: true,
370
- useStyles: true
371
- });
372
-
373
- const sheet = workbook.addWorksheet("Data");
374
-
375
- // Write rows one at a time
376
- for (let i = 0; i < 1000000; i++) {
377
- sheet.addRow([`Row ${i}`, i, new Date()]).commit();
378
- }
379
-
380
- // Commit worksheet and finalize
381
- sheet.commit();
382
- await workbook.commit();
383
- ```
384
-
385
- ### Web Streams (Node.js 22+ and Browsers)
386
-
387
- `WorkbookWriter` can write to a Web `WritableStream<Uint8Array>`, and `WorkbookReader` can read from a Web `ReadableStream<Uint8Array>`.
388
-
389
- This does **not** require importing any extra stream utility surface from ExcelTS; it uses the standard Web Streams API.
390
-
391
- - Full runnable example: [src/modules/excel/examples/web-streams-reader-writer.ts](src/modules/excel/examples/web-streams-reader-writer.ts)
392
-
393
- Run locally (Node.js 22+):
394
-
395
- ```bash
396
- npx tsx src/modules/excel/examples/web-streams-reader-writer.ts
397
- ```
398
-
399
- Minimal end-to-end snippet:
400
-
401
- ```javascript
402
- import { WorkbookWriter, WorkbookReader } from "@cj-tech-master/excelts";
403
-
404
- // 1) Write workbook -> Web WritableStream
405
- const chunks = [];
406
- const writable = new WritableStream({
407
- write(chunk) {
408
- chunks.push(chunk);
409
- }
410
- });
411
-
412
- const writer = new WorkbookWriter({ stream: writable });
413
- const sheet = writer.addWorksheet("Sheet1");
414
- sheet.addRow(["Name", "Score"]).commit();
415
- sheet.addRow(["Alice", 98]).commit();
416
- await sheet.commit();
417
- await writer.commit();
418
-
419
- // 2) Read workbook <- Web ReadableStream
420
- const bytes = new Uint8Array(chunks.reduce((n, c) => n + c.length, 0));
421
- let offset = 0;
422
- for (const c of chunks) {
423
- bytes.set(c, offset);
424
- offset += c.length;
425
- }
426
-
427
- const readable = new ReadableStream({
428
- start(controller) {
429
- controller.enqueue(bytes);
430
- controller.close();
431
- }
432
- });
433
-
434
- const reader = new WorkbookReader(readable, { worksheets: "emit" });
435
- for await (const ws of reader) {
436
- for await (const row of ws) {
437
- console.log(row.values);
438
- }
439
- }
440
- ```
441
-
442
- ## CSV Support
443
-
444
- ### Node.js (Full Streaming Support)
445
-
446
- ```javascript
447
- import { Workbook } from "@cj-tech-master/excelts";
448
- import fs from "fs";
449
-
450
- const workbook = new Workbook();
451
-
452
- // Read CSV from file
453
- await workbook.readCsvFile("data.csv");
454
-
455
- // Read CSV from stream
456
- const stream = fs.createReadStream("data.csv");
457
- await workbook.readCsv(stream, { sheetName: "Imported" });
458
-
459
- // Write CSV to file
460
- await workbook.writeCsvFile("output.csv");
461
-
462
- // Write CSV to stream
463
- const writeStream = fs.createWriteStream("output.csv");
464
- await workbook.writeCsv(writeStream);
465
-
466
- // Write CSV to string / bytes
467
- const csvText = workbook.writeCsv();
468
- const bytes = await workbook.writeCsvBuffer();
140
+ import { zip, unzip, ZipArchive, compress } from "@cj-tech-master/excelts/zip";
141
+ import { parseCsv, formatCsv, CsvParserStream } from "@cj-tech-master/excelts/csv";
142
+ import { parseMarkdown, formatMarkdown, parseMarkdownAll } from "@cj-tech-master/excelts/markdown";
143
+ import { Readable, pipeline, createTransform } from "@cj-tech-master/excelts/stream";
469
144
  ```
470
145
 
471
- ### Browser (In-Memory)
472
-
473
- ```javascript
474
- import { Workbook } from "@cj-tech-master/excelts";
475
-
476
- const workbook = new Workbook();
477
-
478
- // Read CSV from string
479
- await workbook.readCsv(csvString);
480
-
481
- // Read CSV from ArrayBuffer (e.g., from fetch)
482
- const response = await fetch("data.csv");
483
- const arrayBuffer = await response.arrayBuffer();
484
- await workbook.readCsv(arrayBuffer);
485
-
486
- // Read CSV from File (e.g., <input type="file">)
487
- await workbook.readCsv(file);
488
-
489
- // Write CSV to string
490
- const csvOutput = workbook.writeCsv();
491
-
492
- // Write CSV to Uint8Array bytes
493
- const bytes = await workbook.writeCsvBuffer();
494
- ```
146
+ Each subpath supports `browser`, `import` (ESM), and `require` (CJS) conditions.
495
147
 
496
148
  ## Browser Support
497
149
 
498
- ExcelTS has native browser support with **zero configuration** required for modern bundlers.
499
-
500
- ### Using with Bundlers (Vite, Webpack, Rollup, esbuild)
150
+ ExcelTS has native browser support with **zero configuration** for modern bundlers.
501
151
 
502
- Simply import ExcelTS - no polyfills or configuration needed:
503
-
504
- ```javascript
152
+ ```typescript
153
+ // Bundlers (Vite, Webpack, Rollup, esbuild) — just import
505
154
  import { Workbook } from "@cj-tech-master/excelts";
506
-
507
- const workbook = new Workbook();
508
- const sheet = workbook.addWorksheet("Sheet1");
509
- sheet.getCell("A1").value = "Hello, Browser!";
510
-
511
- // Write to buffer and download
512
- const buffer = await workbook.xlsx.writeBuffer();
513
- const blob = new Blob([buffer], {
514
- type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
515
- });
516
- const url = URL.createObjectURL(blob);
517
- // ... trigger download
155
+ const buffer = await new Workbook().addWorksheet("S1").workbook.xlsx.writeBuffer();
518
156
  ```
519
157
 
520
- ### Using with Script Tags (No Bundler)
521
-
522
158
  ```html
159
+ <!-- Script tag (no bundler) -->
523
160
  <script src="https://unpkg.com/@cj-tech-master/excelts/dist/iife/excelts.iife.min.js"></script>
524
- <script>
525
- const { Workbook } = ExcelTS;
526
- const wb = new Workbook();
527
- // ... use workbook API
528
- </script>
529
161
  ```
530
162
 
531
- ### Manual Browser Example (Local)
532
-
533
- For a quick manual smoke test in a real browser (create/download/read XLSX, worksheet protection, etc.), use:
534
-
535
- - [src/modules/excel/examples/browser-smoke.html](src/modules/excel/examples/browser-smoke.html)
536
-
537
- Steps:
538
-
539
- ```bash
540
- npm run build:browser:bundle
541
- npx serve .
542
- ```
543
-
544
- Then open `http://localhost:3000/src/modules/excel/examples/browser-smoke.html`.
545
-
546
- ### Browser-Specific Notes
547
-
548
- - **PDF export is fully supported** in browsers with zero configuration
549
- - **CSV operations are supported** using native RFC 4180 implementation
550
- - Use `await workbook.readCsv(input)` to read CSV
551
- - Use `workbook.writeCsv()` or `await workbook.writeCsvBuffer()` to write CSV
552
- - Use `xlsx.load(arrayBuffer)` instead of `xlsx.readFile()`
553
- - Use `xlsx.writeBuffer()` instead of `xlsx.writeFile()`
554
- - Worksheet protection with passwords is fully supported (pure JS SHA-512)
555
-
556
- ## Utility Exports
557
-
558
- The main entry also exports commonly useful utilities:
559
-
560
- ```typescript
561
- import {
562
- // Excel date conversion
563
- dateToExcel, // JS Date -> Excel serial number
564
- excelToDate, // Excel serial number -> JS Date
565
-
566
- // Date parsing/formatting (high-performance, zero-dep)
567
- DateParser, // Batch date parser with format auto-detection
568
- DateFormatter, // Batch date formatter
569
-
570
- // Binary utilities (cross-platform)
571
- base64ToUint8Array,
572
- uint8ArrayToBase64,
573
- concatUint8Arrays,
574
- toUint8Array,
575
- stringToUint8Array,
576
- uint8ArrayToString,
577
-
578
- // XML utilities
579
- xmlEncode,
580
- xmlDecode,
581
- xmlEncodeAttr,
582
- validateXmlName,
583
-
584
- // PDF export
585
- pdf, // Simplest: pdf([["A", 1], ["B", 2]]) → Uint8Array
586
- excelToPdf, // Workbook -> Uint8Array (Excel-to-PDF)
587
- PageSizes, // Built-in page size definitions
588
- PdfError, // Base PDF error
589
- PdfRenderError, // Layout/rendering failures
590
- PdfFontError, // Font parsing/embedding failures
591
- PdfStructureError, // PDF structure assembly failures
592
- isPdfError, // Type guard for PDF errors
593
-
594
- // Error infrastructure
595
- BaseError, // Base class for all library errors
596
- ExcelError, // Base Excel error (instanceof checks)
597
- toError, // Normalize unknown -> Error
598
- errorToJSON, // Serialize error (with cause chain)
599
- getErrorChain, // Get full error cause chain as array
600
- getRootCause // Get deepest error in cause chain
601
- } from "@cj-tech-master/excelts";
602
- ```
163
+ For older browsers without native `CompressionStream` API, ExcelTS automatically uses a built-in pure JavaScript DEFLATE implementation — no polyfills needed.
603
164
 
604
165
  ## Requirements
605
166
 
606
- ### Node.js
607
-
608
- - **Node.js >= 22.0.0** (ES2020 native support)
609
-
610
- ### Browsers (No Polyfills Required)
611
-
612
- - **Chrome >= 89** (March 2021)
613
- - **Edge >= 89** (March 2021)
614
- - **Firefox >= 102** (June 2022)
615
- - **Safari >= 14.1** (April 2021)
616
- - **Opera >= 75** (March 2021)
617
-
618
- For older browsers without native `CompressionStream` API (Firefox < 113, Safari < 16.4), ExcelTS automatically uses a built-in pure JavaScript DEFLATE implementation - no configuration or polyfills needed.
167
+ - **Node.js >= 22.0.0**
619
168
 
620
- ExcelTS does **not** require `crypto.randomUUID()` in browsers; it uses an internal UUID v4 generator with a `crypto.getRandomValues()` fallback.
621
-
622
- ## API Documentation
623
-
624
- For detailed API documentation, please refer to the comprehensive documentation sections:
625
-
626
- - Workbook Management
627
- - Worksheets
628
- - Cells and Values
629
- - Styling
630
- - Formulas
631
- - Data Validation
632
- - Conditional Formatting
633
- - File I/O
634
-
635
- ## License
636
-
637
- MIT License
638
-
639
- See LICENSE.
640
-
641
- Third-party software notices and attributions are provided in THIRD_PARTY_NOTICES.md.
169
+ | Browser | Minimum Version |
170
+ | ------- | ------------------ |
171
+ | Chrome | 89+ (March 2021) |
172
+ | Edge | 89+ (March 2021) |
173
+ | Firefox | 102+ (June 2022) |
174
+ | Safari | 14.1+ (April 2021) |
175
+ | Opera | 75+ (March 2021) |
642
176
 
643
177
  ## Links
644
178
 
645
- - [GitHub Repository](https://github.com/cjnoname/excelts)
646
- - [Issue Tracker](https://github.com/cjnoname/excelts/issues)
647
-
648
- ## Changelog
649
-
650
- See [CHANGELOG.md](CHANGELOG.md) for detailed version history.
179
+ - 🏠 [GitHub Repository](https://github.com/cjnoname/excelts)
180
+ - 🐛 [Issue Tracker](https://github.com/cjnoname/excelts/issues)
181
+ - 📋 [Changelog](CHANGELOG.md)
182
+ - 🔄 [Migration Guide](MIGRATION.md)
183
+ - 🗺️ [Roadmap](ROADMAP.md)
184
+ - 📄 [License (MIT)](LICENSE)
185
+ - 📦 [Third-Party Notices](THIRD_PARTY_NOTICES.md)