@4399ywkf/editor 0.8.0 → 0.9.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 (43) hide show
  1. package/README.md +58 -27
  2. package/dist/SheetView-YFK7BUS5.js +3 -0
  3. package/dist/{SheetView-SDBRSTVS.js.map → SheetView-YFK7BUS5.js.map} +1 -1
  4. package/dist/{chunk-KRP5V7VF.js → chunk-2DI4FJPC.js} +10 -3
  5. package/dist/chunk-2DI4FJPC.js.map +1 -0
  6. package/dist/{chunk-DGUNVCOM.js → chunk-3QTRZBIK.js} +111 -26
  7. package/dist/chunk-3QTRZBIK.js.map +1 -0
  8. package/dist/chunk-JWHQF2CZ.js +257 -0
  9. package/dist/chunk-JWHQF2CZ.js.map +1 -0
  10. package/dist/{chunk-WF7PIIFR.js → chunk-JZ67Q3QI.js} +4 -4
  11. package/dist/chunk-JZ67Q3QI.js.map +1 -0
  12. package/dist/{chunk-SBTKDJAL.js → chunk-SDVGDHC4.js} +45 -3
  13. package/dist/chunk-SDVGDHC4.js.map +1 -0
  14. package/dist/{chunk-HPSPOM2O.js → chunk-XB6FEC4I.js} +3 -3
  15. package/dist/chunk-XB6FEC4I.js.map +1 -0
  16. package/dist/{csv-parse-D0zTBvDB.d.ts → csv-parse-DXlwzoZ6.d.ts} +28 -1
  17. package/dist/csv.d.ts +2 -2
  18. package/dist/csv.js +4 -4
  19. package/dist/import-O7RUERND.js +6 -0
  20. package/dist/{import-GVZDLWA2.js.map → import-O7RUERND.js.map} +1 -1
  21. package/dist/index.d.ts +2 -2
  22. package/dist/index.js +1 -1
  23. package/dist/pdf.d.ts +1 -1
  24. package/dist/pptx.d.ts +1 -1
  25. package/dist/{registry-CYKivRDh.d.ts → registry-BQ5T1Yko.d.ts} +9 -16
  26. package/dist/sheet-runtime.d.ts +10 -8
  27. package/dist/sheet-runtime.js +6 -14
  28. package/dist/sheet-runtime.js.map +1 -1
  29. package/dist/sheet.d.ts +4 -3
  30. package/dist/sheet.js +1 -1
  31. package/dist/xlsx.d.ts +12 -11
  32. package/dist/xlsx.js +121 -32
  33. package/dist/xlsx.js.map +1 -1
  34. package/package.json +71 -27
  35. package/dist/SheetView-SDBRSTVS.js +0 -3
  36. package/dist/chunk-DGUNVCOM.js.map +0 -1
  37. package/dist/chunk-HPSPOM2O.js.map +0 -1
  38. package/dist/chunk-KRP5V7VF.js.map +0 -1
  39. package/dist/chunk-SBTKDJAL.js.map +0 -1
  40. package/dist/chunk-SYCK6Y5F.js +0 -89
  41. package/dist/chunk-SYCK6Y5F.js.map +0 -1
  42. package/dist/chunk-WF7PIIFR.js.map +0 -1
  43. package/dist/import-GVZDLWA2.js +0 -6
@@ -83,7 +83,7 @@ function csvFromSnapshot(workbook, options = {}) {
83
83
  }
84
84
  if (sawDateFormat) {
85
85
  warnings.push(
86
- "有单元格用的是日期/时间格式,csv 里会写成 Excel 序列号(如 45678)而不是日期文本 —— csv 不带格式信息,导入方需要自己按日期列解析"
86
+ "有单元格用的是日期/时间格式,csv 里会写成 Excel 序列号(如 45678)而不是日期文本 —— csv 不带格式信息,导入方需要自己按日期列解析" + (workbook.dateSystem === "date1904" ? "。注意本工作簿用 1904 日期系统,序列号从 1904-01-01 起算,按 1900 体系解析会早 1462 天" : "")
87
87
  );
88
88
  }
89
89
  if (sawRichText) warnings.push("富文本单元格已压平成纯文本,段内的字体与颜色不保留");
@@ -124,5 +124,5 @@ function activeSheetId(univerAPI) {
124
124
  }
125
125
 
126
126
  export { CSV_MIME, activeSheetId, csvFromSnapshot, escapeCsvField };
127
- //# sourceMappingURL=chunk-HPSPOM2O.js.map
128
- //# sourceMappingURL=chunk-HPSPOM2O.js.map
127
+ //# sourceMappingURL=chunk-XB6FEC4I.js.map
128
+ //# sourceMappingURL=chunk-XB6FEC4I.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/xlsx/csv.ts"],"names":["text"],"mappings":"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","file":"chunk-XB6FEC4I.js","sourcesContent":["/**\n * Univer 快照 → CSV。\n *\n * **csv 是单表格式,工作簿是多表的**,这是产品决定不是技术决定。本实现的口径:\n * 导**一张**表,其余的在 `warnings` 里**逐个点名**,和 xlsx 导出「如实报告丢了什么」\n * 保持一致 —— 静悄悄只给一张表,用户往往到对账时才发现少了东西。\n *\n * 「哪张是活动表」只有运行时的 Univer 实例知道,**快照里根本没有这个字段**。\n * 所以:传 `univerAPI` 时取真正的活动表;只传快照时取 `sheetOrder` 的第一张,\n * 并且照样把这件事写进 warnings。要指定就用 `options.sheet`(表 id 或表名)。\n */\n\nimport { looksLikeDateFormat, numericKeys, richTextToPlain } from \"./cell.ts\"\nimport type { CellData, StyleData, WorkbookData, WorksheetData } from \"./types.ts\"\n\nexport interface CsvOptions {\n /** 导哪张表:工作表 id 或表名。不传则用活动表(拿不到就用第一张) */\n sheet?: string\n /** 分隔符,默认 `,`。用 `\\t` 就是 tsv */\n delimiter?: string\n /** 行分隔,默认 `\\r\\n`(RFC 4180 规定,Excel 也最稳) */\n newline?: string\n /**\n * 是否加 UTF-8 BOM,默认 **true**。\n * 不加的话 Excel 会按本地编码(简中系统是 GBK)解析,中文全是乱码 ——\n * 这是 csv 导出最常见的投诉,默认就得挡掉。\n */\n bom?: boolean\n /** 公式格写 Univer 算好的值(默认)还是写公式文本 */\n formulas?: \"value\" | \"formula\"\n}\n\nexport interface CsvResult {\n /** 文本内容,不含 BOM */\n text: string\n /** 可直接落盘/上传的字节,按 `bom` 决定是否带 BOM */\n bytes: Uint8Array\n /** 导出时丢掉/降级了什么。**要展示给用户** */\n warnings: string[]\n stats: {\n sheetName: string\n rows: number\n columns: number\n cells: number\n /** 没被导出的工作表数 */\n skippedSheets: number\n }\n}\n\nexport const CSV_MIME = \"text/csv;charset=utf-8\"\n\n/** RFC 4180:字段含分隔符、引号或换行时整体加引号,内部引号翻倍 */\nexport function escapeCsvField(value: string, delimiter = \",\"): string {\n if (!value) return \"\"\n const needsQuote =\n value.includes(delimiter) || value.includes('\"') || value.includes(\"\\n\") || value.includes(\"\\r\")\n return needsQuote ? `\"${value.replace(/\"/g, '\"\"')}\"` : value\n}\n\nexport function csvFromSnapshot(workbook: WorkbookData, options: CsvOptions = {}): CsvResult {\n const { delimiter = \",\", newline = \"\\r\\n\", bom = true, formulas = \"value\" } = options\n\n const warnings: string[] = []\n const order = (\n workbook.sheetOrder?.length ? workbook.sheetOrder : Object.keys(workbook.sheets ?? {})\n ).filter((id) => workbook.sheets?.[id])\n\n if (!order.length) {\n return {\n text: \"\",\n bytes: encode(\"\", bom),\n warnings: [\"工作簿里没有工作表\"],\n stats: { sheetName: \"\", rows: 0, columns: 0, cells: 0, skippedSheets: 0 },\n }\n }\n\n // 指定 → 按 id 或表名找;没指定 → 第一张\n const wanted = options.sheet\n const pickedId =\n (wanted &&\n (order.find((id) => id === wanted) ??\n order.find((id) => (workbook.sheets?.[id] as WorksheetData)?.name === wanted))) ||\n (order[0] as string)\n if (\n wanted &&\n pickedId !== wanted &&\n (workbook.sheets?.[pickedId] as WorksheetData)?.name !== wanted\n ) {\n warnings.push(\n `找不到工作表「${wanted}」,已改导「${(workbook.sheets?.[pickedId] as WorksheetData)?.name ?? pickedId}」`,\n )\n }\n\n const sheet = workbook.sheets?.[pickedId] as WorksheetData\n const sheetName = sheet?.name ?? pickedId\n\n // 点名没导出的表 —— 这条是 csv 导出最容易被忽略的损失\n const skipped = order.filter((id) => id !== pickedId)\n if (skipped.length) {\n const names = skipped.map((id) => `「${(workbook.sheets?.[id] as WorksheetData)?.name ?? id}」`)\n warnings.push(\n `csv 是单表格式,只导出了「${sheetName}」。未导出的 ${skipped.length} 张表:${names.join(\"\")}`,\n )\n }\n\n const styleMap = workbook.styles ?? {}\n const resolveStyle = (s: StyleData | string | null | undefined): StyleData | undefined => {\n if (!s) return undefined\n if (typeof s === \"string\") return styleMap[s] ?? undefined\n return s\n }\n\n const cellData = sheet?.cellData ?? {}\n const rows = numericKeys(cellData)\n let maxCol = -1\n for (const r of rows) {\n const cols = numericKeys(cellData[r])\n const last = cols[cols.length - 1]\n if (last !== undefined && last > maxCol) maxCol = last\n }\n const maxRow = rows.length ? (rows[rows.length - 1] as number) : -1\n\n let cells = 0\n let sawDateFormat = false\n let sawRichText = false\n\n const lines: string[] = []\n for (let r = 0; r <= maxRow; r++) {\n const row = cellData[r]\n const fields: string[] = []\n for (let c = 0; c <= maxCol; c++) {\n const cell = row?.[c]\n const text = cell ? cellToText(cell) : \"\"\n if (text) cells++\n fields.push(escapeCsvField(text, delimiter))\n }\n lines.push(fields.join(delimiter))\n }\n\n function cellToText(cell: CellData): string {\n if (formulas === \"formula\" && cell.f) return cell.f\n\n const rich = richTextToPlain(cell)\n if (rich !== undefined) {\n sawRichText = true\n return rich\n }\n\n const v = cell.v\n if (v === undefined || v === null) return \"\"\n if (typeof v === \"boolean\") return v ? \"TRUE\" : \"FALSE\"\n if (typeof v === \"number\") {\n // 日期在 Univer 里是「序列号 + 数字格式」,值本身就是个数字。\n // 这里不猜着转,只记下来在 warnings 里说清楚\n if (looksLikeDateFormat(resolveStyle(cell.s)?.n?.pattern)) sawDateFormat = true\n return String(v)\n }\n return String(v)\n }\n\n if (sawDateFormat) {\n warnings.push(\n \"有单元格用的是日期/时间格式,csv 里会写成 Excel 序列号(如 45678)而不是日期文本 —— \" +\n \"csv 不带格式信息,导入方需要自己按日期列解析\" +\n (workbook.dateSystem === \"date1904\"\n ? \"。注意本工作簿用 1904 日期系统,序列号从 1904-01-01 起算,按 1900 体系解析会早 1462 天\"\n : \"\"),\n )\n }\n if (sawRichText) warnings.push(\"富文本单元格已压平成纯文本,段内的字体与颜色不保留\")\n if (sheet?.mergeData?.length) {\n warnings.push(`${sheet.mergeData.length} 处合并单元格已拆开:值留在左上角,其余为空`)\n }\n if (formulas === \"value\") {\n const hasFormula = rows.some((r) => numericKeys(cellData[r]).some((c) => cellData[r]?.[c]?.f))\n if (hasFormula) warnings.push(\"公式已写成 Univer 算出的值,公式本身不保留\")\n }\n\n const text = lines.join(newline)\n return {\n text,\n bytes: encode(text, bom),\n warnings,\n stats: {\n sheetName,\n rows: maxRow + 1,\n columns: maxCol + 1,\n cells,\n skippedSheets: skipped.length,\n },\n }\n}\n\nfunction encode(text: string, bom: boolean): Uint8Array {\n const body = new TextEncoder().encode(text)\n if (!bom) return body\n const out = new Uint8Array(body.length + 3)\n out.set([0xef, 0xbb, 0xbf])\n out.set(body, 3)\n return out\n}\n\n/**\n * 从 Univer 实例上问出当前活动表的 id。\n *\n * 参数是 `unknown` 而不是 `FUniver`:`@univerjs/presets` 是可选 peer,\n * 写具体类型会让没装它的项目 typecheck 直接红。\n */\nexport function activeSheetId(univerAPI: unknown): string | undefined {\n const book = (univerAPI as { getActiveWorkbook?: () => unknown } | null)?.getActiveWorkbook?.()\n const sheet = (book as { getActiveSheet?: () => unknown } | null)?.getActiveSheet?.()\n const id = (sheet as { getSheetId?: () => string } | null)?.getSheetId?.()\n return typeof id === \"string\" && id ? id : undefined\n}\n"]}
@@ -11,6 +11,8 @@
11
11
  * 唯一需要改的地方。
12
12
  */
13
13
  type CellValue = string | number | boolean;
14
+ /** 对齐 `DateSystem`:日期序列号从哪天起算 */
15
+ type DateSystem = "date1900" | "date1904";
14
16
  interface ColorStyle {
15
17
  /** `#RRGGBB` / `rgb(r,g,b)` / `rgba(r,g,b,a)` */
16
18
  rgb?: string | null;
@@ -22,6 +24,7 @@ interface TextDecorationData {
22
24
  /** 0 关 1 开 */
23
25
  s?: number;
24
26
  cl?: ColorStyle | null;
27
+ /** 线型,对齐 `TextDecoration`,下划线见 `UNDERLINE` */
25
28
  t?: number;
26
29
  }
27
30
  interface BorderStyleData {
@@ -44,6 +47,8 @@ interface TextRotation {
44
47
  interface StyleData {
45
48
  /** fontFamily */
46
49
  ff?: string | null;
50
+ /** 东亚字体,中日韩字符优先用它渲染。xlsx 的字体只有一个名字,导出时仅在没有 `ff` 时顶上 */
51
+ eastAsiaFontFamily?: string | null;
47
52
  /** fontSize,pt */
48
53
  fs?: number;
49
54
  /** italic */
@@ -68,6 +73,8 @@ interface StyleData {
68
73
  n?: {
69
74
  pattern?: string;
70
75
  } | null;
76
+ /** shrinkToFit:缩小字体填充,1 开 */
77
+ stf?: number;
71
78
  /** textRotation */
72
79
  tr?: TextRotation | null;
73
80
  /** horizontalAlign */
@@ -89,6 +96,13 @@ interface CellData {
89
96
  t?: number | null;
90
97
  /** 原始公式,含前导 `=` */
91
98
  f?: string | null;
99
+ /**
100
+ * 公式类型,见 `FORMULA_TYPE`。Univer 只保存不参与计算,用户改了公式就清空 ——
101
+ * 它存在的意义就是让导入的数组公式 / 模拟运算表在导出时能还原
102
+ */
103
+ ft?: number | null;
104
+ /** 1 = 动态数组公式(Excel 365 的溢出公式),来自 metadata.xml 的 `dynamicArrayProperties@fDynamic` */
105
+ fd?: number | null;
92
106
  /** 共享公式组 id。同组里只有一个单元格带 `f` */
93
107
  si?: string | null;
94
108
  /** 数组公式的引用范围 */
@@ -129,6 +143,15 @@ interface FreezeData {
129
143
  startRow: number;
130
144
  startColumn: number;
131
145
  }
146
+ /** 对齐 `IWorksheetBackgroundImage`:平铺在单元格下面的工作表背景图 */
147
+ interface WorksheetBackgroundImage {
148
+ /** `BASE64` 时必须是完整的 data URL —— Univer 直接把它塞给 `img.src` */
149
+ source: string;
150
+ /** 对齐 `ImageSourceType` */
151
+ imageSourceType: "URL" | "UUID" | "BASE64";
152
+ scaleX?: number;
153
+ scaleY?: number;
154
+ }
132
155
  /** `IObjectMatrixPrimitiveType<T>`:行号 → 列号 → 值,两层都是稀疏对象 */
133
156
  type Matrix<T> = Record<number, Record<number, T> | undefined>;
134
157
  interface WorksheetData {
@@ -136,7 +159,7 @@ interface WorksheetData {
136
159
  name?: string;
137
160
  /** `#RRGGBB` */
138
161
  tabColor?: string;
139
- /** 1 = 隐藏 */
162
+ /** 对齐 `WorksheetHiddenState`:1 = 隐藏,2 = 深度隐藏(xlsx 的 veryHidden,「取消隐藏」里不列出) */
140
163
  hidden?: number;
141
164
  freeze?: FreezeData;
142
165
  rowCount?: number;
@@ -154,6 +177,8 @@ interface WorksheetData {
154
177
  /** 1 = 从右向左 */
155
178
  rightToLeft?: number;
156
179
  defaultStyle?: StyleData | string | null;
180
+ /** 渲染随表格通道内置的 drawing preset 一起加载;没装该包时快照里仍会原样保留 */
181
+ backgroundImage?: WorksheetBackgroundImage;
157
182
  }
158
183
  interface WorkbookData {
159
184
  id?: string;
@@ -164,6 +189,8 @@ interface WorkbookData {
164
189
  /** 样式表:`CellData.s` 为字符串时查这里 */
165
190
  styles?: Record<string, StyleData | null | undefined>;
166
191
  defaultStyle?: StyleData | string | null;
192
+ /** 缺省是 1900 体系。Univer 的格式化、日期编辑和公式都按它解释序列号 */
193
+ dateSystem?: DateSystem;
167
194
  /**
168
195
  * 各插件自己序列化的数据(图片、条件格式、数据校验、筛选……)。
169
196
  * 导出读不了它们的私有结构,但**能据此如实报告丢了什么** —— 见 `warnings`。
package/dist/csv.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { W as WorkbookData } from './csv-parse-D0zTBvDB.js';
2
- export { C as CellData, a as CsvParseOptions, b as CsvToSnapshotResult, c as WorksheetData, d as csvToSnapshot, p as parseCsv } from './csv-parse-D0zTBvDB.js';
1
+ import { W as WorkbookData } from './csv-parse-DXlwzoZ6.js';
2
+ export { C as CellData, a as CsvParseOptions, b as CsvToSnapshotResult, c as WorksheetData, d as csvToSnapshot, p as parseCsv } from './csv-parse-DXlwzoZ6.js';
3
3
 
4
4
  /**
5
5
  * Univer 快照 → CSV。
package/dist/csv.js CHANGED
@@ -1,7 +1,7 @@
1
- import { activeSheetId, csvFromSnapshot, CSV_MIME } from './chunk-HPSPOM2O.js';
2
- export { CSV_MIME, csvFromSnapshot } from './chunk-HPSPOM2O.js';
3
- import { toSnapshot } from './chunk-WF7PIIFR.js';
4
- export { csvToSnapshot, parseCsv } from './chunk-KRP5V7VF.js';
1
+ import { activeSheetId, csvFromSnapshot, CSV_MIME } from './chunk-XB6FEC4I.js';
2
+ export { CSV_MIME, csvFromSnapshot } from './chunk-XB6FEC4I.js';
3
+ import { toSnapshot } from './chunk-JZ67Q3QI.js';
4
+ export { csvToSnapshot, parseCsv } from './chunk-2DI4FJPC.js';
5
5
  import './chunk-5HMKRNIH.js';
6
6
 
7
7
  // src/csv.ts
@@ -0,0 +1,6 @@
1
+ export { importCsv, importSheetSource, importXlsx } from './chunk-3QTRZBIK.js';
2
+ import './chunk-SDVGDHC4.js';
3
+ import './chunk-2DI4FJPC.js';
4
+ import './chunk-5HMKRNIH.js';
5
+ //# sourceMappingURL=import-O7RUERND.js.map
6
+ //# sourceMappingURL=import-O7RUERND.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"import-GVZDLWA2.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"import-O7RUERND.js"}
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import * as react from 'react';
2
2
  import { ReactNode } from 'react';
3
- import { D as DocumentViewProps, a as DocumentFormat } from './registry-CYKivRDh.js';
4
- export { F as FormatAdapter, b as FormatCapabilities, S as SheetOptions, c as SheetUiOptions, d as detectFormat, g as getFormat, l as listFormats, r as registerFormat } from './registry-CYKivRDh.js';
3
+ import { D as DocumentViewProps, a as DocumentFormat } from './registry-BQ5T1Yko.js';
4
+ export { F as FormatAdapter, b as FormatCapabilities, S as SheetOptions, c as SheetUiOptions, d as detectFormat, g as getFormat, l as listFormats, r as registerFormat } from './registry-BQ5T1Yko.js';
5
5
  import './code-types-Dqmit3xx.js';
6
6
  import 'shiki';
7
7
 
package/dist/index.js CHANGED
@@ -51,7 +51,7 @@ registerFormat({
51
51
  // 只导活动表、其余表在 warnings 里点名
52
52
  exportFormats: ["xlsx", "csv"]
53
53
  },
54
- load: () => import('./SheetView-SDBRSTVS.js')
54
+ load: () => import('./SheetView-YFK7BUS5.js')
55
55
  });
56
56
  registerFormat({
57
57
  format: "pdf",
package/dist/pdf.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as react from 'react';
2
- import { D as DocumentViewProps } from './registry-CYKivRDh.js';
2
+ import { D as DocumentViewProps } from './registry-BQ5T1Yko.js';
3
3
  import './code-types-Dqmit3xx.js';
4
4
  import 'shiki';
5
5
 
package/dist/pptx.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { D as DocumentViewProps } from './registry-CYKivRDh.js';
1
+ import { D as DocumentViewProps } from './registry-BQ5T1Yko.js';
2
2
  import * as react from 'react';
3
3
  import './code-types-Dqmit3xx.js';
4
4
  import 'shiki';
@@ -22,8 +22,8 @@ interface SheetUiOptions {
22
22
  * 在窄面板里还特别挤。显式传值一律以宿主为准。
23
23
  */
24
24
  toolbar?: boolean;
25
- /** 功能区形态:`collapsed` 收起 / `simple` 精简 / `classic` 完整 */
26
- ribbonType?: "collapsed" | "simple" | "classic";
25
+ /** 功能区形态:`collapsed` 收起 / `simple` 精简 / `classic` 完整 / `grid` 分组网格(按钮分组排成两行,类似 Office) */
26
+ ribbonType?: "collapsed" | "simple" | "classic" | "grid";
27
27
  /**
28
28
  * 底栏(工作表标签 + 状态栏)。默认 true。
29
29
  * 多工作表时它是唯一的切表入口 —— 只读预览也别关,否则用户只能看见第一张表。
@@ -33,7 +33,7 @@ interface SheetUiOptions {
33
33
  formulaBar?: boolean;
34
34
  /** 右键菜单。默认 true(只读下仍保留复制) */
35
35
  contextMenu?: boolean;
36
- /** 底部状态栏的求和 / 计数统计。默认 true */
36
+ /** 底部状态栏的求和 / 计数统计,对应 Univer 的 `footer.statisticBar`。默认 true */
37
37
  statusBarStatistic?: boolean;
38
38
  /** 逐个菜单项的显隐与禁用,key 是 Univer 的命令 id。透传给 `IUniverUIConfig["menu"]` */
39
39
  menu?: Record<string, unknown>;
@@ -44,23 +44,16 @@ interface SheetOptions {
44
44
  /**
45
45
  * 内置查找替换(Ctrl+F)。
46
46
  *
47
- * 不需要宿主额外装包:`preset-sheets-find-replace` 是 `@univerjs/presets`
48
- * 自己的 dependency,这里走子路径动态 import,只在开了的时候才下载。
47
+ * 引擎来自 `@univerjs/preset-sheets-find-replace`,动态 import,只在开了的时候才下载。
48
+ * 但不开也得装:宿主的打包器在构建期就会解析这条 import,解析不到直接构建失败。
49
+ * 样式随功能一起加载。
49
50
  */
50
51
  findReplace?: boolean;
51
52
  /**
52
- * 追加任意其它 Univer preset(筛选、排序、条件格式、图片……)。
53
+ * 追加内置之外的 Univer preset。
53
54
  *
54
- * 宿主自己 import 工厂函数、自己调用,把返回值传进来 —— 本包不代劳,
55
- * 因为每个 preset 都是一笔独立体积,该由用它的人显式付出。
56
- *
57
- * ```ts
58
- * import { UniverSheetsFilterPreset } from "@univerjs/presets/preset-sheets-filter"
59
- * import zhCN from "@univerjs/presets/preset-sheets-filter/locales/zh-CN"
60
- *
61
- * <DocumentView format="sheet" content={snapshot}
62
- * sheet={{ presets: [UniverSheetsFilterPreset()], locales: [zhCN] }} />
63
- * ```
55
+ * 筛选、排序、数据校验、条件格式、超链接、批注、评论、表格和浮动图片已经内置,
56
+ * 不必再传。若仍传了,同名插件以这里这份为准(便于改配置),不会重复注册。
64
57
  *
65
58
  * 类型是 `unknown[]`:`@univerjs/presets` 是可选 peer,没装的项目里
66
59
  * `IPreset` 根本解析不到,写死类型会让这些人 typecheck 直接红。
@@ -24,6 +24,12 @@ declare function readSheet(univerAPI: unknown, args?: SheetReadArgs): {
24
24
  ref: string;
25
25
  formula: string;
26
26
  }[] | undefined;
27
+ sheet: string;
28
+ /** 本次实际读到的区域(A1 形式) */
29
+ range: string | null;
30
+ /** CSV 文本。首行是区域第一行,**不是表头行标注** —— 列含义自己看内容 */
31
+ csv: string;
32
+ dateSystem?: string | undefined;
27
33
  sheets: {
28
34
  active?: boolean | undefined;
29
35
  hidden?: boolean | undefined;
@@ -32,11 +38,6 @@ declare function readSheet(univerAPI: unknown, args?: SheetReadArgs): {
32
38
  rows: number;
33
39
  cols: number;
34
40
  }[];
35
- sheet: string;
36
- /** 本次实际读到的区域(A1 形式) */
37
- range: string | null;
38
- /** CSV 文本。首行是区域第一行,**不是表头行标注** —— 列含义自己看内容 */
39
- csv: string;
40
41
  };
41
42
  interface SheetFindArgs {
42
43
  query: string;
@@ -140,6 +141,10 @@ declare class SheetRuntime {
140
141
  ref: string;
141
142
  formula: string;
142
143
  }[] | undefined;
144
+ sheet: string;
145
+ range: string | null;
146
+ csv: string;
147
+ dateSystem?: string | undefined;
143
148
  sheets: {
144
149
  active?: boolean | undefined;
145
150
  hidden?: boolean | undefined;
@@ -148,9 +153,6 @@ declare class SheetRuntime {
148
153
  rows: number;
149
154
  cols: number;
150
155
  }[];
151
- sheet: string;
152
- range: string | null;
153
- csv: string;
154
156
  };
155
157
  /** 全簿检索(值和公式都搜),返回可回填给写工具的 sheet + ref。 */
156
158
  find(args: SheetFindArgs): {
@@ -1,6 +1,6 @@
1
- import { parseRange, cellRef, parseCellRef } from './chunk-SBTKDJAL.js';
2
- import { escapeCsvField, activeSheetId } from './chunk-HPSPOM2O.js';
3
- import { snapshotFromUniver } from './chunk-WF7PIIFR.js';
1
+ import { parseRange, cellRef, parseCellRef, bytesToBase64 } from './chunk-SDVGDHC4.js';
2
+ import { escapeCsvField, activeSheetId } from './chunk-XB6FEC4I.js';
3
+ import { snapshotFromUniver } from './chunk-JZ67Q3QI.js';
4
4
  import { numericKeys, richTextToPlain } from './chunk-5HMKRNIH.js';
5
5
 
6
6
  // src/sheet-runtime/facade.ts
@@ -168,6 +168,8 @@ function readSheet(univerAPI, args = {}) {
168
168
  const overview = listWorkbookSheets(workbook, univerAPI);
169
169
  return {
170
170
  sheets: overview,
171
+ // 日期格读出来是序列号;1904 体系从 1904-01-01 起算,同一个数比 1900 体系晚 1462 天
172
+ ...workbook.dateSystem === "date1904" ? { dateSystem: "date1904" } : {},
171
173
  sheet: sheet.name ?? id,
172
174
  /** 本次实际读到的区域(A1 形式) */
173
175
  range: extent.rows === 0 ? null : `${cellRef(startRow, startCol)}:${cellRef(Math.max(endRow, startRow), Math.max(endCol, startCol))}`,
@@ -191,7 +193,7 @@ function listWorkbookSheets(workbook, univerAPI) {
191
193
  name: s.name ?? id,
192
194
  rows: extent.rows,
193
195
  cols: extent.cols,
194
- ...s.hidden === 1 ? { hidden: true } : {},
196
+ ...s.hidden ? { hidden: true } : {},
195
197
  ...id === active ? { active: true } : {}
196
198
  };
197
199
  });
@@ -314,16 +316,6 @@ function manageSheets(univerAPI, args) {
314
316
  throw new Error(`未知 action「${String(args?.action)}」,可用:add rename delete activate`);
315
317
  }
316
318
  }
317
- function bytesToBase64(bytes) {
318
- const B = globalThis.Buffer;
319
- if (B) return B.from(bytes).toString("base64");
320
- let bin = "";
321
- const CHUNK = 32768;
322
- for (let i = 0; i < bytes.length; i += CHUNK) {
323
- bin += String.fromCharCode(...bytes.subarray(i, i + CHUNK));
324
- }
325
- return btoa(bin);
326
- }
327
319
  function sanitizeFilename(name) {
328
320
  if (!name) return null;
329
321
  const base = name.split(/[/\\]/).pop()?.trim();
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/sheet-runtime/facade.ts","../src/sheet-runtime/operations.ts","../src/sheet-runtime/runtime.ts"],"names":["id"],"mappings":"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","file":"sheet-runtime.js","sourcesContent":["/**\n * 对 Univer facade(FUniver / FWorkbook / FWorksheet / FRange)的全部探测。\n *\n * **为什么集中在这一个文件**:`@univerjs/presets` 是可选 peer,写具体类型会让\n * 没装它的项目 typecheck 直接红,所以整个 sheet-runtime 只能拿 `unknown` 过日子。\n * unknown 上的方法探测是最容易随 Univer 版本漂移的部位 —— 全钉在这里,\n * 漂了只改一个文件,operations 层完全不感知 facade 的形状。\n *\n * 探测失败一律抛**可读的错**(「当前 Univer 版本没有 xxx」),\n * 不静默降级 —— AI 收到错误文本本身就是教学。\n */\n\n/** obj 上的同名方法,绑定 this。没有返回 undefined */\nfunction method<T extends (...args: never[]) => unknown>(\n obj: unknown,\n name: string,\n): T | undefined {\n const fn = (obj as Record<string, unknown> | null)?.[name]\n return typeof fn === \"function\" ? (fn.bind(obj) as T) : undefined\n}\n\n/** 探测一串候选名(新旧 API 名并存时用),全都没有就抛可读错误 */\nfunction need<T extends (...args: never[]) => unknown>(\n obj: unknown,\n names: string[],\n what: string,\n): T {\n for (const name of names) {\n const fn = method<T>(obj, name)\n if (fn) return fn\n }\n throw new Error(`当前 Univer 版本不支持${what}(缺少 ${names.join(\" / \")} 方法)`)\n}\n\n/* ------------------------------ 工作簿 ------------------------------ */\n\nexport function activeWorkbook(univerAPI: unknown): unknown {\n const get = need(univerAPI, [\"getActiveWorkbook\"], \"取当前工作簿\")\n const book = get()\n if (!book) throw new Error(\"拿不到当前工作簿:univerAPI 无效,或表格尚未就绪\")\n return book\n}\n\nexport interface SheetHandle {\n facade: unknown\n id: string\n name: string\n}\n\nfunction toHandle(fws: unknown): SheetHandle {\n return {\n facade: fws,\n id: String(need(fws, [\"getSheetId\"], \"读工作表 id\")() ?? \"\"),\n name: String(need(fws, [\"getSheetName\"], \"读工作表名\")() ?? \"\"),\n }\n}\n\nexport function listSheets(workbook: unknown): SheetHandle[] {\n const sheets = need<() => unknown[]>(workbook, [\"getSheets\"], \"枚举工作表\")() ?? []\n return sheets.map(toHandle)\n}\n\nexport function activeSheet(workbook: unknown): SheetHandle {\n const fws = need(workbook, [\"getActiveSheet\"], \"取活动工作表\")()\n if (!fws) throw new Error(\"拿不到活动工作表\")\n return toHandle(fws)\n}\n\n/**\n * 按 id 或表名找工作表;`ref` 省略时用活动表。\n * 找不到时把现有表名列出来 —— 模型下一步就知道该传什么。\n */\nexport function sheetByRef(workbook: unknown, ref?: string): SheetHandle {\n if (!ref) return activeSheet(workbook)\n const all = listSheets(workbook)\n const hit = all.find((s) => s.id === ref) ?? all.find((s) => s.name === ref)\n if (!hit) {\n const names = all.map((s) => `「${s.name}」`).join(\" \")\n throw new Error(`找不到工作表「${ref}」。现有工作表:${names}`)\n }\n return hit\n}\n\n/* ------------------------------ 区域读写 ------------------------------ */\n\n/** (0-based 起点 + 尺寸) → FRange */\nexport function rangeOf(\n sheet: SheetHandle,\n row: number,\n column: number,\n numRows: number,\n numColumns: number,\n): unknown {\n const getRange = need<(r: number, c: number, nr: number, nc: number) => unknown>(\n sheet.facade,\n [\"getRange\"],\n \"取区域\",\n )\n return getRange(row, column, numRows, numColumns)\n}\n\n/**\n * 往区域写值。`cells` 与区域同尺寸:\n * `{ f }` 是公式、`{ v }` 是值(null 即清空该格)。\n */\nexport function setRangeValues(range: unknown, cells: Array<Array<Record<string, unknown>>>): void {\n need<(v: unknown) => unknown>(range, [\"setValues\"], \"写区域值\")(cells)\n}\n\n/* ------------------------------ 结构操作 ------------------------------ */\n\nexport function insertRows(sheet: SheetHandle, before: number, count: number): void {\n need<(p: number, n: number) => unknown>(\n sheet.facade,\n [\"insertRowsBefore\", \"insertRows\"],\n \"插入行\",\n )(before, count)\n}\n\nexport function deleteRows(sheet: SheetHandle, start: number, count: number): void {\n need<(p: number, n: number) => unknown>(sheet.facade, [\"deleteRows\"], \"删除行\")(start, count)\n}\n\nexport function insertColumns(sheet: SheetHandle, before: number, count: number): void {\n need<(p: number, n: number) => unknown>(\n sheet.facade,\n [\"insertColumnsBefore\", \"insertColumns\"],\n \"插入列\",\n )(before, count)\n}\n\nexport function deleteColumns(sheet: SheetHandle, start: number, count: number): void {\n need<(p: number, n: number) => unknown>(sheet.facade, [\"deleteColumns\"], \"删除列\")(start, count)\n}\n\n/* ------------------------------ 工作表管理 ------------------------------ */\n\nexport function addSheet(workbook: unknown, name?: string): SheetHandle {\n const insert = need<(n?: string) => unknown>(workbook, [\"insertSheet\", \"create\"], \"新建工作表\")\n const fws = insert(name)\n if (!fws) throw new Error(\"新建工作表失败(insertSheet 没有返回工作表实例)\")\n return toHandle(fws)\n}\n\nexport function renameSheet(sheet: SheetHandle, name: string): void {\n need<(n: string) => unknown>(sheet.facade, [\"setName\"], \"重命名工作表\")(name)\n}\n\nexport function deleteSheet(workbook: unknown, sheet: SheetHandle): void {\n need<(s: unknown) => unknown>(workbook, [\"deleteSheet\"], \"删除工作表\")(sheet.facade)\n}\n\nexport function activateSheet(workbook: unknown, sheet: SheetHandle): void {\n const setActive =\n method<(s: unknown) => unknown>(workbook, \"setActiveSheet\") ??\n method<(s: unknown) => unknown>(sheet.facade, \"activate\")\n if (!setActive) {\n throw new Error(\"当前 Univer 版本不支持切换活动表(缺少 setActiveSheet / activate 方法)\")\n }\n // setActiveSheet 挂在 workbook 上收 sheet;activate 挂在 sheet 上不收参数\n if (method(workbook, \"setActiveSheet\")) setActive(sheet.facade)\n else (setActive as () => unknown)()\n}\n","/**\n * sheet 工具面的操作实现。每个工具一个函数,`runtime.ts` 只做分发。\n *\n * 读写分两条路,这是有意的:\n *\n * - **读走快照**(`snapshotFromUniver`):纯数据,不碰 facade 的方法面 ——\n * Univer 版本漂移伤不到读路径;输出是 CSV 文本 + 公式清单,token 成本\n * 是 JSON 单元格矩阵的几分之一。\n * - **写走 facade**(`facade.ts`):写必须进 Univer 的 command 体系才有\n * 撤销栈和协同广播,直接改快照是死路。facade 探测集中在 facade.ts。\n */\n\nimport { numericKeys, richTextToPlain } from \"../xlsx/cell.ts\"\nimport { activeSheetId, escapeCsvField } from \"../xlsx/csv.ts\"\nimport { snapshotFromUniver } from \"../xlsx/snapshot.ts\"\nimport type { CellData, WorkbookData, WorksheetData } from \"../xlsx/types.ts\"\nimport { cellRef, parseCellRef, parseRange } from \"../xlsx/xml.ts\"\nimport {\n activateSheet,\n activeWorkbook,\n addSheet,\n deleteColumns,\n deleteRows,\n deleteSheet,\n insertColumns,\n insertRows,\n listSheets,\n rangeOf,\n renameSheet,\n type SheetHandle,\n setRangeValues,\n sheetByRef,\n} from \"./facade.ts\"\n\n/* ------------------------------ 公用小件 ------------------------------ */\n\n/** 单元格的展示文本。公式格取缓存值;富文本压平 */\nfunction cellText(cell: CellData | undefined): string {\n if (!cell) return \"\"\n const rich = richTextToPlain(cell)\n if (rich !== undefined) return rich\n const v = cell.v\n if (v === undefined || v === null) return \"\"\n if (typeof v === \"boolean\") return v ? \"TRUE\" : \"FALSE\"\n return String(v)\n}\n\n/** 快照里某张表的已用范围(有值/有格式的格子撑出来的) */\nfunction usedExtent(sheet: WorksheetData): { rows: number; cols: number } {\n const cellData = sheet.cellData ?? {}\n const rows = numericKeys(cellData)\n let maxCol = -1\n for (const r of rows) {\n const cols = numericKeys(cellData[r])\n const last = cols[cols.length - 1]\n if (last !== undefined && last > maxCol) maxCol = last\n }\n const maxRow = rows.length ? (rows[rows.length - 1] as number) : -1\n return { rows: maxRow + 1, cols: maxCol + 1 }\n}\n\n/** 快照 + 表引用(id / 名 / 缺省活动表)→ 表。找不到给出现有表名 */\nfunction snapshotSheet(\n workbook: WorkbookData,\n univerAPI: unknown,\n ref?: string,\n): { id: string; sheet: WorksheetData } {\n const order = (\n workbook.sheetOrder?.length ? workbook.sheetOrder : Object.keys(workbook.sheets ?? {})\n ).filter((id) => workbook.sheets?.[id])\n\n const wanted = ref ?? activeSheetId(univerAPI)\n const id =\n (wanted &&\n (order.find((i) => i === wanted) ??\n order.find((i) => (workbook.sheets?.[i] as WorksheetData)?.name === wanted))) ||\n order[0]\n if (!id) throw new Error(\"工作簿里没有工作表\")\n if (ref && id !== ref && (workbook.sheets?.[id] as WorksheetData)?.name !== ref) {\n const names = order.map((i) => `「${(workbook.sheets?.[i] as WorksheetData)?.name ?? i}」`)\n throw new Error(`找不到工作表「${ref}」。现有工作表:${names.join(\" \")}`)\n }\n return { id, sheet: workbook.sheets?.[id] as WorksheetData }\n}\n\n/* -------------------------------- 读 -------------------------------- */\n\n/** 一次读取塞给模型的上限。超出就截断并明说 —— 比悄悄截断或撑爆上下文都好 */\nconst MAX_READ_ROWS = 300\nconst MAX_READ_COLS = 100\n\nexport interface SheetReadArgs {\n /** 工作表 id 或表名,省略用活动表 */\n sheet?: string\n /** A1 区域(如 \"B2:F40\"),省略读整个已用范围 */\n range?: string\n /** 是否附带公式清单,默认 true */\n includeFormulas?: boolean\n}\n\nexport function readSheet(univerAPI: unknown, args: SheetReadArgs = {}) {\n const workbook = snapshotFromUniver(univerAPI)\n const { id, sheet } = snapshotSheet(workbook, univerAPI, args.sheet)\n const extent = usedExtent(sheet)\n\n let startRow = 0\n let startCol = 0\n let endRow = extent.rows - 1\n let endCol = extent.cols - 1\n if (args.range) {\n const range = parseRange(args.range)\n if (!range) throw new Error(`range 不合法:「${args.range}」。要 A1 形式,如 \"B2:F40\"`)\n startRow = range.startRow\n startCol = range.startColumn\n endRow = range.endRow\n endCol = range.endColumn\n }\n\n const truncated = endRow - startRow + 1 > MAX_READ_ROWS || endCol - startCol + 1 > MAX_READ_COLS\n endRow = Math.min(endRow, startRow + MAX_READ_ROWS - 1)\n endCol = Math.min(endCol, startCol + MAX_READ_COLS - 1)\n\n const cellData = sheet.cellData ?? {}\n const lines: string[] = []\n const formulas: Array<{ ref: string; formula: string }> = []\n for (let r = startRow; r <= endRow; r++) {\n const fields: string[] = []\n for (let c = startCol; c <= endCol; c++) {\n const cell = cellData[r]?.[c]\n fields.push(escapeCsvField(cellText(cell)))\n if (cell?.f) formulas.push({ ref: cellRef(r, c), formula: cell.f })\n }\n lines.push(fields.join(\",\"))\n }\n\n const overview = listWorkbookSheets(workbook, univerAPI)\n return {\n sheets: overview,\n sheet: sheet.name ?? id,\n /** 本次实际读到的区域(A1 形式) */\n range:\n extent.rows === 0\n ? null\n : `${cellRef(startRow, startCol)}:${cellRef(Math.max(endRow, startRow), Math.max(endCol, startCol))}`,\n /** CSV 文本。首行是区域第一行,**不是表头行标注** —— 列含义自己看内容 */\n csv: lines.join(\"\\n\"),\n ...(args.includeFormulas === false ? {} : { formulas }),\n ...(truncated\n ? {\n truncated: true,\n note: `区域超过 ${MAX_READ_ROWS}×${MAX_READ_COLS} 上限,已截断。用 range 参数分段读取`,\n }\n : {}),\n }\n}\n\nfunction listWorkbookSheets(workbook: WorkbookData, univerAPI: unknown) {\n const active = activeSheetId(univerAPI)\n const order = (\n workbook.sheetOrder?.length ? workbook.sheetOrder : Object.keys(workbook.sheets ?? {})\n ).filter((id) => workbook.sheets?.[id])\n return order.map((id) => {\n const s = workbook.sheets?.[id] as WorksheetData\n const extent = usedExtent(s)\n return {\n id,\n name: s.name ?? id,\n rows: extent.rows,\n cols: extent.cols,\n ...(s.hidden === 1 ? { hidden: true } : {}),\n ...(id === active ? { active: true } : {}),\n }\n })\n}\n\nexport interface SheetFindArgs {\n query: string\n /** 最多返回几条,默认 20 */\n limit?: number\n}\n\nexport function findInWorkbook(univerAPI: unknown, args: SheetFindArgs) {\n if (!args?.query) throw new Error(\"find 需要 query\")\n const workbook = snapshotFromUniver(univerAPI)\n const limit = args.limit ?? 20\n const query = args.query.toLowerCase()\n\n const matches: Array<{ sheet: string; ref: string; value: string; formula?: string }> = []\n const order = (\n workbook.sheetOrder?.length ? workbook.sheetOrder : Object.keys(workbook.sheets ?? {})\n ).filter((id) => workbook.sheets?.[id])\n\n for (const id of order) {\n const sheet = workbook.sheets?.[id] as WorksheetData\n const cellData = sheet.cellData ?? {}\n for (const r of numericKeys(cellData)) {\n for (const c of numericKeys(cellData[r])) {\n const cell = cellData[r]?.[c]\n const text = cellText(cell)\n const formula = cell?.f\n if (!text.toLowerCase().includes(query) && !(formula ?? \"\").toLowerCase().includes(query)) {\n continue\n }\n matches.push({\n sheet: sheet.name ?? id,\n ref: cellRef(r, c),\n value: text,\n ...(formula ? { formula } : {}),\n })\n if (matches.length >= limit) return { matches, total: matches.length, capped: true }\n }\n }\n }\n return { matches, total: matches.length }\n}\n\n/* -------------------------------- 写 -------------------------------- */\n\nexport type SheetCellInput = string | number | boolean | null\n\nexport interface SetValuesArgs {\n sheet?: string\n /** 写入区域左上角,A1 形式(如 \"B2\") */\n start: string\n /** 二维数组,各行等长。\"=…\" 是公式,null 清空该格 */\n values: SheetCellInput[][]\n}\n\nexport function setValues(univerAPI: unknown, args: SetValuesArgs) {\n const start = args?.start ? parseCellRef(args.start) : undefined\n if (!start) throw new Error(`start 不合法:「${args?.start ?? \"\"}」。要单格 A1 形式,如 \"B2\"`)\n const rows = args.values\n if (!Array.isArray(rows) || !rows.length || !Array.isArray(rows[0])) {\n throw new Error(\"values 要是二维数组:[[行1格1, 行1格2], [行2格1, …]]\")\n }\n const width = (rows[0] as SheetCellInput[]).length\n if (!width) throw new Error(\"values 的行不能是空数组\")\n for (const [i, row] of rows.entries()) {\n if (!Array.isArray(row) || row.length !== width) {\n throw new Error(\n `values 各行要等长:第 1 行 ${width} 格,第 ${i + 1} 行 ${Array.isArray(row) ? row.length : \"?\"} 格。` +\n \"不想改的格子请缩小区域分多次写,null 表示清空\",\n )\n }\n }\n\n const book = activeWorkbook(univerAPI)\n const sheet = sheetByRef(book, args.sheet)\n const cells = rows.map((row) =>\n row.map((value) => {\n if (typeof value === \"string\" && value.startsWith(\"=\")) return { f: value }\n return { v: value }\n }),\n )\n const range = rangeOf(sheet, start.row, start.column, rows.length, width)\n setRangeValues(range, cells)\n\n const endRef = cellRef(start.row + rows.length - 1, start.column + width - 1)\n return {\n sheet: sheet.name,\n range: `${cellRef(start.row, start.column)}:${endRef}`,\n written: rows.length * width,\n }\n}\n\nexport interface EditRowsColsArgs {\n sheet?: string\n action: \"insert_rows\" | \"delete_rows\" | \"insert_cols\" | \"delete_cols\"\n /** 0-based。insert 在此位置**之前**插入;delete 从此位置开始删 */\n index: number\n /** 默认 1 */\n count?: number\n}\n\nexport function editRowsCols(univerAPI: unknown, args: EditRowsColsArgs) {\n const index = args?.index\n if (!Number.isInteger(index) || index < 0) throw new Error(\"index 要是 ≥0 的整数(0-based)\")\n const count = args.count ?? 1\n if (!Number.isInteger(count) || count < 1) throw new Error(\"count 要是 ≥1 的整数\")\n\n const book = activeWorkbook(univerAPI)\n const sheet = sheetByRef(book, args.sheet)\n\n switch (args.action) {\n case \"insert_rows\":\n insertRows(sheet, index, count)\n break\n case \"delete_rows\":\n deleteRows(sheet, index, count)\n break\n case \"insert_cols\":\n insertColumns(sheet, index, count)\n break\n case \"delete_cols\":\n deleteColumns(sheet, index, count)\n break\n default:\n throw new Error(`未知 action「${String(args.action)}」`)\n }\n return { sheet: sheet.name, action: args.action, index, count }\n}\n\nexport interface ManageSheetsArgs {\n action: \"add\" | \"rename\" | \"delete\" | \"activate\"\n /** rename / delete / activate 的目标(id 或表名) */\n sheet?: string\n /** add 的表名 / rename 的新名 */\n name?: string\n}\n\nexport function manageSheets(univerAPI: unknown, args: ManageSheetsArgs) {\n const book = activeWorkbook(univerAPI)\n\n const done = (detail: Record<string, unknown>) => ({\n ...detail,\n sheets: listSheets(book).map((s: SheetHandle) => ({ id: s.id, name: s.name })),\n })\n\n switch (args?.action) {\n case \"add\":\n return done({ action: \"add\", added: addSheet(book, args.name).name })\n case \"rename\": {\n if (!args.name) throw new Error(\"rename 需要 name(新表名)\")\n const sheet = sheetByRef(book, args.sheet)\n renameSheet(sheet, args.name)\n return done({ action: \"rename\", from: sheet.name, to: args.name })\n }\n case \"delete\": {\n if (!args.sheet) throw new Error(\"delete 需要 sheet(表 id 或表名)—— 不允许默认删活动表\")\n const sheet = sheetByRef(book, args.sheet)\n deleteSheet(book, sheet)\n return done({ action: \"delete\", deleted: sheet.name })\n }\n case \"activate\": {\n const sheet = sheetByRef(book, args.sheet)\n activateSheet(book, sheet)\n return done({ action: \"activate\", active: sheet.name })\n }\n default:\n throw new Error(`未知 action「${String(args?.action)}」,可用:add rename delete activate`)\n }\n}\n\n/* ------------------------------ 导出 ------------------------------ */\n\n/** 字节 → base64。浏览器没有 Buffer,得分块 btoa(一把梭会爆调用栈) */\nfunction bytesToBase64(bytes: Uint8Array): string {\n const B = (globalThis as { Buffer?: { from(b: Uint8Array): { toString(e: string): string } } })\n .Buffer\n if (B) return B.from(bytes).toString(\"base64\")\n let bin = \"\"\n const CHUNK = 0x8000\n for (let i = 0; i < bytes.length; i += CHUNK) {\n bin += String.fromCharCode(...bytes.subarray(i, i + CHUNK))\n }\n return btoa(bin)\n}\n\n/** 文件名消毒:只留基名,挡掉路径分隔符和 `..`。hub 那边还会再校验一次 */\nfunction sanitizeFilename(name: string | undefined): string | null {\n if (!name) return null\n const base = name.split(/[/\\\\]/).pop()?.trim()\n if (!base || base === \".\" || base === \"..\") return null\n return /\\.xlsx$/i.test(base) ? base : `${base}.xlsx`\n}\n\nexport async function exportXlsxBase64(univerAPI: unknown, args: { filename?: string } = {}) {\n // 动态 import:fflate 的 zip 只在真的导出时才需要\n const { exportXlsx } = await import(\"../xlsx/index.ts\")\n const { bytes, warnings, stats } = exportXlsx(univerAPI)\n return {\n filename: sanitizeFilename(args.filename) ?? \"工作簿.xlsx\",\n base64: bytesToBase64(bytes),\n bytes: bytes.length,\n warnings,\n stats,\n }\n}\n","/**\n * SheetRuntime —— 包着一个 Univer facade(FUniver)实例的结构化操作面。\n *\n * **这层不知道 MCP 存在**,也不知道 HTTP、WebSocket、tool schema 存在。\n * 和 `DocRuntime` 完全对称:`setUniverAPI` / `isReady` / 一组方法 / `call` 分发。\n * 工具定义和传输在 `@4399ywkf/editor-mcp`。\n *\n * ```tsx\n * const runtime = useMemo(() => new SheetRuntime(), [])\n * <DocumentView format=\"sheet\" onReady={(api) => runtime.setUniverAPI(api)} />\n * ```\n */\n\nimport {\n type EditRowsColsArgs,\n editRowsCols,\n exportXlsxBase64,\n findInWorkbook,\n type ManageSheetsArgs,\n manageSheets,\n readSheet,\n type SetValuesArgs,\n type SheetFindArgs,\n type SheetReadArgs,\n setValues,\n} from \"./operations.ts\"\n\nexport class SheetRuntime {\n private univerAPI: unknown\n\n constructor(univerAPI?: unknown) {\n this.univerAPI = univerAPI ?? null\n }\n\n /** Univer 实例就绪 / 卸载时调用。配合 `<DocumentView onReady>` 用。 */\n setUniverAPI(univerAPI: unknown): void {\n this.univerAPI = univerAPI\n }\n\n isReady(): boolean {\n return Boolean(this.univerAPI)\n }\n\n private use(): unknown {\n if (!this.univerAPI) throw new Error(\"表格尚未就绪:先调 setUniverAPI(univerAPI)\")\n return this.univerAPI\n }\n\n /* ------------------------------ 读 ------------------------------ */\n\n /** 工作簿概览 + 一张表的 CSV 视图与公式清单。要写之前先调它看清现状。 */\n read(args: SheetReadArgs = {}) {\n return readSheet(this.use(), args)\n }\n\n /** 全簿检索(值和公式都搜),返回可回填给写工具的 sheet + ref。 */\n find(args: SheetFindArgs) {\n return findInWorkbook(this.use(), args)\n }\n\n /* ------------------------------ 写 ------------------------------ */\n\n /** 从 start 起写一块二维值。\"=…\" 是公式,null 清空。 */\n setValues(args: SetValuesArgs) {\n return setValues(this.use(), args)\n }\n\n /** 插入 / 删除行列。 */\n editRowsCols(args: EditRowsColsArgs) {\n return editRowsCols(this.use(), args)\n }\n\n /** 新建 / 重命名 / 删除 / 激活工作表。 */\n manageSheets(args: ManageSheetsArgs) {\n return manageSheets(this.use(), args)\n }\n\n /* ------------------------------ 导出 ------------------------------ */\n\n /** 导出 .xlsx(base64 给传输层,模型只看路径 —— 和 doc_export_docx 同一约定)。 */\n exportXlsx(args: { filename?: string } = {}) {\n return exportXlsxBase64(this.use(), args)\n }\n\n /* ---------------------------- 统一入口 ---------------------------- */\n\n /**\n * 工具名 → 方法。给传输层(MCP 桥、agent executor)用的单一分发口,\n * 和 `DocRuntime.call` 同构 —— 桥不需要知道自己面对的是文档还是表格。\n */\n async call(tool: string, args: Record<string, unknown> = {}): Promise<unknown> {\n switch (tool) {\n case \"sheet_read\":\n return this.read(args as SheetReadArgs)\n case \"sheet_find\":\n return this.find(args as unknown as SheetFindArgs)\n case \"sheet_set_values\":\n return this.setValues(args as unknown as SetValuesArgs)\n case \"sheet_edit_rows_cols\":\n return this.editRowsCols(args as unknown as EditRowsColsArgs)\n case \"sheet_manage_sheets\":\n return this.manageSheets(args as unknown as ManageSheetsArgs)\n case \"sheet_export_xlsx\":\n return this.exportXlsx(args as { filename?: string })\n default:\n throw new Error(`未知工具 ${tool}`)\n }\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/sheet-runtime/facade.ts","../src/sheet-runtime/operations.ts","../src/sheet-runtime/runtime.ts"],"names":["id"],"mappings":"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","file":"sheet-runtime.js","sourcesContent":["/**\n * 对 Univer facade(FUniver / FWorkbook / FWorksheet / FRange)的全部探测。\n *\n * **为什么集中在这一个文件**:`@univerjs/presets` 是可选 peer,写具体类型会让\n * 没装它的项目 typecheck 直接红,所以整个 sheet-runtime 只能拿 `unknown` 过日子。\n * unknown 上的方法探测是最容易随 Univer 版本漂移的部位 —— 全钉在这里,\n * 漂了只改一个文件,operations 层完全不感知 facade 的形状。\n *\n * 探测失败一律抛**可读的错**(「当前 Univer 版本没有 xxx」),\n * 不静默降级 —— AI 收到错误文本本身就是教学。\n */\n\n/** obj 上的同名方法,绑定 this。没有返回 undefined */\nfunction method<T extends (...args: never[]) => unknown>(\n obj: unknown,\n name: string,\n): T | undefined {\n const fn = (obj as Record<string, unknown> | null)?.[name]\n return typeof fn === \"function\" ? (fn.bind(obj) as T) : undefined\n}\n\n/** 探测一串候选名(新旧 API 名并存时用),全都没有就抛可读错误 */\nfunction need<T extends (...args: never[]) => unknown>(\n obj: unknown,\n names: string[],\n what: string,\n): T {\n for (const name of names) {\n const fn = method<T>(obj, name)\n if (fn) return fn\n }\n throw new Error(`当前 Univer 版本不支持${what}(缺少 ${names.join(\" / \")} 方法)`)\n}\n\n/* ------------------------------ 工作簿 ------------------------------ */\n\nexport function activeWorkbook(univerAPI: unknown): unknown {\n const get = need(univerAPI, [\"getActiveWorkbook\"], \"取当前工作簿\")\n const book = get()\n if (!book) throw new Error(\"拿不到当前工作簿:univerAPI 无效,或表格尚未就绪\")\n return book\n}\n\nexport interface SheetHandle {\n facade: unknown\n id: string\n name: string\n}\n\nfunction toHandle(fws: unknown): SheetHandle {\n return {\n facade: fws,\n id: String(need(fws, [\"getSheetId\"], \"读工作表 id\")() ?? \"\"),\n name: String(need(fws, [\"getSheetName\"], \"读工作表名\")() ?? \"\"),\n }\n}\n\nexport function listSheets(workbook: unknown): SheetHandle[] {\n const sheets = need<() => unknown[]>(workbook, [\"getSheets\"], \"枚举工作表\")() ?? []\n return sheets.map(toHandle)\n}\n\nexport function activeSheet(workbook: unknown): SheetHandle {\n const fws = need(workbook, [\"getActiveSheet\"], \"取活动工作表\")()\n if (!fws) throw new Error(\"拿不到活动工作表\")\n return toHandle(fws)\n}\n\n/**\n * 按 id 或表名找工作表;`ref` 省略时用活动表。\n * 找不到时把现有表名列出来 —— 模型下一步就知道该传什么。\n */\nexport function sheetByRef(workbook: unknown, ref?: string): SheetHandle {\n if (!ref) return activeSheet(workbook)\n const all = listSheets(workbook)\n const hit = all.find((s) => s.id === ref) ?? all.find((s) => s.name === ref)\n if (!hit) {\n const names = all.map((s) => `「${s.name}」`).join(\" \")\n throw new Error(`找不到工作表「${ref}」。现有工作表:${names}`)\n }\n return hit\n}\n\n/* ------------------------------ 区域读写 ------------------------------ */\n\n/** (0-based 起点 + 尺寸) → FRange */\nexport function rangeOf(\n sheet: SheetHandle,\n row: number,\n column: number,\n numRows: number,\n numColumns: number,\n): unknown {\n const getRange = need<(r: number, c: number, nr: number, nc: number) => unknown>(\n sheet.facade,\n [\"getRange\"],\n \"取区域\",\n )\n return getRange(row, column, numRows, numColumns)\n}\n\n/**\n * 往区域写值。`cells` 与区域同尺寸:\n * `{ f }` 是公式、`{ v }` 是值(null 即清空该格)。\n */\nexport function setRangeValues(range: unknown, cells: Array<Array<Record<string, unknown>>>): void {\n need<(v: unknown) => unknown>(range, [\"setValues\"], \"写区域值\")(cells)\n}\n\n/* ------------------------------ 结构操作 ------------------------------ */\n\nexport function insertRows(sheet: SheetHandle, before: number, count: number): void {\n need<(p: number, n: number) => unknown>(\n sheet.facade,\n [\"insertRowsBefore\", \"insertRows\"],\n \"插入行\",\n )(before, count)\n}\n\nexport function deleteRows(sheet: SheetHandle, start: number, count: number): void {\n need<(p: number, n: number) => unknown>(sheet.facade, [\"deleteRows\"], \"删除行\")(start, count)\n}\n\nexport function insertColumns(sheet: SheetHandle, before: number, count: number): void {\n need<(p: number, n: number) => unknown>(\n sheet.facade,\n [\"insertColumnsBefore\", \"insertColumns\"],\n \"插入列\",\n )(before, count)\n}\n\nexport function deleteColumns(sheet: SheetHandle, start: number, count: number): void {\n need<(p: number, n: number) => unknown>(sheet.facade, [\"deleteColumns\"], \"删除列\")(start, count)\n}\n\n/* ------------------------------ 工作表管理 ------------------------------ */\n\nexport function addSheet(workbook: unknown, name?: string): SheetHandle {\n const insert = need<(n?: string) => unknown>(workbook, [\"insertSheet\", \"create\"], \"新建工作表\")\n const fws = insert(name)\n if (!fws) throw new Error(\"新建工作表失败(insertSheet 没有返回工作表实例)\")\n return toHandle(fws)\n}\n\nexport function renameSheet(sheet: SheetHandle, name: string): void {\n need<(n: string) => unknown>(sheet.facade, [\"setName\"], \"重命名工作表\")(name)\n}\n\nexport function deleteSheet(workbook: unknown, sheet: SheetHandle): void {\n need<(s: unknown) => unknown>(workbook, [\"deleteSheet\"], \"删除工作表\")(sheet.facade)\n}\n\nexport function activateSheet(workbook: unknown, sheet: SheetHandle): void {\n const setActive =\n method<(s: unknown) => unknown>(workbook, \"setActiveSheet\") ??\n method<(s: unknown) => unknown>(sheet.facade, \"activate\")\n if (!setActive) {\n throw new Error(\"当前 Univer 版本不支持切换活动表(缺少 setActiveSheet / activate 方法)\")\n }\n // setActiveSheet 挂在 workbook 上收 sheet;activate 挂在 sheet 上不收参数\n if (method(workbook, \"setActiveSheet\")) setActive(sheet.facade)\n else (setActive as () => unknown)()\n}\n","/**\n * sheet 工具面的操作实现。每个工具一个函数,`runtime.ts` 只做分发。\n *\n * 读写分两条路,这是有意的:\n *\n * - **读走快照**(`snapshotFromUniver`):纯数据,不碰 facade 的方法面 ——\n * Univer 版本漂移伤不到读路径;输出是 CSV 文本 + 公式清单,token 成本\n * 是 JSON 单元格矩阵的几分之一。\n * - **写走 facade**(`facade.ts`):写必须进 Univer 的 command 体系才有\n * 撤销栈和协同广播,直接改快照是死路。facade 探测集中在 facade.ts。\n */\n\nimport { numericKeys, richTextToPlain } from \"../xlsx/cell.ts\"\nimport { activeSheetId, escapeCsvField } from \"../xlsx/csv.ts\"\nimport { bytesToBase64 } from \"../xlsx/media.ts\"\nimport { snapshotFromUniver } from \"../xlsx/snapshot.ts\"\nimport type { CellData, WorkbookData, WorksheetData } from \"../xlsx/types.ts\"\nimport { cellRef, parseCellRef, parseRange } from \"../xlsx/xml.ts\"\nimport {\n activateSheet,\n activeWorkbook,\n addSheet,\n deleteColumns,\n deleteRows,\n deleteSheet,\n insertColumns,\n insertRows,\n listSheets,\n rangeOf,\n renameSheet,\n type SheetHandle,\n setRangeValues,\n sheetByRef,\n} from \"./facade.ts\"\n\n/* ------------------------------ 公用小件 ------------------------------ */\n\n/** 单元格的展示文本。公式格取缓存值;富文本压平 */\nfunction cellText(cell: CellData | undefined): string {\n if (!cell) return \"\"\n const rich = richTextToPlain(cell)\n if (rich !== undefined) return rich\n const v = cell.v\n if (v === undefined || v === null) return \"\"\n if (typeof v === \"boolean\") return v ? \"TRUE\" : \"FALSE\"\n return String(v)\n}\n\n/** 快照里某张表的已用范围(有值/有格式的格子撑出来的) */\nfunction usedExtent(sheet: WorksheetData): { rows: number; cols: number } {\n const cellData = sheet.cellData ?? {}\n const rows = numericKeys(cellData)\n let maxCol = -1\n for (const r of rows) {\n const cols = numericKeys(cellData[r])\n const last = cols[cols.length - 1]\n if (last !== undefined && last > maxCol) maxCol = last\n }\n const maxRow = rows.length ? (rows[rows.length - 1] as number) : -1\n return { rows: maxRow + 1, cols: maxCol + 1 }\n}\n\n/** 快照 + 表引用(id / 名 / 缺省活动表)→ 表。找不到给出现有表名 */\nfunction snapshotSheet(\n workbook: WorkbookData,\n univerAPI: unknown,\n ref?: string,\n): { id: string; sheet: WorksheetData } {\n const order = (\n workbook.sheetOrder?.length ? workbook.sheetOrder : Object.keys(workbook.sheets ?? {})\n ).filter((id) => workbook.sheets?.[id])\n\n const wanted = ref ?? activeSheetId(univerAPI)\n const id =\n (wanted &&\n (order.find((i) => i === wanted) ??\n order.find((i) => (workbook.sheets?.[i] as WorksheetData)?.name === wanted))) ||\n order[0]\n if (!id) throw new Error(\"工作簿里没有工作表\")\n if (ref && id !== ref && (workbook.sheets?.[id] as WorksheetData)?.name !== ref) {\n const names = order.map((i) => `「${(workbook.sheets?.[i] as WorksheetData)?.name ?? i}」`)\n throw new Error(`找不到工作表「${ref}」。现有工作表:${names.join(\" \")}`)\n }\n return { id, sheet: workbook.sheets?.[id] as WorksheetData }\n}\n\n/* -------------------------------- 读 -------------------------------- */\n\n/** 一次读取塞给模型的上限。超出就截断并明说 —— 比悄悄截断或撑爆上下文都好 */\nconst MAX_READ_ROWS = 300\nconst MAX_READ_COLS = 100\n\nexport interface SheetReadArgs {\n /** 工作表 id 或表名,省略用活动表 */\n sheet?: string\n /** A1 区域(如 \"B2:F40\"),省略读整个已用范围 */\n range?: string\n /** 是否附带公式清单,默认 true */\n includeFormulas?: boolean\n}\n\nexport function readSheet(univerAPI: unknown, args: SheetReadArgs = {}) {\n const workbook = snapshotFromUniver(univerAPI)\n const { id, sheet } = snapshotSheet(workbook, univerAPI, args.sheet)\n const extent = usedExtent(sheet)\n\n let startRow = 0\n let startCol = 0\n let endRow = extent.rows - 1\n let endCol = extent.cols - 1\n if (args.range) {\n const range = parseRange(args.range)\n if (!range) throw new Error(`range 不合法:「${args.range}」。要 A1 形式,如 \"B2:F40\"`)\n startRow = range.startRow\n startCol = range.startColumn\n endRow = range.endRow\n endCol = range.endColumn\n }\n\n const truncated = endRow - startRow + 1 > MAX_READ_ROWS || endCol - startCol + 1 > MAX_READ_COLS\n endRow = Math.min(endRow, startRow + MAX_READ_ROWS - 1)\n endCol = Math.min(endCol, startCol + MAX_READ_COLS - 1)\n\n const cellData = sheet.cellData ?? {}\n const lines: string[] = []\n const formulas: Array<{ ref: string; formula: string }> = []\n for (let r = startRow; r <= endRow; r++) {\n const fields: string[] = []\n for (let c = startCol; c <= endCol; c++) {\n const cell = cellData[r]?.[c]\n fields.push(escapeCsvField(cellText(cell)))\n if (cell?.f) formulas.push({ ref: cellRef(r, c), formula: cell.f })\n }\n lines.push(fields.join(\",\"))\n }\n\n const overview = listWorkbookSheets(workbook, univerAPI)\n return {\n sheets: overview,\n // 日期格读出来是序列号;1904 体系从 1904-01-01 起算,同一个数比 1900 体系晚 1462 天\n ...(workbook.dateSystem === \"date1904\" ? { dateSystem: \"date1904\" } : {}),\n sheet: sheet.name ?? id,\n /** 本次实际读到的区域(A1 形式) */\n range:\n extent.rows === 0\n ? null\n : `${cellRef(startRow, startCol)}:${cellRef(Math.max(endRow, startRow), Math.max(endCol, startCol))}`,\n /** CSV 文本。首行是区域第一行,**不是表头行标注** —— 列含义自己看内容 */\n csv: lines.join(\"\\n\"),\n ...(args.includeFormulas === false ? {} : { formulas }),\n ...(truncated\n ? {\n truncated: true,\n note: `区域超过 ${MAX_READ_ROWS}×${MAX_READ_COLS} 上限,已截断。用 range 参数分段读取`,\n }\n : {}),\n }\n}\n\nfunction listWorkbookSheets(workbook: WorkbookData, univerAPI: unknown) {\n const active = activeSheetId(univerAPI)\n const order = (\n workbook.sheetOrder?.length ? workbook.sheetOrder : Object.keys(workbook.sheets ?? {})\n ).filter((id) => workbook.sheets?.[id])\n return order.map((id) => {\n const s = workbook.sheets?.[id] as WorksheetData\n const extent = usedExtent(s)\n return {\n id,\n name: s.name ?? id,\n rows: extent.rows,\n cols: extent.cols,\n ...(s.hidden ? { hidden: true } : {}),\n ...(id === active ? { active: true } : {}),\n }\n })\n}\n\nexport interface SheetFindArgs {\n query: string\n /** 最多返回几条,默认 20 */\n limit?: number\n}\n\nexport function findInWorkbook(univerAPI: unknown, args: SheetFindArgs) {\n if (!args?.query) throw new Error(\"find 需要 query\")\n const workbook = snapshotFromUniver(univerAPI)\n const limit = args.limit ?? 20\n const query = args.query.toLowerCase()\n\n const matches: Array<{ sheet: string; ref: string; value: string; formula?: string }> = []\n const order = (\n workbook.sheetOrder?.length ? workbook.sheetOrder : Object.keys(workbook.sheets ?? {})\n ).filter((id) => workbook.sheets?.[id])\n\n for (const id of order) {\n const sheet = workbook.sheets?.[id] as WorksheetData\n const cellData = sheet.cellData ?? {}\n for (const r of numericKeys(cellData)) {\n for (const c of numericKeys(cellData[r])) {\n const cell = cellData[r]?.[c]\n const text = cellText(cell)\n const formula = cell?.f\n if (!text.toLowerCase().includes(query) && !(formula ?? \"\").toLowerCase().includes(query)) {\n continue\n }\n matches.push({\n sheet: sheet.name ?? id,\n ref: cellRef(r, c),\n value: text,\n ...(formula ? { formula } : {}),\n })\n if (matches.length >= limit) return { matches, total: matches.length, capped: true }\n }\n }\n }\n return { matches, total: matches.length }\n}\n\n/* -------------------------------- 写 -------------------------------- */\n\nexport type SheetCellInput = string | number | boolean | null\n\nexport interface SetValuesArgs {\n sheet?: string\n /** 写入区域左上角,A1 形式(如 \"B2\") */\n start: string\n /** 二维数组,各行等长。\"=…\" 是公式,null 清空该格 */\n values: SheetCellInput[][]\n}\n\nexport function setValues(univerAPI: unknown, args: SetValuesArgs) {\n const start = args?.start ? parseCellRef(args.start) : undefined\n if (!start) throw new Error(`start 不合法:「${args?.start ?? \"\"}」。要单格 A1 形式,如 \"B2\"`)\n const rows = args.values\n if (!Array.isArray(rows) || !rows.length || !Array.isArray(rows[0])) {\n throw new Error(\"values 要是二维数组:[[行1格1, 行1格2], [行2格1, …]]\")\n }\n const width = (rows[0] as SheetCellInput[]).length\n if (!width) throw new Error(\"values 的行不能是空数组\")\n for (const [i, row] of rows.entries()) {\n if (!Array.isArray(row) || row.length !== width) {\n throw new Error(\n `values 各行要等长:第 1 行 ${width} 格,第 ${i + 1} 行 ${Array.isArray(row) ? row.length : \"?\"} 格。` +\n \"不想改的格子请缩小区域分多次写,null 表示清空\",\n )\n }\n }\n\n const book = activeWorkbook(univerAPI)\n const sheet = sheetByRef(book, args.sheet)\n const cells = rows.map((row) =>\n row.map((value) => {\n if (typeof value === \"string\" && value.startsWith(\"=\")) return { f: value }\n return { v: value }\n }),\n )\n const range = rangeOf(sheet, start.row, start.column, rows.length, width)\n setRangeValues(range, cells)\n\n const endRef = cellRef(start.row + rows.length - 1, start.column + width - 1)\n return {\n sheet: sheet.name,\n range: `${cellRef(start.row, start.column)}:${endRef}`,\n written: rows.length * width,\n }\n}\n\nexport interface EditRowsColsArgs {\n sheet?: string\n action: \"insert_rows\" | \"delete_rows\" | \"insert_cols\" | \"delete_cols\"\n /** 0-based。insert 在此位置**之前**插入;delete 从此位置开始删 */\n index: number\n /** 默认 1 */\n count?: number\n}\n\nexport function editRowsCols(univerAPI: unknown, args: EditRowsColsArgs) {\n const index = args?.index\n if (!Number.isInteger(index) || index < 0) throw new Error(\"index 要是 ≥0 的整数(0-based)\")\n const count = args.count ?? 1\n if (!Number.isInteger(count) || count < 1) throw new Error(\"count 要是 ≥1 的整数\")\n\n const book = activeWorkbook(univerAPI)\n const sheet = sheetByRef(book, args.sheet)\n\n switch (args.action) {\n case \"insert_rows\":\n insertRows(sheet, index, count)\n break\n case \"delete_rows\":\n deleteRows(sheet, index, count)\n break\n case \"insert_cols\":\n insertColumns(sheet, index, count)\n break\n case \"delete_cols\":\n deleteColumns(sheet, index, count)\n break\n default:\n throw new Error(`未知 action「${String(args.action)}」`)\n }\n return { sheet: sheet.name, action: args.action, index, count }\n}\n\nexport interface ManageSheetsArgs {\n action: \"add\" | \"rename\" | \"delete\" | \"activate\"\n /** rename / delete / activate 的目标(id 或表名) */\n sheet?: string\n /** add 的表名 / rename 的新名 */\n name?: string\n}\n\nexport function manageSheets(univerAPI: unknown, args: ManageSheetsArgs) {\n const book = activeWorkbook(univerAPI)\n\n const done = (detail: Record<string, unknown>) => ({\n ...detail,\n sheets: listSheets(book).map((s: SheetHandle) => ({ id: s.id, name: s.name })),\n })\n\n switch (args?.action) {\n case \"add\":\n return done({ action: \"add\", added: addSheet(book, args.name).name })\n case \"rename\": {\n if (!args.name) throw new Error(\"rename 需要 name(新表名)\")\n const sheet = sheetByRef(book, args.sheet)\n renameSheet(sheet, args.name)\n return done({ action: \"rename\", from: sheet.name, to: args.name })\n }\n case \"delete\": {\n if (!args.sheet) throw new Error(\"delete 需要 sheet(表 id 或表名)—— 不允许默认删活动表\")\n const sheet = sheetByRef(book, args.sheet)\n deleteSheet(book, sheet)\n return done({ action: \"delete\", deleted: sheet.name })\n }\n case \"activate\": {\n const sheet = sheetByRef(book, args.sheet)\n activateSheet(book, sheet)\n return done({ action: \"activate\", active: sheet.name })\n }\n default:\n throw new Error(`未知 action「${String(args?.action)}」,可用:add rename delete activate`)\n }\n}\n\n/* ------------------------------ 导出 ------------------------------ */\n\n/** 文件名消毒:只留基名,挡掉路径分隔符和 `..`。hub 那边还会再校验一次 */\nfunction sanitizeFilename(name: string | undefined): string | null {\n if (!name) return null\n const base = name.split(/[/\\\\]/).pop()?.trim()\n if (!base || base === \".\" || base === \"..\") return null\n return /\\.xlsx$/i.test(base) ? base : `${base}.xlsx`\n}\n\nexport async function exportXlsxBase64(univerAPI: unknown, args: { filename?: string } = {}) {\n // 动态 import:fflate 的 zip 只在真的导出时才需要\n const { exportXlsx } = await import(\"../xlsx/index.ts\")\n const { bytes, warnings, stats } = exportXlsx(univerAPI)\n return {\n filename: sanitizeFilename(args.filename) ?? \"工作簿.xlsx\",\n base64: bytesToBase64(bytes),\n bytes: bytes.length,\n warnings,\n stats,\n }\n}\n","/**\n * SheetRuntime —— 包着一个 Univer facade(FUniver)实例的结构化操作面。\n *\n * **这层不知道 MCP 存在**,也不知道 HTTP、WebSocket、tool schema 存在。\n * 和 `DocRuntime` 完全对称:`setUniverAPI` / `isReady` / 一组方法 / `call` 分发。\n * 工具定义和传输在 `@4399ywkf/editor-mcp`。\n *\n * ```tsx\n * const runtime = useMemo(() => new SheetRuntime(), [])\n * <DocumentView format=\"sheet\" onReady={(api) => runtime.setUniverAPI(api)} />\n * ```\n */\n\nimport {\n type EditRowsColsArgs,\n editRowsCols,\n exportXlsxBase64,\n findInWorkbook,\n type ManageSheetsArgs,\n manageSheets,\n readSheet,\n type SetValuesArgs,\n type SheetFindArgs,\n type SheetReadArgs,\n setValues,\n} from \"./operations.ts\"\n\nexport class SheetRuntime {\n private univerAPI: unknown\n\n constructor(univerAPI?: unknown) {\n this.univerAPI = univerAPI ?? null\n }\n\n /** Univer 实例就绪 / 卸载时调用。配合 `<DocumentView onReady>` 用。 */\n setUniverAPI(univerAPI: unknown): void {\n this.univerAPI = univerAPI\n }\n\n isReady(): boolean {\n return Boolean(this.univerAPI)\n }\n\n private use(): unknown {\n if (!this.univerAPI) throw new Error(\"表格尚未就绪:先调 setUniverAPI(univerAPI)\")\n return this.univerAPI\n }\n\n /* ------------------------------ 读 ------------------------------ */\n\n /** 工作簿概览 + 一张表的 CSV 视图与公式清单。要写之前先调它看清现状。 */\n read(args: SheetReadArgs = {}) {\n return readSheet(this.use(), args)\n }\n\n /** 全簿检索(值和公式都搜),返回可回填给写工具的 sheet + ref。 */\n find(args: SheetFindArgs) {\n return findInWorkbook(this.use(), args)\n }\n\n /* ------------------------------ 写 ------------------------------ */\n\n /** 从 start 起写一块二维值。\"=…\" 是公式,null 清空。 */\n setValues(args: SetValuesArgs) {\n return setValues(this.use(), args)\n }\n\n /** 插入 / 删除行列。 */\n editRowsCols(args: EditRowsColsArgs) {\n return editRowsCols(this.use(), args)\n }\n\n /** 新建 / 重命名 / 删除 / 激活工作表。 */\n manageSheets(args: ManageSheetsArgs) {\n return manageSheets(this.use(), args)\n }\n\n /* ------------------------------ 导出 ------------------------------ */\n\n /** 导出 .xlsx(base64 给传输层,模型只看路径 —— 和 doc_export_docx 同一约定)。 */\n exportXlsx(args: { filename?: string } = {}) {\n return exportXlsxBase64(this.use(), args)\n }\n\n /* ---------------------------- 统一入口 ---------------------------- */\n\n /**\n * 工具名 → 方法。给传输层(MCP 桥、agent executor)用的单一分发口,\n * 和 `DocRuntime.call` 同构 —— 桥不需要知道自己面对的是文档还是表格。\n */\n async call(tool: string, args: Record<string, unknown> = {}): Promise<unknown> {\n switch (tool) {\n case \"sheet_read\":\n return this.read(args as SheetReadArgs)\n case \"sheet_find\":\n return this.find(args as unknown as SheetFindArgs)\n case \"sheet_set_values\":\n return this.setValues(args as unknown as SetValuesArgs)\n case \"sheet_edit_rows_cols\":\n return this.editRowsCols(args as unknown as EditRowsColsArgs)\n case \"sheet_manage_sheets\":\n return this.manageSheets(args as unknown as ManageSheetsArgs)\n case \"sheet_export_xlsx\":\n return this.exportXlsx(args as { filename?: string })\n default:\n throw new Error(`未知工具 ${tool}`)\n }\n }\n}\n"]}
package/dist/sheet.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { D as DocumentViewProps } from './registry-CYKivRDh.js';
2
- export { S as SheetOptions, c as SheetUiOptions } from './registry-CYKivRDh.js';
1
+ import { D as DocumentViewProps } from './registry-BQ5T1Yko.js';
2
+ export { S as SheetOptions, c as SheetUiOptions } from './registry-BQ5T1Yko.js';
3
3
  import * as react from 'react';
4
4
  import './code-types-Dqmit3xx.js';
5
5
  import 'shiki';
@@ -17,7 +17,8 @@ import 'shiki';
17
17
  * 条件格式等独立部件)通过 `onWarnings` 如实报告。
18
18
  *
19
19
  * 配置见 `SheetOptions`:UI 开关直接透传给 preset(Univer 的 class 是
20
- * `univer-` 前缀的原子类,没有稳定选择器,CSS 硬藏靠不住),额外能力靠追加 preset。
20
+ * `univer-` 前缀的原子类,没有稳定选择器,CSS 硬藏靠不住)。
21
+ * 筛选、排序、数据校验、条件格式、超链接、批注、评论、表格和浮动图片随引擎一起加载。
21
22
  */
22
23
  declare function SheetView({ source, content, readOnly, className, sheet, onReady, onError, onWarnings, }: DocumentViewProps): react.JSX.Element;
23
24
 
package/dist/sheet.js CHANGED
@@ -1,3 +1,3 @@
1
- export { SheetView } from './chunk-SYCK6Y5F.js';
1
+ export { SheetView } from './chunk-JWHQF2CZ.js';
2
2
  //# sourceMappingURL=sheet.js.map
3
3
  //# sourceMappingURL=sheet.js.map