styled-exceljs 0.21.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.
@@ -0,0 +1,371 @@
1
+ # XLSX / XLS 视觉保真扩展
2
+
3
+ 本文档说明本版本在 SheetJS 兼容工作表模型上新增的浏览器渲染元数据。
4
+ 默认读取行为保持轻量和兼容;完整视觉信息需要通过显式选项启用。
5
+
6
+ 从官方 npm registry 安装:
7
+
8
+ ```bash
9
+ npm install styled-exceljs
10
+ ```
11
+
12
+ ## 快速使用
13
+
14
+ ```js
15
+ const wb = XLSX.read(data, {
16
+ type: "buffer",
17
+ cellStyles: true,
18
+ browserPixels: true,
19
+ charts: true,
20
+ drawings: true,
21
+ validateMerges: true
22
+ });
23
+
24
+ const ws = wb.Sheets[wb.SheetNames[0]];
25
+ const html = XLSX.utils.sheet_to_html(ws, {
26
+ cellStyles: true,
27
+ browserPixels: true,
28
+ charts: true,
29
+ drawings: true
30
+ });
31
+ ```
32
+
33
+ 这些选项同样适用于 XLSX / XLSM 和 BIFF8 XLS。BIFF2-5 会尽量映射已有
34
+ 样式和尺寸信息,但重点支持目标是 BIFF8 / Excel 97-2003。
35
+
36
+ ## 选项
37
+
38
+ | 选项 | 适用位置 | 作用 |
39
+ | --- | --- | --- |
40
+ | `cellStyles` | 读取 / HTML | 将完整样式解析到 `cell.s`,并读取行样式和列样式。 |
41
+ | `browserPixels` | 读取 / HTML | 按 XLSX / XLS 规范将列宽、行高换算为浏览器 CSS 像素。 |
42
+ | `charts` | 读取 / HTML | 解析图表模型,并将支持的图表类型以内联 SVG 渲染。 |
43
+ | `drawings` | 读取 / HTML | 解析图片、绘图锚点,支持的内嵌图片渲染为 `<img>`。 |
44
+ | `validateMerges` | 读取 | 读取时校验合并单元格,发现非法、重复、重叠或越界范围时抛错。 |
45
+ | `WTF` | 读取 / 工具函数 | 遇到不支持或非法记录时抛错,而不是保留 fallback 信息。 |
46
+
47
+ 默认不开启 `charts` / `drawings`,避免普通读取路径解析重型绘图和图表关系。
48
+
49
+ ## 工作表字段
50
+
51
+ ### 样式 `cell.s`
52
+
53
+ 开启 `cellStyles:true` 后,单元格会暴露解析后的完整样式对象:
54
+
55
+ ```ts
56
+ interface CellStyle {
57
+ id?: number;
58
+ xf?: any;
59
+ numFmtId?: number;
60
+ numFmt?: string;
61
+ font?: FontStyle;
62
+ fill?: FillStyle;
63
+ border?: BorderStyle;
64
+ alignment?: AlignmentStyle;
65
+ protection?: ProtectionStyle;
66
+ patternType?: string;
67
+ fgColor?: StyleColor;
68
+ bgColor?: StyleColor;
69
+ }
70
+ ```
71
+
72
+ `font`、`fill`、`border`、`alignment`、`protection` 和 `numFmt` 在 XLSX
73
+ 和 XLS BIFF8 之间归一化。`fgColor`、`bgColor`、`patternType` 保留为
74
+ 兼容旧集成的别名字段。
75
+
76
+ 颜色结构会尽量同时保留解析后的 RGB 和原始来源信息:
77
+
78
+ ```ts
79
+ interface StyleColor {
80
+ rgb?: string;
81
+ theme?: number;
82
+ tint?: number;
83
+ indexed?: number;
84
+ index?: number;
85
+ auto?: boolean;
86
+ raw_rgb?: string;
87
+ }
88
+ ```
89
+
90
+ XLSX 颜色支持 `rgb`、`theme`、`indexed`、`tint`;XLS 颜色按 palette /
91
+ theme / XFExt 尽量解析并映射到同一结构。
92
+
93
+ ### 字体
94
+
95
+ ```ts
96
+ interface FontStyle {
97
+ name?: string;
98
+ sz?: number;
99
+ color?: StyleColor;
100
+ bold?: boolean;
101
+ italic?: boolean;
102
+ underline?: boolean | string;
103
+ strike?: boolean;
104
+ outline?: boolean;
105
+ shadow?: boolean;
106
+ vertAlign?: "superscript" | "subscript" | "baseline" | string;
107
+ family?: number;
108
+ scheme?: "major" | "minor" | "none" | string;
109
+ charset?: number;
110
+ }
111
+ ```
112
+
113
+ ### 填充
114
+
115
+ ```ts
116
+ interface FillStyle {
117
+ patternType?: string;
118
+ fgColor?: StyleColor;
119
+ bgColor?: StyleColor;
120
+ gradient?: any;
121
+ }
122
+ ```
123
+
124
+ 普通纯色、图案填充和可解析的渐变信息会保留在 `fill` 中;无法可靠还原的
125
+ 高级填充会保留原始信息,供上层渲染器继续处理。
126
+
127
+ ### 边框
128
+
129
+ ```ts
130
+ interface BorderStyle {
131
+ left?: BorderPr;
132
+ right?: BorderPr;
133
+ top?: BorderPr;
134
+ bottom?: BorderPr;
135
+ diagonal?: BorderPr;
136
+ diagonalUp?: boolean;
137
+ diagonalDown?: boolean;
138
+ outline?: boolean;
139
+ }
140
+
141
+ interface BorderPr {
142
+ style?: string;
143
+ color?: StyleColor;
144
+ }
145
+ ```
146
+
147
+ HTML 渲染会将常见边框样式转换为 CSS border。无法精确表达的边框会选择
148
+ 浏览器中接近的样式,同时保留原始样式名。
149
+
150
+ ### 对齐和保护
151
+
152
+ ```ts
153
+ interface AlignmentStyle {
154
+ horizontal?: string;
155
+ vertical?: string;
156
+ textRotation?: number;
157
+ wrapText?: boolean;
158
+ shrinkToFit?: boolean;
159
+ indent?: number;
160
+ readingOrder?: number;
161
+ }
162
+
163
+ interface ProtectionStyle {
164
+ locked?: boolean;
165
+ hidden?: boolean;
166
+ }
167
+ ```
168
+
169
+ HTML 输出支持水平 / 垂直对齐、换行、缩小字体、缩进、文字旋转等常见浏览器
170
+ 可表达属性。
171
+
172
+ ## 行列尺寸
173
+
174
+ `ws["!cols"]` 和 `ws["!rows"]` 会暴露浏览器友好的尺寸字段:
175
+
176
+ ```ts
177
+ interface ColInfo {
178
+ hidden?: boolean;
179
+ width?: number;
180
+ wpx?: number;
181
+ wch?: number;
182
+ MDW?: number;
183
+ level?: number;
184
+ style?: number | string;
185
+ s?: CellStyle;
186
+ }
187
+
188
+ interface RowInfo {
189
+ hidden?: boolean;
190
+ hpx?: number;
191
+ hpt?: number;
192
+ level?: number;
193
+ ixfe?: number;
194
+ s?: CellStyle;
195
+ }
196
+ ```
197
+
198
+ 列宽遵循 XLSX 列宽公式和 Normal 字体 MDW。行高按 points / twips 转换为
199
+ 96 CSS px/in 下的像素值。
200
+
201
+ 公开换算工具:
202
+
203
+ ```js
204
+ XLSX.utils.col_width_to_px(width);
205
+ XLSX.utils.px_to_col_width(px);
206
+ XLSX.utils.row_height_to_px(points);
207
+ XLSX.utils.px_to_row_height(px);
208
+ ```
209
+
210
+ ## 图片和绘图
211
+
212
+ 开启 `drawings:true` 后,工作表可能暴露 `ws["!drawings"]`:
213
+
214
+ ```ts
215
+ interface DrawingInfo {
216
+ raw?: any;
217
+ chart?: string;
218
+ charts?: ChartInfo[];
219
+ images?: DrawingImage[];
220
+ shapes?: DrawingShape[];
221
+ groups?: boolean;
222
+ }
223
+
224
+ interface DrawingImage {
225
+ id?: string;
226
+ rel?: DrawingRelationship;
227
+ objectId?: number;
228
+ biffType?: string;
229
+ target?: string;
230
+ path?: string;
231
+ anchor?: DrawingAnchor;
232
+ dataURI?: string;
233
+ contentType?: string;
234
+ raw?: any;
235
+ }
236
+
237
+ interface DrawingShape {
238
+ id?: string;
239
+ objectId?: number;
240
+ biffType?: string;
241
+ anchor?: DrawingAnchor;
242
+ text?: string;
243
+ svg?: string;
244
+ raw?: any;
245
+ }
246
+ ```
247
+
248
+ 支持的 PNG / JPEG / DIB 内嵌图片会生成浏览器可直接使用的 `dataURI`。
249
+ WMF / EMF、复杂 OfficeArt 形状、组合形状和无法稳定转换的绘图会保留在
250
+ `raw` / `shapes` fallback 中,便于上层项目二次渲染。
251
+
252
+ ## 图表
253
+
254
+ 开启 `charts:true` 后:
255
+
256
+ - 普通工作表上的嵌入图表保存在 `ws["!charts"]`
257
+ - 图表工作表的主图表保存在 `ws["!chart"]`
258
+
259
+ ```ts
260
+ interface ChartInfo {
261
+ id?: string;
262
+ rel?: DrawingRelationship;
263
+ objectId?: number;
264
+ biffType?: string;
265
+ target?: string;
266
+ path?: string;
267
+ title?: string;
268
+ anchor?: DrawingAnchor;
269
+ model?: ChartModel;
270
+ data?: WorkSheet;
271
+ raw?: any;
272
+ }
273
+
274
+ interface ChartModel {
275
+ target?: string;
276
+ raw?: any;
277
+ rels?: any;
278
+ type?: string;
279
+ grouping?: string;
280
+ title?: string;
281
+ legend?: ChartLegend;
282
+ series?: ChartSeries[];
283
+ }
284
+
285
+ interface ChartSeries {
286
+ name?: string;
287
+ color?: string;
288
+ cat?: ChartCache;
289
+ val?: ChartCache;
290
+ xVal?: ChartCache;
291
+ yVal?: ChartCache;
292
+ bubbleSize?: ChartCache;
293
+ }
294
+ ```
295
+
296
+ 浏览器 SVG 渲染覆盖常见柱状图 / 条形图、折线图、面积图、散点图、饼图、
297
+ 圆环图、气泡图和组合图。3D、雷达图、曲面图、chartEx 和复杂 OfficeArt
298
+ 图表保留 raw 元数据和 fallback 信息。
299
+
300
+ ## 合并单元格校验
301
+
302
+ `XLSX.utils.validate_merges(ws, opts)` 会返回合并范围错误列表:
303
+
304
+ ```ts
305
+ interface MergeError {
306
+ code: string;
307
+ message: string;
308
+ index: number;
309
+ other?: number;
310
+ range?: string | Range;
311
+ otherRange?: string;
312
+ ref?: string;
313
+ }
314
+ ```
315
+
316
+ 可检测问题包括:
317
+
318
+ - 非法范围
319
+ - 重复范围
320
+ - 范围重叠
321
+ - 超出 `!ref` 或格式限制
322
+
323
+ 宽容读取会把非致命错误放在 `ws["!mergeErrors"]`。读取时使用
324
+ `validateMerges:true` 或工具函数使用 `{WTF:true}` 会直接抛错。
325
+
326
+ ## HTML 输出
327
+
328
+ ```js
329
+ XLSX.utils.sheet_to_html(ws, {
330
+ cellStyles: true,
331
+ browserPixels: true,
332
+ charts: true,
333
+ drawings: true
334
+ });
335
+ ```
336
+
337
+ 开启视觉选项后,HTML 输出会尽量包含:
338
+
339
+ - `<colgroup>` 列宽
340
+ - 行高 CSS
341
+ - 字体、字号、颜色、填充、边框
342
+ - 水平 / 垂直对齐、换行、缩进、旋转
343
+ - 隐藏行列
344
+ - 合并单元格的 `rowspan` / `colspan`
345
+ - 绝对定位图片层
346
+ - 内联 SVG 图表
347
+
348
+ 渲染器不会为了行样式或列样式物化整张空白网格。真实单元格渲染时会按
349
+ cell XF > row XF > column XF > default XF 的思路合成最终样式。
350
+
351
+ ## 完整度报告
352
+
353
+ 仓库提供本地完整度报告脚本:
354
+
355
+ ```bash
356
+ node misc/visual_matrix.js
357
+ ```
358
+
359
+ 脚本会用视觉选项读取代表性 XLS / XLSX fixture,并输出以下能力状态:
360
+
361
+ - 值和公式
362
+ - 样式
363
+ - 行列尺寸
364
+ - 合并单元格
365
+ - 超链接和批注
366
+ - 图片和绘图
367
+ - 图表模型
368
+ - HTML 渲染
369
+
370
+ 状态包括 `supported`、`partial`、`raw-fallback` 和 `unsupported`。默认读取
371
+ 路径也会被检查,确保重型绘图和图表不会在未显式开启选项时被解析。
package/package.json ADDED
@@ -0,0 +1,191 @@
1
+ {
2
+ "name": "styled-exceljs",
3
+ "version": "0.21.0",
4
+ "author": "sheetjs",
5
+ "description": "SheetJS Spreadsheet data parser and writer",
6
+ "keywords": [
7
+ "excel",
8
+ "xls",
9
+ "xlsx",
10
+ "xlsb",
11
+ "xlsm",
12
+ "ods",
13
+ "csv",
14
+ "dbf",
15
+ "dif",
16
+ "sylk",
17
+ "office",
18
+ "spreadsheet"
19
+ ],
20
+ "bin": {
21
+ "xlsx": "bin/xlsx.njs"
22
+ },
23
+ "main": "xlsx.js",
24
+ "module": "xlsx.mjs",
25
+ "unpkg": "dist/xlsx.full.min.js",
26
+ "jsdelivr": "dist/xlsx.full.min.js",
27
+ "types": "types/index.d.ts",
28
+ "exports": {
29
+ ".": {
30
+ "import": "./xlsx.mjs",
31
+ "require": "./xlsx.js",
32
+ "types": "./types/index.d.ts"
33
+ },
34
+ "./xlsx.mjs": {
35
+ "import": "./xlsx.mjs",
36
+ "types": "./types/index.d.ts"
37
+ },
38
+ "./xlsx.js": {
39
+ "require": "./xlsx.js",
40
+ "types": "./types/index.d.ts"
41
+ },
42
+ "./dist/xlsx.core.min": {
43
+ "import": "./dist/xlsx.core.min.js",
44
+ "require": "./dist/xlsx.core.min.js",
45
+ "types": "./types/index.d.ts"
46
+ },
47
+ "./dist/xlsx.core.min.js": {
48
+ "import": "./dist/xlsx.core.min.js",
49
+ "require": "./dist/xlsx.core.min.js",
50
+ "types": "./types/index.d.ts"
51
+ },
52
+ "./dist/xlsx.full.min": {
53
+ "import": "./dist/xlsx.full.min.js",
54
+ "require": "./dist/xlsx.full.min.js",
55
+ "types": "./types/index.d.ts"
56
+ },
57
+ "./dist/xlsx.full.min.js": {
58
+ "import": "./dist/xlsx.full.min.js",
59
+ "require": "./dist/xlsx.full.min.js",
60
+ "types": "./types/index.d.ts"
61
+ },
62
+ "./dist/xlsx.mini.min": {
63
+ "import": "./dist/xlsx.mini.min.js",
64
+ "require": "./dist/xlsx.mini.min.js",
65
+ "types": "./types/index.d.ts"
66
+ },
67
+ "./dist/xlsx.mini.min.js": {
68
+ "import": "./dist/xlsx.mini.min.js",
69
+ "require": "./dist/xlsx.mini.min.js",
70
+ "types": "./types/index.d.ts"
71
+ },
72
+ "./dist/xlsx.zahl": {
73
+ "import": "./dist/xlsx.zahl.mjs",
74
+ "require": "./dist/xlsx.zahl.js",
75
+ "types": "./dist/zahl.d.ts"
76
+ },
77
+ "./dist/xlsx.zahl.mjs": {
78
+ "import": "./dist/xlsx.zahl.mjs",
79
+ "types": "./dist/zahl.d.ts"
80
+ },
81
+ "./dist/xlsx.zahl.js": {
82
+ "require": "./dist/xlsx.zahl.js",
83
+ "types": "./dist/zahl.d.ts"
84
+ },
85
+ "./dist/cpexcel": {
86
+ "import": "./dist/cpexcel.full.mjs",
87
+ "require": "./dist/cpexcel.js",
88
+ "types": "./dist/cpexcel.d.ts"
89
+ },
90
+ "./dist/cpexcel.js": {
91
+ "require": "./dist/cpexcel.js",
92
+ "types": "./dist/cpexcel.d.ts"
93
+ },
94
+ "./dist/cpexcel.full": {
95
+ "import": "./dist/cpexcel.full.mjs",
96
+ "require": "./dist/cpexcel.js",
97
+ "types": "./dist/cpexcel.d.ts"
98
+ },
99
+ "./dist/cpexcel.full.mjs": {
100
+ "import": "./dist/cpexcel.full.mjs",
101
+ "types": "./dist/cpexcel.d.ts"
102
+ }
103
+ },
104
+ "browser": {
105
+ "buffer": false,
106
+ "crypto": false,
107
+ "stream": false,
108
+ "process": false,
109
+ "fs": false
110
+ },
111
+ "sideEffects": false,
112
+ "devDependencies": {
113
+ "@sheetjs/uglify-js": "~2.7.3",
114
+ "@types/node": "8.5.9",
115
+ "acorn": "7.4.1",
116
+ "adler-32": "~1.3.1",
117
+ "alex": "8.1.1",
118
+ "blanket": "~1.2.3",
119
+ "cfb": "~1.2.2",
120
+ "codepage": "~1.15.0",
121
+ "commander": "~2.17.1",
122
+ "crc-32": "~1.2.2",
123
+ "dtslint": "^0.1.2",
124
+ "eslint": "7.23.0",
125
+ "eslint-plugin-html": "^6.1.2",
126
+ "eslint-plugin-json": "^2.1.2",
127
+ "exit-on-epipe": "~1.0.1",
128
+ "fflate": "^0.7.1",
129
+ "jsdom": "~11.1.0",
130
+ "markdown-spellcheck": "^1.3.1",
131
+ "mocha": "~2.5.3",
132
+ "sinon": "^1.17.7",
133
+ "ssf": "~0.11.2",
134
+ "typescript": "2.2.0",
135
+ "wmf": "~1.0.1",
136
+ "word": "~0.3.0"
137
+ },
138
+ "repository": {
139
+ "type": "git",
140
+ "url": "https://git.sheetjs.com/SheetJS/sheetjs"
141
+ },
142
+ "scripts": {
143
+ "test": "make travis",
144
+ "build": "make",
145
+ "lint": "make fullint",
146
+ "dtslint": "dtslint types"
147
+ },
148
+ "config": {
149
+ "blanket": {
150
+ "pattern": "xlsx.js"
151
+ }
152
+ },
153
+ "alex": {
154
+ "allow": [
155
+ "chinese",
156
+ "special",
157
+ "simple",
158
+ "just",
159
+ "crash",
160
+ "wtf",
161
+ "holes"
162
+ ]
163
+ },
164
+ "homepage": "https://sheetjs.com/",
165
+ "files": [
166
+ "CHANGELOG.md",
167
+ "LICENSE",
168
+ "README.md",
169
+ "bower.json",
170
+ "package.json",
171
+ "xlsx.js",
172
+ "xlsx.mjs",
173
+ "xlsxworker.js",
174
+ "bin/xlsx.njs",
175
+ "dist/LICENSE",
176
+ "dist/*.mjs",
177
+ "dist/*.js",
178
+ "dist/*.map",
179
+ "dist/*.d.ts",
180
+ "docs/*.md",
181
+ "types/index.d.ts",
182
+ "types/tsconfig.json"
183
+ ],
184
+ "bugs": {
185
+ "url": "https://git.sheetjs.com/SheetJS/sheetjs/issues"
186
+ },
187
+ "license": "Apache-2.0",
188
+ "engines": {
189
+ "node": ">=0.8"
190
+ }
191
+ }