@4399ywkf/editor 0.8.1 → 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.
- package/README.md +45 -27
- package/dist/SheetView-YFK7BUS5.js +3 -0
- package/dist/{SheetView-SDBRSTVS.js.map → SheetView-YFK7BUS5.js.map} +1 -1
- package/dist/{chunk-KRP5V7VF.js → chunk-2DI4FJPC.js} +10 -3
- package/dist/chunk-2DI4FJPC.js.map +1 -0
- package/dist/{chunk-DGUNVCOM.js → chunk-3QTRZBIK.js} +111 -26
- package/dist/chunk-3QTRZBIK.js.map +1 -0
- package/dist/chunk-JWHQF2CZ.js +257 -0
- package/dist/chunk-JWHQF2CZ.js.map +1 -0
- package/dist/{chunk-WF7PIIFR.js → chunk-JZ67Q3QI.js} +4 -4
- package/dist/chunk-JZ67Q3QI.js.map +1 -0
- package/dist/{chunk-SBTKDJAL.js → chunk-SDVGDHC4.js} +45 -3
- package/dist/chunk-SDVGDHC4.js.map +1 -0
- package/dist/{chunk-HPSPOM2O.js → chunk-XB6FEC4I.js} +3 -3
- package/dist/chunk-XB6FEC4I.js.map +1 -0
- package/dist/{csv-parse-D0zTBvDB.d.ts → csv-parse-DXlwzoZ6.d.ts} +28 -1
- package/dist/csv.d.ts +2 -2
- package/dist/csv.js +4 -4
- package/dist/import-O7RUERND.js +6 -0
- package/dist/{import-GVZDLWA2.js.map → import-O7RUERND.js.map} +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -1
- package/dist/pdf.d.ts +1 -1
- package/dist/pptx.d.ts +1 -1
- package/dist/{registry-CYKivRDh.d.ts → registry-BQ5T1Yko.d.ts} +9 -16
- package/dist/sheet-runtime.d.ts +10 -8
- package/dist/sheet-runtime.js +6 -14
- package/dist/sheet-runtime.js.map +1 -1
- package/dist/sheet.d.ts +4 -3
- package/dist/sheet.js +1 -1
- package/dist/xlsx.d.ts +12 -11
- package/dist/xlsx.js +121 -32
- package/dist/xlsx.js.map +1 -1
- package/package.json +46 -2
- package/dist/SheetView-SDBRSTVS.js +0 -3
- package/dist/chunk-DGUNVCOM.js.map +0 -1
- package/dist/chunk-HPSPOM2O.js.map +0 -1
- package/dist/chunk-KRP5V7VF.js.map +0 -1
- package/dist/chunk-SBTKDJAL.js.map +0 -1
- package/dist/chunk-SYCK6Y5F.js +0 -89
- package/dist/chunk-SYCK6Y5F.js.map +0 -1
- package/dist/chunk-WF7PIIFR.js.map +0 -1
- package/dist/import-GVZDLWA2.js +0 -6
package/dist/pptx.d.ts
CHANGED
|
@@ -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
|
-
/** 底部状态栏的求和 /
|
|
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
|
-
*
|
|
48
|
-
*
|
|
47
|
+
* 引擎来自 `@univerjs/preset-sheets-find-replace`,动态 import,只在开了的时候才下载。
|
|
48
|
+
* 但不开也得装:宿主的打包器在构建期就会解析这条 import,解析不到直接构建失败。
|
|
49
|
+
* 样式随功能一起加载。
|
|
49
50
|
*/
|
|
50
51
|
findReplace?: boolean;
|
|
51
52
|
/**
|
|
52
|
-
*
|
|
53
|
+
* 追加内置之外的 Univer preset。
|
|
53
54
|
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
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 直接红。
|
package/dist/sheet-runtime.d.ts
CHANGED
|
@@ -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): {
|
package/dist/sheet-runtime.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { parseRange, cellRef, parseCellRef } from './chunk-
|
|
2
|
-
import { escapeCsvField, activeSheetId } from './chunk-
|
|
3
|
-
import { snapshotFromUniver } from './chunk-
|
|
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
|
|
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-
|
|
2
|
-
export { S as SheetOptions, c as SheetUiOptions } from './registry-
|
|
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
|
|
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
package/dist/xlsx.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { W as WorkbookData, a as CsvParseOptions } from './csv-parse-
|
|
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-
|
|
1
|
+
import { W as WorkbookData, a as CsvParseOptions } from './csv-parse-DXlwzoZ6.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-DXlwzoZ6.js';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* Univer 快照 → xlsx 的各个 XML 部件。
|
|
@@ -7,9 +7,10 @@ export { C as CellData, e as CellRange, f as CellValue, g as ColumnData, b as Cs
|
|
|
7
7
|
* 纯函数、无 DOM、无引擎依赖:Node 里拿一份 JSON 就能出文件,
|
|
8
8
|
* 不需要把 871KB 的 Univer 渲染引擎拉起来。
|
|
9
9
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
10
|
+
* **能保住的**:多工作表、值与类型、公式(含共享公式、数组公式、动态数组与缓存值)、
|
|
11
|
+
* 1904 日期系统、数字格式、字体/颜色/填充/边框/对齐/换行/旋转/缩小字体填充、会计用下划线、
|
|
12
|
+
* 合并单元格、行高列宽、隐藏行列、冻结窗格、网格线开关、标签颜色、工作表隐藏与深度隐藏、
|
|
13
|
+
* 工作表背景图(data URL 形式的)。
|
|
13
14
|
*
|
|
14
15
|
* **保不住的**:图片、图表、透视表、条件格式、数据校验、筛选、批注、超链接。
|
|
15
16
|
* 它们不在 `cellData` 里,而是各插件自己序列化进 `resources` 的私有结构 ——
|
|
@@ -113,12 +114,13 @@ declare function importSheetSource(source: string | Blob | File, options?: Impor
|
|
|
113
114
|
* (fflate + 原生 DOMParser)和 Node(任意 zip 库 + @xmldom/xmldom)
|
|
114
115
|
* 共用这一份实现,不存在两份真相 —— 和 `docx/parse.ts` 同一套约定。
|
|
115
116
|
*
|
|
116
|
-
*
|
|
117
|
-
*
|
|
118
|
-
*
|
|
117
|
+
* **能保住的**:多工作表(含顺序、隐藏与深度隐藏)、值与类型、
|
|
118
|
+
* 公式(普通/共享/数组/动态数组)、1904 日期系统、数字格式、
|
|
119
|
+
* 字体/颜色/填充/边框/对齐/换行/旋转/缩小字体填充、会计用下划线、合并单元格、
|
|
120
|
+
* 行高列宽、隐藏行列、冻结窗格、网格线开关、标签颜色、工作表背景图、quotePrefix(强制文本)。
|
|
119
121
|
*
|
|
120
122
|
* **保不住的**:图片、图表、透视表、条件格式、数据校验、筛选、批注、
|
|
121
|
-
*
|
|
123
|
+
* 超链接、主题色、模拟运算表的定义(只留结果)。它们要么住在独立部件里(drawing / pivot / comments),
|
|
122
124
|
* 要么需要把 Excel 的主题模型抄一遍(theme + tint)。这里不假装支持,
|
|
123
125
|
* 而是逐个探测、**如实报告丢了什么**(见 `warnings`)—— 让宿主能把话
|
|
124
126
|
* 原样告诉用户,而不是打开表格才发现少了东西。
|
|
@@ -149,8 +151,7 @@ declare function parseXlsx(entries: XlsxEntries, options: ParseXlsxOptions): Par
|
|
|
149
151
|
|
|
150
152
|
/**
|
|
151
153
|
* 参数类型是 `unknown` 而不是 `FUniver`:`@univerjs/presets` 是可选 peer,
|
|
152
|
-
* 写成具体类型会让没装它的项目 typecheck
|
|
153
|
-
* 方法名依次试探(`getSnapshot` 是新名字,`save` 是旧的)。
|
|
154
|
+
* 写成具体类型会让没装它的项目 typecheck 直接红。
|
|
154
155
|
*/
|
|
155
156
|
declare function snapshotFromUniver(univerAPI: unknown): WorkbookData;
|
|
156
157
|
|