@4399ywkf/editor 0.5.0 → 0.7.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 (49) hide show
  1. package/README.md +164 -11
  2. package/dist/PptxView-ZH4FZKNO.js +3 -0
  3. package/dist/PptxView-ZH4FZKNO.js.map +1 -0
  4. package/dist/SheetView-SDBRSTVS.js +3 -0
  5. package/dist/{SheetView-DSADIZNS.js.map → SheetView-SDBRSTVS.js.map} +1 -1
  6. package/dist/chunk-5HMKRNIH.js +27 -0
  7. package/dist/chunk-5HMKRNIH.js.map +1 -0
  8. package/dist/chunk-5XG4YMAB.js +149 -0
  9. package/dist/chunk-5XG4YMAB.js.map +1 -0
  10. package/dist/chunk-DGUNVCOM.js +711 -0
  11. package/dist/chunk-DGUNVCOM.js.map +1 -0
  12. package/dist/chunk-HPSPOM2O.js +128 -0
  13. package/dist/chunk-HPSPOM2O.js.map +1 -0
  14. package/dist/chunk-KRP5V7VF.js +130 -0
  15. package/dist/chunk-KRP5V7VF.js.map +1 -0
  16. package/dist/chunk-SBTKDJAL.js +107 -0
  17. package/dist/chunk-SBTKDJAL.js.map +1 -0
  18. package/dist/{chunk-L6ZR5HHW.js → chunk-SYCK6Y5F.js} +15 -10
  19. package/dist/chunk-SYCK6Y5F.js.map +1 -0
  20. package/dist/chunk-WF7PIIFR.js +21 -0
  21. package/dist/chunk-WF7PIIFR.js.map +1 -0
  22. package/dist/csv-parse-D0zTBvDB.d.ts +216 -0
  23. package/dist/csv.d.ts +86 -0
  24. package/dist/csv.js +34 -0
  25. package/dist/csv.js.map +1 -0
  26. package/dist/docx.d.ts +15 -0
  27. package/dist/docx.js +61 -3
  28. package/dist/docx.js.map +1 -1
  29. package/dist/import-GVZDLWA2.js +6 -0
  30. package/dist/import-GVZDLWA2.js.map +1 -0
  31. package/dist/index.d.ts +2 -2
  32. package/dist/index.js +21 -2
  33. package/dist/index.js.map +1 -1
  34. package/dist/pdf.d.ts +1 -1
  35. package/dist/pptx.d.ts +36 -0
  36. package/dist/pptx.js +3 -0
  37. package/dist/pptx.js.map +1 -0
  38. package/dist/{registry-BBL8yeIT.d.ts → registry-XJFJXtZ_.d.ts} +6 -0
  39. package/dist/sheet-runtime.d.ts +212 -0
  40. package/dist/sheet-runtime.js +416 -0
  41. package/dist/sheet-runtime.js.map +1 -0
  42. package/dist/sheet.d.ts +7 -5
  43. package/dist/sheet.js +1 -1
  44. package/dist/xlsx.d.ts +127 -189
  45. package/dist/xlsx.js +8 -104
  46. package/dist/xlsx.js.map +1 -1
  47. package/package.json +19 -3
  48. package/dist/SheetView-DSADIZNS.js +0 -3
  49. package/dist/chunk-L6ZR5HHW.js.map +0 -1
package/dist/xlsx.d.ts CHANGED
@@ -1,179 +1,5 @@
1
- /**
2
- * Univer 快照的结构化镜像。
3
- *
4
- * 为什么不直接 `import type { IWorkbookData } from "@univerjs/core"`:
5
- * 那是**可选 peer**。没装 `@univerjs/presets` 的项目一解析不到这个模块,
6
- * 整个包的 typecheck 就红了 —— 而「拿快照出 xlsx」恰恰是最不该逼人装 871KB
7
- * 渲染引擎的场景(服务端定时导出、Node 里跑批都只有 JSON)。
8
- *
9
- * 所以这里只声明导出真正读到的字段,字段名与取值语义和 `@univerjs/core`
10
- * 逐一对齐。Univer 加字段不会影响这里;改字段含义会 —— 那种时候本文件是
11
- * 唯一需要改的地方。
12
- */
13
- type CellValue = string | number | boolean;
14
- interface ColorStyle {
15
- /** `#RRGGBB` / `rgb(r,g,b)` / `rgba(r,g,b,a)` */
16
- rgb?: string | null;
17
- /** 主题色 token。xlsx 侧解析不了,直接忽略 */
18
- th?: number;
19
- }
20
- /** 下划线 / 删除线 / 上划线 */
21
- interface TextDecorationData {
22
- /** 0 关 1 开 */
23
- s?: number;
24
- cl?: ColorStyle | null;
25
- t?: number;
26
- }
27
- interface BorderStyleData {
28
- /** 对齐 `BorderStyleTypes` */
29
- s?: number;
30
- cl?: ColorStyle | null;
31
- }
32
- interface BorderData {
33
- t?: BorderStyleData | null;
34
- r?: BorderStyleData | null;
35
- b?: BorderStyleData | null;
36
- l?: BorderStyleData | null;
37
- }
38
- interface TextRotation {
39
- /** 角度,-90 ~ 90,正数逆时针 */
40
- a?: number;
41
- /** 1 = 竖排 */
42
- v?: number;
43
- }
44
- interface StyleData {
45
- /** fontFamily */
46
- ff?: string | null;
47
- /** fontSize,pt */
48
- fs?: number;
49
- /** italic */
50
- it?: number;
51
- /** bold */
52
- bl?: number;
53
- /** underline */
54
- ul?: TextDecorationData | null;
55
- /** strikethrough */
56
- st?: TextDecorationData | null;
57
- /** overline —— xlsx 没有对应表达 */
58
- ol?: TextDecorationData | null;
59
- /** background */
60
- bg?: ColorStyle | null;
61
- /** border */
62
- bd?: BorderData | null;
63
- /** font color */
64
- cl?: ColorStyle | null;
65
- /** 上下标 */
66
- va?: number | null;
67
- /** 数字格式 */
68
- n?: {
69
- pattern?: string;
70
- } | null;
71
- /** textRotation */
72
- tr?: TextRotation | null;
73
- /** horizontalAlign */
74
- ht?: number | null;
75
- /** verticalAlign */
76
- vt?: number | null;
77
- /** wrapStrategy */
78
- tb?: number | null;
79
- }
80
- /** 富文本单元格。导出只取纯文本 —— xlsx 的富文本要拆成 `<si><r>` 段,收益不抵复杂度 */
81
- interface RichTextData {
82
- body?: {
83
- dataStream?: string;
84
- } | null;
85
- }
86
- interface CellData {
87
- v?: CellValue | null;
88
- /** 对齐 `CellValueType` */
89
- t?: number | null;
90
- /** 原始公式,含前导 `=` */
91
- f?: string | null;
92
- /** 共享公式组 id。同组里只有一个单元格带 `f` */
93
- si?: string | null;
94
- /** 数组公式的引用范围 */
95
- ref?: string | null;
96
- /** 样式 id 或内联样式 */
97
- s?: StyleData | string | null;
98
- /** 富文本 */
99
- p?: RichTextData | null;
100
- }
101
- interface RowData {
102
- /** 高度 px */
103
- h?: number;
104
- /** 自适应高度 px,`ia` 为 1 时用它 */
105
- ah?: number;
106
- /** 是否自适应 */
107
- ia?: number;
108
- /** 隐藏 */
109
- hd?: number;
110
- s?: StyleData | string | null;
111
- }
112
- interface ColumnData {
113
- /** 宽度 px */
114
- w?: number;
115
- hd?: number;
116
- s?: StyleData | string | null;
117
- }
118
- interface CellRange {
119
- startRow: number;
120
- startColumn: number;
121
- endRow: number;
122
- endColumn: number;
123
- }
124
- interface FreezeData {
125
- /** 冻结列数 */
126
- xSplit: number;
127
- /** 冻结行数 */
128
- ySplit: number;
129
- startRow: number;
130
- startColumn: number;
131
- }
132
- /** `IObjectMatrixPrimitiveType<T>`:行号 → 列号 → 值,两层都是稀疏对象 */
133
- type Matrix<T> = Record<number, Record<number, T> | undefined>;
134
- interface WorksheetData {
135
- id?: string;
136
- name?: string;
137
- /** `#RRGGBB` */
138
- tabColor?: string;
139
- /** 1 = 隐藏 */
140
- hidden?: number;
141
- freeze?: FreezeData;
142
- rowCount?: number;
143
- columnCount?: number;
144
- /** px */
145
- defaultColumnWidth?: number;
146
- /** px */
147
- defaultRowHeight?: number;
148
- mergeData?: CellRange[];
149
- cellData?: Matrix<CellData>;
150
- rowData?: Record<number, RowData | undefined>;
151
- columnData?: Record<number, ColumnData | undefined>;
152
- /** 0 = 不显示网格线 */
153
- showGridlines?: number;
154
- /** 1 = 从右向左 */
155
- rightToLeft?: number;
156
- defaultStyle?: StyleData | string | null;
157
- }
158
- interface WorkbookData {
159
- id?: string;
160
- name?: string;
161
- /** 工作表顺序。缺省时按 `sheets` 的键序 */
162
- sheetOrder?: string[];
163
- sheets?: Record<string, WorksheetData | undefined>;
164
- /** 样式表:`CellData.s` 为字符串时查这里 */
165
- styles?: Record<string, StyleData | null | undefined>;
166
- defaultStyle?: StyleData | string | null;
167
- /**
168
- * 各插件自己序列化的数据(图片、条件格式、数据校验、筛选……)。
169
- * 导出读不了它们的私有结构,但**能据此如实报告丢了什么** —— 见 `warnings`。
170
- */
171
- resources?: Array<{
172
- id?: string;
173
- name: string;
174
- data: string;
175
- }>;
176
- }
1
+ import { W as WorkbookData, a as CsvParseOptions } from './csv-parse-D0zTBvDB.js';
2
+ export { C as CellData, e as CellRange, f as CellValue, g as ColumnData, b as CsvToSnapshotResult, R as RowData, S as StyleData, c as WorksheetData, d as csvToSnapshot, p as parseCsv } from './csv-parse-D0zTBvDB.js';
177
3
 
178
4
  /**
179
5
  * Univer 快照 → xlsx 的各个 XML 部件。
@@ -218,10 +44,121 @@ interface SerializeXlsxResult {
218
44
  declare function serializeXlsx(workbook: WorkbookData, options?: SerializeXlsxOptions): SerializeXlsxResult;
219
45
 
220
46
  /**
221
- * `@4399ywkf/editor/xlsx` —— 表格导出。
47
+ * 解析 OOXML 用的 DOM 小工具。
48
+ *
49
+ * 只用 DOM Level 2 的接口(firstChild / nextSibling / getAttribute),
50
+ * 浏览器原生 DOMParser 和 @xmldom/xmldom 的产物都吃 —— 不用 querySelector
51
+ * 是因为 xmldom 没有它,且命名空间前缀会让选择器在两边行为不一致。
52
+ */
53
+ /** 注入式 DOMParser 的最小面:浏览器传原生的,Node 传 @xmldom/xmldom 的 */
54
+ interface DomParserLike {
55
+ new (): {
56
+ parseFromString(source: string, mimeType: string): Document;
57
+ };
58
+ }
59
+
60
+ /**
61
+ * xlsx / csv 导入的入口 —— 把「拿到手的东西」变成 Univer 快照。
222
62
  *
223
- * `./docx` 同一套思路:**在本地生成,文档不出内网**,不依赖任何转换服务,
224
- * 也不引 SheetJS —— 打包只多出 fflate(本来就有)和这几百行 OOXML 拼装。
63
+ * 分层和导出侧对称:`parse.ts` / `csv-parse.ts` 是纯函数(解压、XML 解析
64
+ * 都注入),本文件负责脏活 —— zip(fflate)、缺省 DOMParser(浏览器原生)、
65
+ * 解码文本(UTF-8 优先,失败退 GBK)、从 URL 拉字节、按扩展名和魔数嗅探格式。
66
+ *
67
+ * ```ts
68
+ * import { importSheetSource } from "@4399ywkf/editor/xlsx"
69
+ *
70
+ * const { workbook, warnings } = await importSheetSource(file)
71
+ * univerAPI.createWorkbook(workbook)
72
+ * if (warnings.length) toast(warnings.join("\n")) // ← 如实报告丢了什么
73
+ * ```
74
+ *
75
+ * Node 侧没有全局 DOMParser,`importXlsx` 显式传 `@xmldom/xmldom` 的即可。
76
+ */
77
+
78
+ interface ImportSheetResult {
79
+ workbook: WorkbookData;
80
+ /** 导入时丢掉/降级了什么。**要展示给用户**,别吞 */
81
+ warnings: string[];
82
+ stats: Record<string, number>;
83
+ }
84
+ interface ImportXlsxOptions {
85
+ /** 不传则用浏览器原生 DOMParser;Node 里传 @xmldom/xmldom 的 */
86
+ DOMParser?: DomParserLike;
87
+ /** 快照里的工作簿名。不传则用 File 名或文档属性里的标题 */
88
+ name?: string;
89
+ }
90
+ type BinarySource = File | Blob | ArrayBuffer | Uint8Array;
91
+ /** .xlsx 字节 → Univer 快照。纯本地解析,文档不出内网 */
92
+ declare function importXlsx(source: BinarySource, options?: ImportXlsxOptions): Promise<ImportSheetResult>;
93
+ interface ImportCsvOptions extends CsvParseOptions {
94
+ }
95
+ /** csv/tsv 文本或字节 → Univer 快照 */
96
+ declare function importCsv(source: BinarySource | string, options?: ImportCsvOptions): Promise<ImportSheetResult>;
97
+ interface ImportSheetSourceResult extends ImportSheetResult {
98
+ /** 实际按哪种格式解析的 */
99
+ format: "xlsx" | "csv" | "tsv";
100
+ }
101
+ /**
102
+ * `DocumentView` 的 `source` → Univer 快照:URL / File / Blob 都收。
103
+ *
104
+ * 判定顺序:扩展名(.csv/.tsv 显式声明就信)→ zip 魔数(xlsx 本质是 zip)
105
+ * → 都不是则按 csv 试 —— 文本表格没有魔数,这是唯一诚实的兜底。
106
+ */
107
+ declare function importSheetSource(source: string | Blob | File, options?: ImportXlsxOptions & ImportCsvOptions): Promise<ImportSheetSourceResult>;
108
+
109
+ /**
110
+ * xlsx 的各个 XML 部件 → Univer 快照。`serialize.ts`(导出侧)的逆。
111
+ *
112
+ * 同构:解压和 XML 解析都由调用方注入(见 `import.ts`),浏览器
113
+ * (fflate + 原生 DOMParser)和 Node(任意 zip 库 + @xmldom/xmldom)
114
+ * 共用这一份实现,不存在两份真相 —— 和 `docx/parse.ts` 同一套约定。
115
+ *
116
+ * **能保住的**:多工作表(含顺序与隐藏)、值与类型、公式(普通/共享/数组)、
117
+ * 数字格式、字体/颜色/填充/边框/对齐/换行/旋转、合并单元格、行高列宽、
118
+ * 隐藏行列、冻结窗格、网格线开关、标签颜色、quotePrefix(强制文本)。
119
+ *
120
+ * **保不住的**:图片、图表、透视表、条件格式、数据校验、筛选、批注、
121
+ * 超链接、主题色。它们要么住在独立部件里(drawing / pivot / comments),
122
+ * 要么需要把 Excel 的主题模型抄一遍(theme + tint)。这里不假装支持,
123
+ * 而是逐个探测、**如实报告丢了什么**(见 `warnings`)—— 让宿主能把话
124
+ * 原样告诉用户,而不是打开表格才发现少了东西。
125
+ */
126
+
127
+ interface XlsxEntries {
128
+ /** 读取包内某个条目;不存在返回 null */
129
+ read(entryPath: string): Uint8Array | null;
130
+ /** 包内全部条目路径。用于探测图片/批注等「导入保不住」的部件 */
131
+ list(): string[];
132
+ }
133
+ interface ParseXlsxOptions {
134
+ /** 浏览器传原生 DOMParser,Node 传 @xmldom/xmldom 的 */
135
+ DOMParser: DomParserLike;
136
+ /** 快照里的工作簿名。不传则用 docProps 里的标题,再没有就空着 */
137
+ name?: string;
138
+ }
139
+ interface ParseXlsxResult {
140
+ workbook: WorkbookData;
141
+ /** 导入时丢掉/降级了什么。**要展示给用户**,别吞 */
142
+ warnings: string[];
143
+ /** 计数,用于量化保真度 */
144
+ stats: Record<string, number>;
145
+ }
146
+ declare function parseXlsx(entries: XlsxEntries, options: ParseXlsxOptions): ParseXlsxResult;
147
+
148
+ /** 从 Univer 实例取快照。xlsx 与 csv 两条导出路径共用。 */
149
+
150
+ /**
151
+ * 参数类型是 `unknown` 而不是 `FUniver`:`@univerjs/presets` 是可选 peer,
152
+ * 写成具体类型会让没装它的项目 typecheck 直接红。运行时按 facade 的两个
153
+ * 方法名依次试探(`getSnapshot` 是新名字,`save` 是旧的)。
154
+ */
155
+ declare function snapshotFromUniver(univerAPI: unknown): WorkbookData;
156
+
157
+ /**
158
+ * `@4399ywkf/editor/xlsx` —— 表格导入导出。
159
+ *
160
+ * 和 `./docx` 同一套思路:**在本地转换,文档不出内网**,不依赖任何转换服务,
161
+ * 也不引 SheetJS —— 打包只多出 fflate(本来就有)和这千把行 OOXML 拼装/解析。
225
162
  *
226
163
  * ```ts
227
164
  * import { downloadXlsx } from "@4399ywkf/editor/xlsx"
@@ -231,6 +168,14 @@ declare function serializeXlsx(workbook: WorkbookData, options?: SerializeXlsxOp
231
168
  * downloadXlsx(ref.current, "年度报表.xlsx")
232
169
  * ```
233
170
  *
171
+ * 导入是反方向 —— File / Blob / URL 都收,`SheetView` 的 `source` 走的就是它:
172
+ *
173
+ * ```ts
174
+ * import { importSheetSource } from "@4399ywkf/editor/xlsx"
175
+ * const { workbook, warnings } = await importSheetSource(file)
176
+ * univerAPI.createWorkbook(workbook)
177
+ * ```
178
+ *
234
179
  * 服务端 / 定时任务只有 JSON 也能用 —— 整条链路不碰 DOM:
235
180
  *
236
181
  * ```ts
@@ -239,7 +184,8 @@ declare function serializeXlsx(workbook: WorkbookData, options?: SerializeXlsxOp
239
184
  * ```
240
185
  *
241
186
  * `warnings` 一定要透给用户。Univer 把图片、条件格式、数据校验这些存在插件数据里,
242
- * 不在单元格模型内,导出必然丢 —— 打开文件才发现远比导出时被告知糟糕。
187
+ * 不在单元格模型内,导出必然丢;导入侧同理(drawing / pivot / comments 是独立部件)——
188
+ * 打开文件才发现远比转换时被告知糟糕。
243
189
  */
244
190
 
245
191
  declare const XLSX_MIME = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
@@ -251,14 +197,6 @@ interface XlsxResult {
251
197
  }
252
198
  /** 纯函数:Univer 快照 → .xlsx 字节。不依赖 DOM 与引擎,服务端 / 测试直接可用。 */
253
199
  declare function xlsxFromSnapshot(workbook: WorkbookData, options?: SerializeXlsxOptions): XlsxResult;
254
- /**
255
- * 从 Univer 实例取快照。
256
- *
257
- * 参数类型是 `unknown` 而不是 `FUniver`:`@univerjs/presets` 是可选 peer,
258
- * 写成具体类型会让没装它的项目 typecheck 直接红。运行时按 facade 的两个
259
- * 方法名依次试探(`getSnapshot` 是新名字,`save` 是旧的)。
260
- */
261
- declare function snapshotFromUniver(univerAPI: unknown): WorkbookData;
262
200
  /** Univer 实例或快照 → .xlsx 字节 */
263
201
  declare function exportXlsx(source: WorkbookData | unknown, options?: SerializeXlsxOptions): XlsxResult;
264
202
  /** Univer 实例或快照 → Blob,便于交给上传接口 */
@@ -270,4 +208,4 @@ declare function xlsxBlob(source: WorkbookData | unknown, options?: SerializeXls
270
208
  */
271
209
  declare function downloadXlsx(source: WorkbookData | unknown, filename?: string, options?: SerializeXlsxOptions): XlsxResult;
272
210
 
273
- export { type CellData, type CellRange, type CellValue, type ColumnData, type RowData, type SerializeXlsxOptions, type SerializeXlsxResult, type StyleData, type WorkbookData, type WorksheetData, XLSX_MIME, type XlsxResult, downloadXlsx, exportXlsx, serializeXlsx, snapshotFromUniver, xlsxBlob, xlsxFromSnapshot };
211
+ export { CsvParseOptions, type ImportCsvOptions, type ImportSheetResult, type ImportSheetSourceResult, type ImportXlsxOptions, type ParseXlsxOptions, type ParseXlsxResult, type SerializeXlsxOptions, type SerializeXlsxResult, WorkbookData, XLSX_MIME, type XlsxEntries, type XlsxResult, downloadXlsx, exportXlsx, importCsv, importSheetSource, importXlsx, parseXlsx, serializeXlsx, snapshotFromUniver, xlsxBlob, xlsxFromSnapshot };
package/dist/xlsx.js CHANGED
@@ -1,83 +1,12 @@
1
+ export { importCsv, importSheetSource, importXlsx, parseXlsx } from './chunk-DGUNVCOM.js';
2
+ import { pxToPoints, cellRef, escapeXml, pxToColumnWidth, columnName, toArgb, XML_DECL, escapeAttr } from './chunk-SBTKDJAL.js';
3
+ import { toSnapshot } from './chunk-WF7PIIFR.js';
4
+ export { snapshotFromUniver } from './chunk-WF7PIIFR.js';
5
+ import { H_ALIGN, V_ALIGN, CELL_TYPE, WRAP } from './chunk-KRP5V7VF.js';
6
+ export { csvToSnapshot, parseCsv } from './chunk-KRP5V7VF.js';
7
+ import { numericKeys, richTextToPlain } from './chunk-5HMKRNIH.js';
1
8
  import { zipSync } from 'fflate';
2
9
 
3
- // src/xlsx/index.ts
4
-
5
- // src/xlsx/types.ts
6
- var CELL_TYPE = {
7
- /** 强制文本:用户输入 `'0123` 这类本该被当数字的内容 */
8
- FORCE_STRING: 4
9
- };
10
- var H_ALIGN = {
11
- LEFT: 1,
12
- CENTER: 2,
13
- RIGHT: 3,
14
- JUSTIFIED: 4,
15
- BOTH: 5,
16
- DISTRIBUTED: 6
17
- };
18
- var V_ALIGN = { TOP: 1, MIDDLE: 2, BOTTOM: 3 };
19
- var WRAP = { WRAP: 3 };
20
-
21
- // src/xlsx/xml.ts
22
- var CONTROL = /[\u0000-\u0008\u000B\u000C\u000E-\u001F\uFFFE\uFFFF]/g;
23
- var LONE_SURROGATE = /[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]/g;
24
- function escapeXml(value) {
25
- return value.replace(CONTROL, "").replace(LONE_SURROGATE, "").replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
26
- }
27
- function escapeAttr(value) {
28
- return escapeXml(value).replace(/'/g, "&apos;").replace(/\r/g, "&#13;").replace(/\n/g, "&#10;");
29
- }
30
- function columnName(index) {
31
- let n = index;
32
- let out = "";
33
- do {
34
- out = String.fromCharCode(65 + n % 26) + out;
35
- n = Math.floor(n / 26) - 1;
36
- } while (n >= 0);
37
- return out;
38
- }
39
- function cellRef(row, column) {
40
- return `${columnName(column)}${row + 1}`;
41
- }
42
- function hex2(n) {
43
- return Math.max(0, Math.min(255, Math.round(n))).toString(16).toUpperCase().padStart(2, "0");
44
- }
45
- function toArgb(color) {
46
- const raw = typeof color === "string" ? color : color?.rgb;
47
- if (!raw) return void 0;
48
- const s = raw.trim();
49
- if (s.startsWith("#")) {
50
- const h = s.slice(1);
51
- if (!/^[0-9a-fA-F]+$/.test(h)) return void 0;
52
- const dup = (c) => c + c;
53
- if (h.length === 3 || h.length === 4) {
54
- const [r, g, b, a] = h.split("");
55
- return `${a ? dup(a) : "FF"}${dup(r)}${dup(g)}${dup(b)}`.toUpperCase();
56
- }
57
- if (h.length === 6) return `FF${h.toUpperCase()}`;
58
- if (h.length === 8) return `${h.slice(6, 8)}${h.slice(0, 6)}`.toUpperCase();
59
- return void 0;
60
- }
61
- const m = /^rgba?\(([^)]+)\)$/i.exec(s);
62
- if (m) {
63
- const parts = m[1].split(/[,/\s]+/).filter(Boolean);
64
- if (parts.length < 3) return void 0;
65
- const [r, g, b, a] = parts;
66
- const alpha = a === void 0 ? 1 : Number.parseFloat(a) / (a.includes("%") ? 100 : 1);
67
- const chan = (v) => v.includes("%") ? Number.parseFloat(v) / 100 * 255 : Number.parseFloat(v);
68
- if (!Number.isFinite(alpha)) return void 0;
69
- return `${hex2(alpha * 255)}${hex2(chan(r))}${hex2(chan(g))}${hex2(chan(b))}`;
70
- }
71
- return void 0;
72
- }
73
- function pxToColumnWidth(px) {
74
- return Math.round((px - 5) / 7 * 100) / 100;
75
- }
76
- function pxToPoints(px) {
77
- return Math.round(px * 0.75 * 100) / 100;
78
- }
79
- var XML_DECL = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n';
80
-
81
10
  // src/xlsx/styles.ts
82
11
  var BORDER_STYLE = [
83
12
  "none",
@@ -277,15 +206,6 @@ var BAD_SHEET_NAME = /[\\/?*[\]:]/g;
277
206
  var RELS_NS = 'xmlns="http://schemas.openxmlformats.org/package/2006/relationships"';
278
207
  var MAIN_NS = "http://schemas.openxmlformats.org/spreadsheetml/2006/main";
279
208
  var DOC_REL = "http://schemas.openxmlformats.org/officeDocument/2006/relationships";
280
- function numericKeys(o) {
281
- if (!o) return [];
282
- return Object.keys(o).map(Number).filter((n) => Number.isInteger(n) && n >= 0).sort((a, b) => a - b);
283
- }
284
- function richTextToPlain(cell) {
285
- const stream = cell.p?.body?.dataStream;
286
- if (typeof stream !== "string") return void 0;
287
- return stream.replace(/\r\n$/, "").replace(/\r/g, "\n");
288
- }
289
209
  function serializeXlsx(workbook, options = {}) {
290
210
  const { cachedFormulaValues = true, creator = "@4399ywkf/editor", created = /* @__PURE__ */ new Date() } = options;
291
211
  const warnings = [];
@@ -570,22 +490,6 @@ function xlsxFromSnapshot(workbook, options = {}) {
570
490
  const { files, warnings, stats } = serializeXlsx(workbook, options);
571
491
  return { bytes: zipSync(files, { level: 6 }), warnings, stats };
572
492
  }
573
- function snapshotFromUniver(univerAPI) {
574
- const api = univerAPI;
575
- const book = api?.getActiveWorkbook?.();
576
- if (!book) throw new Error("拿不到当前工作簿:univerAPI 无效,或表格尚未就绪");
577
- const snapshot = book.getSnapshot?.() ?? book.save?.();
578
- if (!snapshot || typeof snapshot !== "object") {
579
- throw new Error("当前 Univer 版本没有 getSnapshot() / save(),无法取快照");
580
- }
581
- return snapshot;
582
- }
583
- function toSnapshot(source) {
584
- const maybe = source;
585
- if (maybe && typeof maybe === "object" && ("sheets" in maybe || "sheetOrder" in maybe))
586
- return maybe;
587
- return snapshotFromUniver(source);
588
- }
589
493
  function exportXlsx(source, options) {
590
494
  return xlsxFromSnapshot(toSnapshot(source), options);
591
495
  }
@@ -608,6 +512,6 @@ function downloadXlsx(source, filename = "工作簿.xlsx", options) {
608
512
  return result;
609
513
  }
610
514
 
611
- export { XLSX_MIME, downloadXlsx, exportXlsx, serializeXlsx, snapshotFromUniver, xlsxBlob, xlsxFromSnapshot };
515
+ export { XLSX_MIME, downloadXlsx, exportXlsx, serializeXlsx, xlsxBlob, xlsxFromSnapshot };
612
516
  //# sourceMappingURL=xlsx.js.map
613
517
  //# sourceMappingURL=xlsx.js.map