@vdhewei/xlsx-template-lib 1.2.3 → 1.2.4

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core.ts","../src/helper.ts","../src/extends.ts"],"sourcesContent":["import * as path from 'path';\nimport * as fs from 'fs';\nimport * as etree from 'elementtree';\nimport {Element} from 'elementtree';\nimport JsZip from \"jszip\";\nimport * as console from \"node:console\";\nimport {imageSize as sizeOf} from 'image-size';\nimport {isMap} from \"node:util/types\";\n\n// ==================== 常量定义 ====================\nconst DOCUMENT_RELATIONSHIP = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\";\nconst CALC_CHAIN_RELATIONSHIP = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/calcChain\";\nconst SHARED_STRINGS_RELATIONSHIP = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings\";\nconst HYPERLINK_RELATIONSHIP = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink\";\n\n// ==================== 类型定义 ====================\n/** 占位符信息 */\ninterface Placeholder {\n /** 完整占位符字符串,如 ${name} 或 ${table:items.key} */\n placeholder: string;\n /** 类型:normal, table, image, imageincell,fn 或自定义类型 */\n type: string;\n /** 变量名 */\n name: string;\n /** 对象属性键(table 类型时使用) */\n key?: string;\n /** 子类型(如 image) */\n subType?: string;\n /** 是否是字符串的全部内容 */\n full: boolean;\n\n /** 自定义属性,用于扩展 */\n [customKey: string]: any;\n}\n\n/** 单元格引用 */\ninterface Ref {\n table?: string | null;\n colAbsolute?: boolean;\n col: string;\n rowAbsolute?: boolean;\n row: number;\n}\n\n/** 范围 */\ninterface Range {\n start: string;\n end: string;\n}\n\n/** 工作表信息 */\ninterface SheetInfo {\n id: number;\n name: string;\n filename: string;\n root?: etree.Element;\n}\n\ninterface SheetInfoMust {\n id: number;\n name: string;\n filename: string;\n root: etree.Element;\n}\n\n/** 绘图信息 */\ninterface DrawingInfo {\n filename: string;\n root: any;\n relFilename?: string;\n relRoot?: any;\n}\n\n/** 表格信息 */\ninterface TableInfo {\n filename: string;\n root: any;\n}\n\n/** 关系文件信息 */\ninterface RelsInfo {\n filename: string;\n root: any;\n}\n\n/** 基础工作簿选项 */\ninterface WorkbookOptions {\n moveImages?: boolean;\n substituteAllTableRow?: boolean;\n moveSameLineImages?: boolean;\n imageRatio?: number;\n pushDownPageBreakOnTableSubstitution?: boolean;\n imageRootPath?: string | null;\n handleImageError?: ((imageObj: any, error: Error) => void) | null;\n}\n\n/** 生成选项 */\ntype OutputByType = {\n readonly base64: string;\n readonly string: string;\n readonly text: string;\n readonly binarystring: string;\n readonly array: readonly number[];\n readonly uint8array: Uint8Array;\n readonly arraybuffer: ArrayBuffer;\n readonly blob: Blob;\n readonly nodebuffer: Buffer;\n};\n\n// ==================== 扩展类型定义 ====================\n/**\n * 自定义替换函数类型\n * @param cell - XML 单元格元素\n * @param stringValue - 当前字符串值\n * @param placeholder - 解析出的占位符信息\n * @param substitution - 替换值\n * @returns 返回替换后的字符串,或 undefined/null 表示不处理(交给下一个替换器)\n */\ntype CustomReplacer = (\n cell: any,\n stringValue: string,\n placeholder: Placeholder,\n substitution: any\n) => string | undefined | null;\n/**\n * 自定义占位符提取函数类型\n * @param inputString - 输入字符串\n * @returns 解析出的占位符数组\n */\ntype CustomPlaceholderExtractor = (\n inputString: string,\n options: ExtensionOptions,\n) => Placeholder[];\n\n// 输出Buffer 类型\nenum BufferType {\n Base64 = \"base64\",\n String = \"string\",\n Text = \"text\",\n Blob = \"blob\",\n Array = \"array\",\n NodeBuffer = \"nodebuffer\",\n Uint8array = \"uint8array\",\n Arraybuffer = \"arraybuffer\",\n BinaryString = \"binarystring\",\n}\n\n/**\n * 替换前钩子函数类型\n * @param stringValue - 原始字符串\n * @param substitutions - 替换数据对象\n * @returns 返回修改后的字符串或 undefined(不修改)\n */\ntype BeforeReplaceHook = (\n stringValue: string,\n substitutions: Record<string, any>\n) => string | undefined | null;\n\n/**\n * 替换后钩子函数类型\n * @param resultString - 替换后的字符串\n * @param stringValue - 原始字符串\n * @param substitutions - 替换数据对象\n * @returns 返回最终字符串\n */\ntype AfterReplaceHook = (\n resultString: string,\n stringValue: string,\n substitutions: Record<string, any>\n) => string;\n\n/**\n * 自定义值格式化函数类型\n * @param value - 原始值\n * @param placeholder - 占位符信息\n * @param key - 可选的键名\n * @returns 格式化后的字符串\n */\ntype CustomFormatter = (\n value: any,\n placeholder: Placeholder,\n key?: string\n) => string | undefined | null;\n\n/**\n * 自定义数据查询函数类型\n * @param obj - 数据对象\n * @param p - 占位符\n * @returns 返回对应键key值或者undefined\n */\ntype QueryFunction = (\n obj: Object | Record<string, any>,\n p: Placeholder,\n) => any | undefined;\n\n/** 扩展配置接口 */\ninterface ExtensionOptions {\n /**\n * 自定义替换函数,在默认替换逻辑之前调用\n * 返回非空值则使用返回值,否则走默认逻辑\n */\n customReplacer?: CustomReplacer;\n /**\n * 自定义占位符提取函数\n * 如果提供,将完全替代默认的 extractPlaceholders\n */\n customPlaceholderExtractor?: CustomPlaceholderExtractor;\n /**\n * 额外的替换函数列表,按顺序尝试\n * 每个函数返回非空值则停止后续处理\n */\n replacers?: CustomReplacer[];\n /**\n * 替换前钩子,在所有替换开始前调用\n */\n beforeReplace?: BeforeReplaceHook;\n /**\n * 替换后钩子,在所有替换完成后调用\n */\n afterReplace?: AfterReplaceHook;\n /**\n * 自定义值格式化函数列表\n * 按顺序尝试,返回非空值则使用\n */\n formatters?: CustomFormatter[];\n /**\n * 自定义模板正则表达式\n * 用于替代默认的占位符匹配模式\n */\n customPlaceholderRegex?: RegExp;\n /**\n * 是否启用默认占位符解析(当使用 customPlaceholderRegex 时)\n * 默认为 true\n */\n enableDefaultParsing?: boolean;\n\n /**\n * 设置自定义数据查询处理器\n * 默认为 undefined\n */\n customQueryFunction?: QueryFunction;\n}\n\n/** 完整选项类型 */\ntype FullOptions = WorkbookOptions & ExtensionOptions;\n\n// ==================== 辅助函数 ====================\n/*function _get_simple(obj: any, keys: string): any {\n if (keys.indexOf(\"[\") >= 0) {\n const specification = keys.split(/[[[\\]]/);\n const property = specification[0];\n const index = specification[1];\n return obj[property][index];\n }\n return obj[keys];\n}*/\n\n/*function valueDotGet<T extends OutputValue = OutputValue>(obj: any|object|Record<string, any>, keys: string, defaultValue?: ValuerType[T]): ValuerType[T] {\n const arr = keys.split('.');\n try {\n while (arr.length) {\n obj = _get_simple(obj, arr.shift()!);\n }\n } catch (ex) {\n obj = undefined;\n }\n return obj === undefined ? defaultValue : obj;\n}*/\n\nfunction _getSimple(obj: any|object|Record<string, any>|Record<string, string>, key: string): any {\n if (key.includes(\"[\")) {\n // 修正正则:匹配 [ 和 ] 并进行拆分\n // 例如:'list[0]' -> ['list', '0', '']\n const parts = key.split(/[\\[\\]]/);\n const property = parts[0];\n const index = parts[1];\n if (property && index !== undefined) {\n return obj?.[property]?.[index];\n }\n }\n if(isMap(obj)){\n return obj.get(key)\n }\n return obj?.[key];\n}\n\ntype PathImpl<T, Key extends string> =\n T extends object\n ? Key extends `${infer K}.${infer Rest}`\n ? K extends keyof T\n ? PathImpl<T[K], Rest>\n : never\n : Key extends keyof T\n ? T[Key]\n : never\n : any;\n\ntype PathType<T, Key extends string> = string extends Key ? any : PathImpl<T, Key>;\n\n/**\n * 基于路径从对象中获取值\n * 模拟 lodash 的 get 方法\n */\nfunction valueDotGet<T extends Record<string, any> & object, P extends string>(\n obj: T,\n path: P,\n defaultValue?: PathType<T, P>\n): PathType<T, P> {\n if (!path || !obj) return defaultValue as PathType<T, P>;\n const keys = path.split('.');\n let current: any = obj;\n for (const key of keys) {\n if (current === null || current === undefined) return defaultValue as PathType<T, P>;\n current = _getSimple(current, key);\n }\n return current === undefined ? defaultValue as PathType<T, P> : current;\n}\n\n/**\n * 基于路径从对象中获取值,默认方法\n * 模拟 lodash 的 get 方法\n */\nfunction defaultValueDotGet<T extends Record<string, any> & object>(obj: T, p: Placeholder): PathType<T, string> {\n return valueDotGet(obj, p.name, p.default || '');\n}\n\n// ==================== 内置格式化器 ====================\n/** 日期格式化器 */\nconst dateFormatter: CustomFormatter = (value: any, _placeholder: Placeholder, _key?: string): string | undefined => {\n if (value instanceof Date) {\n // Excel 中日期是从 1900/01/01 开始的天数\n return Number((value.getTime() / (1000 * 60 * 60 * 24)) + 25569).toString();\n }\n return undefined;\n};\n\n/** 数字格式化器 */\nconst numberFormatter: CustomFormatter = (value: any, _placeholder: Placeholder, _key?: string): string | undefined => {\n if (typeof value === \"number\") {\n return value.toString();\n }\n return undefined;\n};\n\n/** 布尔格式化器 */\nconst booleanFormatter: CustomFormatter = (value: any, _placeholder: Placeholder, _key?: string): string | undefined => {\n if (typeof value === \"boolean\") {\n return Number(value).toString();\n }\n return undefined;\n};\n\n/** 字符串格式化器(默认) */\nconst stringFormatter: CustomFormatter = (value: any, _placeholder: Placeholder, _key?: string): string | undefined => {\n if (typeof value === \"string\") {\n return value.toString();\n }\n return undefined;\n};\n\nconst defaultRe = /\\${(?:([^{}:]+?):)?([^{}:]+?)(?:\\.([^{}:]+?))?(?::([^{}:]+?))??}/g;\n\n/**默认占位符提取器**/\nconst defaultExtractPlaceholders: CustomPlaceholderExtractor = (inputString: string, options: ExtensionOptions): Placeholder[] => {\n const matches: Placeholder[] = [];\n // 默认正则表达式\n // 使用自定义正则表达式(如果提供)\n const re = options.customPlaceholderRegex || defaultRe;\n // 如果启用了默认解析且使用了自定义正则,先执行默认解析\n if (options.enableDefaultParsing && options.customPlaceholderRegex) {\n let match: RegExpExecArray | null;\n while ((match = defaultRe.exec(inputString)) !== null) {\n matches.push({\n placeholder: match[0],\n type: match[1] || 'normal',\n name: match[2],\n key: match[3],\n subType: match[4],\n full: match[0].length === inputString.length\n });\n }\n }\n // 执行当前正则匹配\n let match: RegExpExecArray | null;\n // 重置 lastIndex(如果正则不是全局的)\n re.lastIndex = 0;\n while ((match = re.exec(inputString)) !== null) {\n // 如果已经启用了默认解析,检查是否重复\n if (options.enableDefaultParsing && options.customPlaceholderRegex) {\n const isDuplicate = matches.some(m => m.placeholder === match![0]);\n if (isDuplicate) continue;\n }\n matches.push({\n placeholder: match[0],\n type: match[1] || 'normal',\n name: match[2],\n key: match[3],\n subType: match[4],\n full: match[0].length === inputString.length\n });\n }\n return matches;\n}\n\n/** 默认格式化器列表 */\nconst defaultFormatters: CustomFormatter[] = [\n dateFormatter,\n numberFormatter,\n booleanFormatter,\n stringFormatter\n];\n\nconst pattern = new RegExp('^(https?:\\\\/\\\\/)?' +\n '((([a-z\\\\d]([a-z\\\\d-]*[a-z\\\\d])*)\\\\.)+[a-z]{2,}|' +\n '((\\\\d{1,3}\\\\.){3}\\\\d{1,3}))' +\n '(\\\\:\\\\d+)?(\\\\/[-a-z\\\\d%_.~+]*)*' +\n '(\\\\?[;&a-z\\\\d%_.~+=-]*)?' +\n '(\\\\#[-a-z\\\\d_]*)?$', 'i');\n\nconst isUrl = function (str: string): boolean {\n return !!pattern.test(str);\n}\n\nconst toArrayBuffer = function (buffer: Buffer): ArrayBuffer {\n const ab = new ArrayBuffer(buffer.length);\n const view = new Uint8Array(ab);\n for (let i = 0; i < buffer.length; ++i) {\n view[i] = buffer[i];\n }\n return ab;\n}\n\n// ==================== Workbook 类 ====================\nclass Workbook {\n // ==================== 属性定义 ====================\n option: FullOptions;\n archive: JsZip;\n sharedStrings: string[] = [];\n sharedStringsLookup: Record<string, number> = {};\n sharedStringsPath: string = \"\";\n sheets: SheetInfo[] | SheetInfoMust[] = [];\n sheet: SheetInfo | SheetInfoMust | null = null;\n workbook: Element | null = null;\n workbookPath: string | null = null;\n contentTypes: any = null;\n prefix: string | null = null;\n workbookRels: Element | null = null;\n calChainRel: any = null;\n calcChainPath: string = \"\";\n\n // RichData 相关属性\n private richDataIsInit: boolean = false;\n private _relsrichValueRel: any = null;\n private rdrichvalue: any = null;\n private rdrichvaluestructure: any = null;\n private rdRichValueTypes: any = null;\n private richValueRel: any = null;\n private metadata: any = null;\n\n // ==================== 构造函数 ====================\n constructor(option?: FullOptions) {\n this.option = {\n moveImages: false,\n substituteAllTableRow: false,\n moveSameLineImages: false,\n imageRatio: 100,\n pushDownPageBreakOnTableSubstitution: false,\n imageRootPath: null,\n handleImageError: null,\n ...option\n };\n }\n\n // ==================== parse 构造函数 ====================\n static async parse(data: Buffer | string, option?: FullOptions): Promise<Workbook> {\n const w = new Workbook(option);\n await w.loadTemplate(data);\n return w;\n }\n\n // ==================== 扩展方法 ====================\n /**\n * 添加自定义替换器\n * @param replacer - 替换函数\n * @returns this(支持链式调用)\n */\n addReplacer(replacer: CustomReplacer): this {\n if (!this.option.replacers) {\n this.option.replacers = [];\n }\n this.option.replacers.push(replacer);\n return this;\n }\n\n /**\n * 添加自定义格式化器\n * @param formatter - 格式化函数\n * @returns this(支持链式调用)\n */\n addFormatter(formatter: CustomFormatter): this {\n if (!this.option.formatters) {\n this.option.formatters = [];\n }\n this.option.formatters.push(formatter);\n return this;\n }\n\n /**\n * 设置替换前钩子\n * @param hook - 钩子函数\n * @returns this(支持链式调用)\n */\n setBeforeReplaceHook(hook: BeforeReplaceHook): this {\n this.option.beforeReplace = hook;\n return this;\n }\n\n /**\n * 设置替换后钩子\n * @param hook - 钩子函数\n * @returns this(支持链式调用)\n */\n setAfterReplaceHook(hook: AfterReplaceHook): this {\n this.option.afterReplace = hook;\n return this;\n }\n\n /**\n * 设置自定义占位符提取器\n * @param extractor - 提取函数\n * @returns this(支持链式调用)\n */\n setPlaceholderExtractor(extractor: CustomPlaceholderExtractor): this {\n this.option.customPlaceholderExtractor = extractor;\n return this;\n }\n\n /**\n * 设置自定义模板正则表达式\n * @param regex - 正则表达式\n * @param enableDefaultParsing - 是否同时启用默认解析,默认 false\n * @returns this(支持链式调用)\n */\n setPlaceholderRegex(regex: RegExp, enableDefaultParsing: boolean = false): this {\n this.option.customPlaceholderRegex = regex;\n this.option.enableDefaultParsing = enableDefaultParsing;\n return this;\n }\n\n /**\n * 设置数值查询器\n * @param h QueryFunction - 设置数值查询器\n * @returns this(支持链式调用)\n */\n setQueryFunctionHandler(h: QueryFunction): this {\n this.option.customQueryFunction = h\n return this;\n }\n\n // ==================== 扩展点执行方法 ====================\n /**\n * 执行自定义替换器链\n * @param cell - 单元格元素\n * @param stringValue - 字符串值\n * @param placeholder - 占位符信息\n * @param substitution - 替换值\n * @returns 替换结果或 undefined\n */\n private executeReplacers(\n cell: any,\n stringValue: string,\n placeholder: Placeholder,\n substitution: any\n ): string | undefined {\n // 首先执行 customReplacer(向后兼容)\n if (this.option.customReplacer) {\n const result = this.option.customReplacer(cell, stringValue, placeholder, substitution);\n if (result !== undefined && result !== null) {\n return result;\n }\n }\n // 执行 replacers 列表\n if (this.option.replacers && this.option.replacers.length > 0) {\n for (const replacer of this.option.replacers) {\n const result = replacer(cell, stringValue, placeholder, substitution);\n if (result !== undefined && result !== null) {\n return result;\n }\n }\n }\n return undefined;\n }\n\n /**\n * 执行格式化器链\n * @param value - 原始值\n * @param placeholder - 占位符信息\n * @param key - 可选键名\n * @returns 格式化后的字符串\n */\n private executeFormatters(value: any, placeholder: Placeholder, key?: string): string {\n // 自定义格式化器\n if (this.option.formatters && this.option.formatters.length > 0) {\n for (const formatter of this.option.formatters) {\n const result = formatter(value, placeholder, key);\n if (result !== undefined && result !== null) {\n return result;\n }\n }\n }\n // 默认格式化器\n for (const formatter of defaultFormatters) {\n const result = formatter(value, placeholder, key);\n if (result !== undefined && result !== null) {\n return result;\n }\n }\n return \"\";\n }\n\n /**\n * 执行替换前钩子\n */\n private executeBeforeReplaceHook(\n stringValue: string,\n substitutions: Record<string, any>\n ): string {\n if (this.option.beforeReplace) {\n const result = this.option.beforeReplace(stringValue, substitutions);\n if (result !== undefined && result !== null) {\n return result;\n }\n }\n return stringValue;\n }\n\n /**\n * 执行替换后钩子\n */\n private executeAfterReplaceHook(\n resultString: string,\n stringValue: string,\n substitutions: Record<string, any>\n ): string {\n if (this.option.afterReplace) {\n return this.option.afterReplace(resultString, stringValue, substitutions);\n }\n return resultString;\n }\n\n // ==================== 核心方法 ====================\n /**\n * 删除工作表\n */\n async deleteSheet(sheetName: string | number): Promise<this> {\n const sheet = await this.loadSheet(sheetName);\n const sh = this.workbook.find(`sheets/sheet[@sheetId='${sheet.id}']`);\n const sheets = this.workbook.findall(\"sheets/sheet\");\n const sheetIndex = sheets.indexOf(sh);\n // 移除关联的 definedNames\n const definedNamesParent = this.workbook.find(\"definedNames\");\n if (definedNamesParent) {\n const toRemove: any[] = [];\n this.workbook.findall(\"definedNames/definedName\").forEach((def: any) => {\n if (def.attrib.localSheetId !== undefined) {\n const localId = parseInt(def.attrib.localSheetId);\n if (localId === sheetIndex) {\n toRemove.push(def);\n } else if (localId > sheetIndex) {\n def.attrib.localSheetId = (localId - 1).toString();\n }\n }\n });\n toRemove.forEach((def: any) => {\n definedNamesParent.remove(def);\n });\n }\n this.workbook.find(\"sheets\").remove(sh);\n const rel = this.workbookRels.find(`Relationship[@Id='${sh.attrib['r:id']}']`);\n this.workbookRels.remove(rel);\n this._rebuild();\n return this;\n }\n\n /**\n * 复制工作表\n */\n async copySheet(sheetName: string | number, copyName?: string, binary: boolean = true): Promise<this> {\n // 警告用户 binary 模式已禁用\n if (binary === false && !process.env.JEST_WORKER_ID) {\n console.warn('Warning: copySheet() called with binary=false. UTF-8 characters may be corrupted.');\n }\n const sheet = await this.loadSheet(sheetName);\n const newSheetIndex = (this.workbook.findall(\"sheets/sheet\").length + 1).toString();\n const fileName = 'worksheets/sheet' + newSheetIndex + '.xml';\n const arcName = this.prefix + '/' + fileName;\n // 以二进制模式复制工作表文件以保留 UTF-8 编码\n const sourceSheetFile = this.archive.file(sheet.filename);\n let sheetContent = await sourceSheetFile.async(`nodebuffer`);\n this.archive.file(arcName, sheetContent);\n this.archive.files[arcName].options.compression = binary ? \"STORE\" : \"DEFLATE\";\n\n // 为新工作表添加内容类型\n const sheetContentType = etree.SubElement(this.contentTypes, 'Override');\n sheetContentType.attrib.PartName = '/' + arcName;\n sheetContentType.attrib.ContentType = 'application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml';\n // 在工作簿中复制工作表名称\n const newSheet = etree.SubElement(this.workbook.find('sheets'), 'sheet');\n const finalSheetName = copyName || 'Sheet' + newSheetIndex;\n newSheet.attrib.name = finalSheetName;\n newSheet.attrib.sheetId = newSheetIndex;\n newSheet.attrib['r:id'] = 'rId' + newSheetIndex;\n // 复制 definedName(如果有)\n this.workbook.findall('definedNames/definedName').forEach((element: any) => {\n if (element.text && element.text.split(\"!\").length && element.text.split(\"!\")[0] == sheetName) {\n const newDefinedName = etree.SubElement(this.workbook.find('definedNames'), 'definedName', element.attrib);\n newDefinedName.text = finalSheetName + \"!\" + element.text.split(\"!\")[1];\n const index = Number.parseInt(newSheetIndex, 10) - 1;\n newDefinedName.attrib.localSheetId = `${index}`;\n }\n });\n const newRel = etree.SubElement(this.workbookRels, 'Relationship');\n newRel.attrib.Type = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet';\n newRel.attrib.Target = fileName;\n // 复制工作表关系及其目标文件\n const sourceRels = await this.loadSheetRels(sheet.filename);\n const relFileName = 'worksheets/_rels/sheet' + newSheetIndex + '.xml.rels';\n const relArcName = this.prefix + '/' + relFileName;\n const newRelsRoot = this.cloneElement(sourceRels.root, true);\n // 为注释生成新的 UUID\n const newCommentUuid = this.generateUUID();\n // 处理每个关系以使用唯一名称复制目标文件\n sourceRels.root.findall('Relationship').forEach((rel: any, index: number) => {\n const relType = rel.attrib.Type;\n const target = rel.attrib.Target;\n const needsFileCopy = [\n 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments',\n 'http://schemas.microsoft.com/office/2017/10/relationships/threadedComment',\n 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing'\n ];\n if (needsFileCopy.indexOf(relType) !== -1) {\n const sheetDirectory = path.dirname(sheet.filename);\n const sourceFilePath = path.join(sheetDirectory, target).replace(/\\\\/g, '/');\n const sourceFile = this.archive.file(sourceFilePath);\n if (sourceFile) {\n const fileExtension = path.extname(target);\n const fileBaseName = path.basename(target, fileExtension);\n const fileDir = path.dirname(target);\n const baseNameWithoutNumber = fileBaseName.replace(/\\d+$/, '');\n const newFileName = baseNameWithoutNumber + newSheetIndex + fileExtension;\n const newTarget = path.join(fileDir, newFileName).replace(/\\\\/g, '/');\n const newFilePath = path.join(sheetDirectory, newTarget).replace(/\\\\/g, '/');\n const content = sourceFile.async(`string`);\n content.then((binaryContent) => {\n // 应用特定于文件的转换\n if (relType === 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing') {\n binaryContent = binaryContent.replace(/data=\"\\d+\"/, 'data=\"' + newSheetIndex + '\"');\n } else if (relType === 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments') {\n const uuidWithoutBraces = newCommentUuid.replace(/[{}]/g, '');\n binaryContent = binaryContent.replace(/(<author>tc=\\{)[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}(\\}<\\/author>)/gi, '$1' + uuidWithoutBraces + '$2');\n binaryContent = binaryContent.replace(/(xr:uid=\"\\{)[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}(\\}\\\")/gi, '$1' + uuidWithoutBraces + '$2');\n const commentsContentType = etree.SubElement(this.contentTypes, 'Override');\n commentsContentType.attrib.PartName = '/' + newFilePath;\n commentsContentType.attrib.ContentType = 'application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml';\n } else if (relType === 'http://schemas.microsoft.com/office/2017/10/relationships/threadedComment') {\n const uuidWithoutBraces = newCommentUuid.replace(/[{}]/g, '');\n binaryContent = binaryContent.replace(/(\\sid=\"\\{)[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}(\\}\")/gi, '$1' + uuidWithoutBraces + '$2');\n const threadedCommentContentType = etree.SubElement(this.contentTypes, 'Override');\n threadedCommentContentType.attrib.PartName = '/' + newFilePath;\n threadedCommentContentType.attrib.ContentType = 'application/vnd.ms-excel.threadedcomments+xml';\n }\n this.archive.file(newFilePath, binaryContent);\n this.archive.files[newFilePath].options.compression = binary ? \"STORE\" : \"DEFLATE\";\n const newRelInRels = newRelsRoot.findall('Relationship')[index];\n if (newRelInRels) {\n newRelInRels.attrib.Target = newTarget;\n }\n }).catch(err => {\n console.log(err)\n })\n }\n }\n });\n this.archive.file(relArcName, etree.tostring(newRelsRoot, {encoding: 'utf-8'}));\n this.archive.files[relArcName].options.compression = binary ? \"STORE\" : \"DEFLATE\";\n this.archive.file('[Content_Types].xml', etree.tostring(this.contentTypes, {encoding: 'utf-8'}));\n this._rebuild();\n return this;\n }\n\n /**\n * 部分重建(复制/删除工作表后)\n */\n private _rebuild(): void {\n const order = ['worksheet', 'theme', 'styles', 'sharedStrings'];\n this.workbookRels.findall(\"*\")\n .sort((rel1: any, rel2: any) => {\n const index1 = order.indexOf(path.basename(rel1.attrib.Type));\n const index2 = order.indexOf(path.basename(rel2.attrib.Type));\n if (index1 < 0 && index2 >= 0) return 1;\n if (index1 >= 0 && index2 < 0) return -1;\n if (index1 < 0 && index2 < 0) return 0;\n if ((index1 + index2) === 0) {\n if (rel1.attrib.Id && rel2.attrib.Id) {\n return rel1.attrib.Id.substring(3) - rel2.attrib.Id.substring(3);\n }\n return rel1._id - rel2._id;\n }\n return index1 - index2;\n })\n .forEach((item: any, index: number) => {\n item.attrib.Id = 'rId' + (index + 1);\n });\n this.workbook.findall(\"sheets/sheet\").forEach((item: any, index: number) => {\n item.attrib['r:id'] = 'rId' + (index + 1);\n item.attrib.sheetId = (index + 1).toString();\n });\n this.archive.file(\n this.prefix + '/' + '_rels' + '/' + path.basename(this.workbookPath!) + '.rels',\n etree.tostring(this.workbookRels, {encoding: 'utf-8'})\n );\n this.archive.file(this.workbookPath!, etree.tostring(this.workbook, {encoding: 'utf-8'}));\n this.sheets = this.loadSheets(this.prefix!, this.workbook, this.workbookRels);\n }\n\n /**\n * 从字节数组加载 .xlsx 文件\n */\n async loadTemplate(data: Buffer | string): Promise<void> {\n if (Buffer.isBuffer(data)) {\n data = data.toString('binary');\n }\n this.archive = await JsZip.loadAsync(data, {base64: false, checkCRC32: true});\n // 加载关系\n const text = await this.archive.file(\"_rels/.rels\").async(\"string\");\n const rels = etree.parse(text).getroot();\n const workbookPath = rels.find(`Relationship[@Type='${DOCUMENT_RELATIONSHIP}']`).attrib.Target;\n this.workbookPath = workbookPath;\n this.prefix = path.dirname(workbookPath);\n const workbookText = await this.archive.file(workbookPath).async(`string`);\n this.workbook = etree.parse(workbookText).getroot();\n const refText = await this.archive.file(this.prefix + \"/\" + '_rels' + \"/\" + path.basename(workbookPath) + '.rels').async(`string`);\n this.workbookRels = etree.parse(refText).getroot();\n this.sheets = this.loadSheets(this.prefix, this.workbook, this.workbookRels);\n this.calChainRel = this.workbookRels.find(`Relationship[@Type='${CALC_CHAIN_RELATIONSHIP}']`);\n if (this.calChainRel) {\n this.calcChainPath = this.prefix + \"/\" + this.calChainRel.attrib.Target;\n }\n this.sharedStringsPath = this.prefix + \"/\" + this.workbookRels.find(`Relationship[@Type='${SHARED_STRINGS_RELATIONSHIP}']`).attrib.Target;\n this.sharedStrings = [];\n this.sharedStringsLookup = {};\n const sharedText = await this.archive.file(this.sharedStringsPath).async(`string`);\n etree.parse(sharedText).getroot().findall('si').forEach((si: any) => {\n const t = {text: ''};\n si.findall('t').forEach((tmp: any) => {\n t.text += tmp.text;\n });\n si.findall('r/t').forEach((tmp: any) => {\n t.text += tmp.text;\n });\n this.sharedStrings.push(t.text);\n this.sharedStringsLookup[t.text] = this.sharedStrings.length - 1;\n });\n const contentTypeText = await this.archive.file('[Content_Types].xml').async(`string`);\n this.contentTypes = etree.parse(contentTypeText).getroot();\n const jpgType = this.contentTypes.find('Default[@Extension=\"jpg\"]');\n if (jpgType === null) {\n etree.SubElement(this.contentTypes, 'Default', {'ContentType': 'image/png', 'Extension': 'jpg'});\n }\n }\n\n /**\n * 使用给定的替换数据对所有工作表进行插值\n */\n async substituteAll(substitutions: Record<string, any>): Promise<void> {\n const sheets = this.loadSheets(this.prefix!, this.workbook, this.workbookRels);\n for (let sheet of sheets) {\n await this.substitute(sheet.id, substitutions);\n }\n }\n\n /**\n * 使用给定的替换数据对指定工作表进行插值\n */\n async substitute(sheetName: string | number, substitutions: Record<string, any>): Promise<void> {\n const sheet = await this.loadSheet(sheetName);\n this.sheet = sheet;\n const dimension = sheet.root.find(\"dimension\");\n const sheetData = sheet.root.find(\"sheetData\");\n let currentRow: number | null = null;\n let totalRowsInserted = 0;\n let totalColumnsInserted = 0;\n const namedTables = await this.loadTables(sheet.root, sheet.filename);\n const rows: any[] = [];\n let drawing: DrawingInfo | null = null;\n const rels = await this.loadSheetRels(sheet.filename);\n for (let row of sheetData.findall(\"row\")) {\n currentRow = this.getCurrentRow(row, totalRowsInserted);\n row.attrib.r = `${currentRow}`\n rows.push(row);\n let cells: any[] = [];\n let cellsInserted = 0;\n const newTableRows: any[] = [];\n const cellsSubstituteTable: any[] = [];\n for (let cell of row.findall(\"c\")) {\n let appendCell = true;\n cell.attrib.r = this.getCurrentCell(cell, currentRow!, cellsInserted);\n // 如果是字符串列,查找共享字符串\n if (cell.attrib.t === \"s\") {\n const cellValue = cell.find(\"v\");\n const stringIndex = parseInt(cellValue.text.toString(), 10);\n let strValue = this.sharedStrings[stringIndex];\n if (strValue === undefined) {\n break;\n }\n // 执行替换前钩子\n strValue = this.executeBeforeReplaceHook(strValue, substitutions);\n // 遍历占位符\n for (let placeholder of this.extractPlaceholders(strValue)) {\n let newCellsInserted = 0;\n let substitution = this.valueGet(substitutions, placeholder);\n // 尝试执行自定义替换器\n const customResult = this.executeReplacers(cell, strValue, placeholder, substitution);\n if (customResult !== undefined) {\n strValue = customResult;\n return;\n }\n if (placeholder.full && placeholder.type === \"table\" && substitution instanceof Array) {\n if (placeholder.subType === 'image' && drawing == null) {\n if (rels) {\n drawing = await this.loadDrawing(sheet.root, sheet.filename, rels.root);\n } else {\n console.log(\"Need to implement initRels. Or init this with Excel\");\n }\n }\n cellsSubstituteTable.push(cell);\n newCellsInserted = await this.substituteTable(\n row, newTableRows, cells, cell, namedTables,\n substitution, placeholder, drawing\n );\n if (newCellsInserted !== 0 || substitution.length) {\n if (substitution.length === 1) {\n appendCell = true;\n }\n if (substitution[0][placeholder.key] instanceof Array) {\n appendCell = false;\n }\n }\n if (newCellsInserted !== 0) {\n cellsInserted += newCellsInserted;\n this.pushRight(this.workbook, sheet.root, cell.attrib.r, newCellsInserted);\n }\n }\n if (placeholder.full && placeholder.type === \"normal\" && substitution instanceof Array) {\n appendCell = false;\n newCellsInserted = this.substituteArray(cells, cell, substitution);\n if (newCellsInserted !== 0) {\n cellsInserted += newCellsInserted;\n this.pushRight(this.workbook, sheet.root, cell.attrib.r, newCellsInserted);\n }\n }\n if (placeholder.type === \"image\" && placeholder.full) {\n if (rels != null) {\n if (drawing == null) {\n drawing = await this.loadDrawing(sheet.root, sheet.filename, rels.root);\n }\n this.substituteImage(cell, strValue, placeholder, substitution, drawing);\n } else {\n console.log(\"Need to implement initRels. Or init this with Excel\");\n }\n }\n if (placeholder.type === \"imageincell\" && placeholder.full) {\n await this.substituteImageInCell(cell, substitution);\n } else {\n if (placeholder.key) {\n substitution = this.valueGet(substitutions, placeholder, true);\n }\n strValue = this.substituteScalar(cell, strValue, placeholder, substitution);\n }\n }\n // 执行替换后钩子\n strValue = this.executeAfterReplaceHook(strValue, strValue, substitutions);\n }\n if (appendCell) {\n cells.push(cell);\n }\n }\n // 重建行的子节点\n this.replaceChildren(row, cells);\n // 更新行跨度属性\n if (cellsInserted !== 0) {\n this.updateRowSpan(row, cellsInserted);\n if (cellsInserted > totalColumnsInserted) {\n totalColumnsInserted = cellsInserted;\n }\n }\n // 添加新插入的行\n if (newTableRows.length > 0) {\n if (this.option[\"moveImages\"] && rels) {\n if (drawing == null) {\n drawing = await this.loadDrawing(sheet.root, sheet.filename, rels.root);\n }\n if (drawing != null) {\n this.moveAllImages(drawing, row.attrib.r, newTableRows.length);\n }\n }\n const cellsOverTable = row.findall(\"c\").filter(\n (cell: any) => !cellsSubstituteTable.includes(cell)\n );\n newTableRows.forEach((newRow: any) => {\n if (this.option && this.option.substituteAllTableRow) {\n cellsOverTable.forEach((cellOverTable: any) => {\n const newCell = this.cloneElement(cellOverTable);\n newCell.attrib.r = this.joinRef({\n row: newRow.attrib.r,\n col: this.splitRef(newCell.attrib.r).col\n });\n newRow.append(newCell);\n });\n const newSortRow = newRow.findall(\"c\").sort((a: any, b: any) => {\n const colA = this.splitRef(a.attrib.r).col;\n const colB = this.splitRef(b.attrib.r).col;\n return this.charToNum(colA) - this.charToNum(colB);\n });\n this.replaceChildren(newRow, newSortRow);\n }\n rows.push(newRow);\n ++totalRowsInserted;\n });\n this.pushDown(this.workbook, sheet.root, namedTables, currentRow!, newTableRows.length);\n }\n }\n // 重建 sheetData 的子节点\n this.replaceChildren(sheetData, rows);\n // 更新表格列标题中的占位符\n this.substituteTableColumnHeaders(namedTables, substitutions);\n // 更新超链接中的占位符\n this.substituteHyperlinks(rels, substitutions);\n // 更新 <dimension />\n if (dimension) {\n if (totalRowsInserted > 0 || totalColumnsInserted > 0) {\n const dimensionRange = this.splitRange(dimension.attrib.ref);\n const dimensionEndRef = this.splitRef(dimensionRange.end);\n dimensionEndRef.row += totalRowsInserted;\n dimensionEndRef.col = this.numToChar(this.charToNum(dimensionEndRef.col) + totalColumnsInserted);\n dimensionRange.end = this.joinRef(dimensionEndRef);\n dimension.attrib.ref = this.joinRange(dimensionRange);\n }\n }\n // 强制重新计算公式值\n sheetData.findall(\"row\").forEach((row: any) => {\n row.findall(\"c\").forEach((cell: any) => {\n const formulas = cell.findall('f');\n if (formulas && formulas.length > 0) {\n cell.findall('v').forEach((v: any) => {\n cell.remove(v);\n });\n }\n });\n });\n // 写回修改后的 XML 树\n this.archive.file(sheet.filename, etree.tostring(sheet.root, {encoding: 'utf-8'}));\n this.archive.file(this.workbookPath!, etree.tostring(this.workbook, {encoding: 'utf-8'}));\n if (rels) {\n this.archive.file(rels.filename, etree.tostring(rels.root, {encoding: 'utf-8'}));\n }\n this.writeRichData();\n this.archive.file('[Content_Types].xml', etree.tostring(this.contentTypes, {encoding: 'utf-8'}));\n // 移除计算链\n if (this.calcChainPath && this.archive.file(this.calcChainPath)) {\n this.archive.remove(this.calcChainPath);\n }\n await this.writeSharedStrings();\n this.writeTables(namedTables);\n this.writeDrawing(drawing);\n }\n\n /**\n * 生成新的二进制 .xlsx 文件\n */\n async generate<T extends JsZip.OutputType>(options?: JsZip.JSZipGeneratorOptions<T>): Promise<OutputByType[T]> {\n return await this.archive.generateAsync(options);\n }\n\n /**\n * 查询占位符合数据值\n * @param substitutions 数据对象\n * @param p 占位符\n * @param full 是否fullKey\n * @return any\n */\n public valueGet(substitutions: object | Record<string, any>, p: Placeholder, full?: boolean): any {\n if (this.option.customQueryFunction === undefined) {\n if (full !== undefined && typeof full === \"boolean\" && full && p.key) {\n return valueDotGet(substitutions, p.name + '.' + p.key, p.default || '');\n }\n return valueDotGet(substitutions, p.name, p.default || '')\n }\n if (full !== undefined && typeof full === \"boolean\" && full &&\n p.key && !p.name.endsWith(`.${p.key}`)) {\n p.name = p.name + '.' + p.key\n }\n return this.option.customQueryFunction(substitutions, p)\n }\n\n // ==================== 辅助方法 ====================\n private async writeSharedStrings(): Promise<void> {\n const content = await this.archive.file(this.sharedStringsPath).async(\"string\");\n const root = etree.parse(content).getroot();\n const children = root.getchildren();\n root.delSlice(0, children.length);\n this.sharedStrings.forEach((string) => {\n const si = etree.Element(\"si\");\n const t = etree.Element(\"t\");\n t.text = string;\n si.append(t);\n root.append(si);\n });\n root.attrib.count = `${this.sharedStrings.length}`;\n root.attrib.uniqueCount = `${this.sharedStrings.length}`;\n this.archive.file(this.sharedStringsPath, etree.tostring(root, {encoding: 'utf-8'}));\n }\n\n private addSharedString(s: string): number {\n const idx = this.sharedStrings.length;\n this.sharedStrings.push(s);\n this.sharedStringsLookup[s] = idx;\n return idx;\n }\n\n private stringIndex(s: string): number {\n let idx = this.sharedStringsLookup[s];\n if (idx === undefined) {\n idx = this.addSharedString(s);\n }\n return idx;\n }\n\n private replaceString(oldString: string, newString: string): number {\n let idx = this.sharedStringsLookup[oldString];\n if (idx === undefined) {\n idx = this.addSharedString(newString);\n } else {\n this.sharedStrings[idx] = newString;\n delete this.sharedStringsLookup[oldString];\n this.sharedStringsLookup[newString] = idx;\n }\n return idx;\n }\n\n private loadSheets(prefix: string, workbook: Element, workbookRels: any): SheetInfo[] {\n const sheets: SheetInfo[] = [];\n for (const sheet of workbook.findall(\"sheets/sheet\")) {\n const sheetId = sheet.attrib.sheetId;\n const relId = sheet.attrib['r:id'];\n const relationship = workbookRels.find(`Relationship[@Id='${relId}']`);\n const filename = prefix + \"/\" + relationship.attrib.Target;\n sheets.push({\n root: sheet,\n filename: filename,\n name: sheet.attrib.name,\n id: parseInt(sheetId, 10),\n });\n }\n return sheets;\n }\n\n async loadSheet(sheet: string | number): Promise<SheetInfoMust> {\n let info: SheetInfo | null = null;\n for (let i = 0; i < this.sheets.length; ++i) {\n if ((typeof (sheet) === \"number\" && this.sheets[i].id === sheet) || (this.sheets[i].name === sheet)) {\n info = this.sheets[i];\n break;\n }\n }\n if (info === null && (typeof (sheet) === \"number\")) {\n info = this.sheets[sheet - 1];\n }\n if (info === null) {\n throw new Error(\"Sheet \" + sheet + \" not found\");\n }\n const content = await this.archive.file(info.filename).async(\"string\");\n return {\n filename: info.filename,\n name: info.name,\n id: info.id,\n root: etree.parse(content).getroot()\n };\n }\n\n async loadSheetRels(sheetFilename: string): Promise<RelsInfo> {\n const sheetDirectory = path.dirname(sheetFilename);\n const sheetName = path.basename(sheetFilename);\n const relsFilename = path.join(sheetDirectory, '_rels', sheetName + '.rels').replace(/\\\\/g, '/');\n const relsFile = this.archive.file(relsFilename);\n if (relsFile === null) {\n return this.initSheetRels(sheetFilename);\n }\n const content = await relsFile.async(\"string\");\n return {\n filename: relsFilename,\n root: etree.parse(content).getroot()\n };\n }\n\n private initSheetRels(sheetFilename: string): RelsInfo {\n const sheetDirectory = path.dirname(sheetFilename);\n const sheetName = path.basename(sheetFilename);\n const relsFilename = path.join(sheetDirectory, '_rels', sheetName + '.rels').replace(/\\\\/g, '/');\n const element = etree.Element;\n const ElementTree = etree.ElementTree;\n const root = element('Relationships');\n root.set('xmlns', 'http://schemas.openxmlformats.org/package/2006/relationships');\n const relsEtree = new ElementTree(root);\n return {\n filename: relsFilename,\n root: relsEtree.getroot()\n };\n }\n\n private async loadDrawing(sheet: any, sheetFilename: string, rels: any): Promise<DrawingInfo> {\n // const sheetName = path.basename(sheetFilename);\n const sheetDirectory = path.dirname(sheetFilename);\n const drawing: DrawingInfo = {filename: '', root: null};\n const drawingPart = sheet.find(\"drawing\");\n if (drawingPart === null) {\n return this.initDrawing(sheet, rels);\n }\n const relationshipId = drawingPart.attrib['r:id'];\n const target = rels.find(`Relationship[@Id='${relationshipId}']`).attrib.Target;\n const drawingFilename = path.join(sheetDirectory, target).replace(/\\\\/g, '/');\n const drawContent = await this.archive.file(drawingFilename).async(\"string\");\n const drawingTree = etree.parse(drawContent);\n drawing.filename = drawingFilename;\n drawing.root = drawingTree.getroot();\n drawing.relFilename = path.dirname(drawingFilename) + '/_rels/' + path.basename(drawingFilename) + '.rels';\n const relFile = this.archive.file(drawing.relFilename);\n if (relFile === null) {\n drawing.relRoot = etree.Element('Relationships');\n drawing.relRoot.set('xmlns', \"http://schemas.openxmlformats.org/package/2006/relationships\");\n } else {\n const relContent = await relFile.async(\"string\");\n drawing.relRoot = etree.parse(relContent).getroot();\n }\n return drawing;\n }\n\n private addContentType(partName: string, contentType: string): void {\n etree.SubElement(this.contentTypes, 'Override', {'ContentType': contentType, 'PartName': partName});\n }\n\n private initDrawing(sheet: any, rels: any): DrawingInfo {\n const maxId = this.findMaxId(rels, 'Relationship', 'Id', /rId(\\d*)/);\n const rel = etree.SubElement(rels, 'Relationship');\n sheet.insert(sheet._children.length, etree.Element('drawing', {'r:id': 'rId' + maxId}));\n rel.set('Id', 'rId' + maxId);\n rel.set('Type', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing');\n const drawing: DrawingInfo = {} as DrawingInfo;\n const drawingFilename = 'drawing' + this.findMaxFileId(/xl\\/drawings\\/drawing\\d*\\.xml/, /drawing(\\d*)\\.xml/) + '.xml';\n rel.set('Target', '../drawings/' + drawingFilename);\n drawing.root = etree.Element('xdr:wsDr');\n drawing.root.set('xmlns:xdr', \"http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing\");\n drawing.root.set('xmlns:a', \"http://schemas.openxmlformats.org/drawingml/2006/main\");\n drawing.filename = 'xl/drawings/' + drawingFilename;\n drawing.relFilename = 'xl/drawings/_rels/' + drawingFilename + '.rels';\n drawing.relRoot = etree.Element('Relationships');\n drawing.relRoot.set('xmlns', \"http://schemas.openxmlformats.org/package/2006/relationships\");\n this.addContentType('/' + drawing.filename, 'application/vnd.openxmlformats-officedocument.drawing+xml');\n return drawing;\n }\n\n private writeDrawing(drawing: DrawingInfo | null): void {\n if (drawing !== null) {\n this.archive.file(drawing.filename, etree.tostring(drawing.root, {encoding: \"utf-8\"}));\n this.archive.file(drawing.relFilename, etree.tostring(drawing.relRoot, {encoding: \"utf-8\"}));\n }\n }\n\n private moveAllImages(drawing: DrawingInfo, fromRow: string, nbRow: number): void {\n drawing.root.getchildren().forEach((drawElement: any) => {\n if (drawElement.tag == \"xdr:twoCellAnchor\") {\n this._moveTwoCellAnchor(drawElement, fromRow, nbRow);\n }\n });\n }\n\n private _moveTwoCellAnchor(drawingElement: any, fromRow: string, nbRow: number): void {\n const _moveImage = (drawingElement: any, fromRow: string, nbRow: number | string) => {\n let num: number;\n if (typeof nbRow === \"string\") {\n num = Number.parseInt(nbRow, 10);\n } else {\n num = nbRow;\n }\n drawingElement.find('xdr:from').find('xdr:row').text = Number.parseInt(drawingElement.find('xdr:from').find('xdr:row').text, 10) + num;\n drawingElement.find('xdr:to').find('xdr:row').text = Number.parseInt(drawingElement.find('xdr:to').find('xdr:row').text, 10) + num;\n };\n if (this.option[\"moveSameLineImages\"]) {\n if (parseInt(drawingElement.find('xdr:from').find('xdr:row').text) + 1 >= parseInt(fromRow)) {\n _moveImage(drawingElement, fromRow, nbRow);\n }\n } else {\n if (parseInt(drawingElement.find('xdr:from').find('xdr:row').text) + 1 > parseInt(fromRow)) {\n _moveImage(drawingElement, fromRow, nbRow);\n }\n }\n }\n\n async loadTables(sheet: Element, sheetFilename: string): Promise<TableInfo[]> {\n const sheetDirectory = path.dirname(sheetFilename);\n const sheetName = path.basename(sheetFilename);\n const relsFilename = sheetDirectory + \"/\" + '_rels' + \"/\" + sheetName + '.rels';\n const relsFile = this.archive.file(relsFilename);\n const tables: TableInfo[] = [];\n if (relsFile === null) {\n return tables;\n }\n const relsContent = await relsFile.async(\"string\");\n const rels = etree.parse(relsContent).getroot();\n for (let tablePart of sheet.findall(\"tableParts/tablePart\")) {\n const relationshipId = tablePart.attrib['r:id'];\n const target = rels.find(`Relationship[@Id='${relationshipId}']`).attrib.Target;\n const tableFilename = target.replace('..', this.prefix!);\n const content = await this.archive.file(tableFilename).async(\"string\");\n const tableTree = etree.parse(content);\n tables.push({\n filename: tableFilename,\n root: tableTree.getroot()\n });\n }\n return tables;\n }\n\n private writeTables(tables: TableInfo[]): void {\n tables.forEach((namedTable) => {\n this.archive.file(namedTable.filename, etree.tostring(namedTable.root, {encoding: 'utf-8'}));\n });\n }\n\n private substituteHyperlinks(rels: RelsInfo | null, substitutions: Record<string, any>): void {\n if (rels === null) {\n return;\n }\n const relationships = rels.root._children;\n relationships.forEach((relationship: any) => {\n if (relationship.attrib.Type === HYPERLINK_RELATIONSHIP) {\n let target = relationship.attrib.Target;\n target = decodeURI(decodeURI(target));\n this.extractPlaceholders(target).forEach((placeholder) => {\n const substitution = substitutions[placeholder.name];\n if (substitution === undefined) {\n return;\n }\n target = target.replace(placeholder.placeholder, this.stringify(substitution));\n relationship.attrib.Target = encodeURI(target);\n });\n }\n });\n }\n\n private substituteTableColumnHeaders(tables: TableInfo[], substitutions: Record<string, any>): void {\n tables.forEach((table) => {\n const root = table.root;\n const columns = root.find(\"tableColumns\");\n const autoFilter = root.find(\"autoFilter\");\n const tableRange = this.splitRange(root.attrib.ref);\n let idx = 0;\n let inserted = 0;\n const newColumns: any[] = [];\n columns.findall(\"tableColumn\").forEach((col: any) => {\n ++idx;\n col.attrib.id = Number(idx).toString();\n newColumns.push(col);\n let name = col.attrib.name;\n this.extractPlaceholders(name).forEach((placeholder) => {\n const substitution = substitutions[placeholder.name];\n if (substitution === undefined) {\n return;\n }\n if (placeholder.full && placeholder.type === \"normal\" && substitution instanceof Array) {\n substitution.forEach((element: any, i: number) => {\n let newCol = col;\n if (i > 0) {\n newCol = this.cloneElement(newCol);\n newCol.attrib.id = Number(++idx).toString();\n newColumns.push(newCol);\n ++inserted;\n tableRange.end = this.nextCol(tableRange.end);\n }\n newCol.attrib.name = this.stringify(element);\n });\n } else {\n name = name.replace(placeholder.placeholder, this.stringify(substitution));\n col.attrib.name = name;\n }\n });\n });\n this.replaceChildren(columns, newColumns);\n if (inserted > 0) {\n columns.attrib.count = Number(idx).toString();\n root.attrib.ref = this.joinRange(tableRange);\n if (autoFilter !== null) {\n autoFilter.attrib.ref = this.joinRange(tableRange);\n }\n }\n const tableRoot = table.root;\n const tableRange2 = this.splitRange(tableRoot.attrib.ref);\n const tableStart = this.splitRef(tableRange2.start);\n const tableEnd = this.splitRef(tableRange2.end);\n if (tableRoot.attrib.totalsRowCount) {\n const autoFilter2 = tableRoot.find(\"autoFilter\");\n if (autoFilter2 !== null) {\n autoFilter2.attrib.ref = this.joinRange({\n start: this.joinRef(tableStart),\n end: this.joinRef(tableEnd),\n });\n }\n ++tableEnd.row;\n tableRoot.attrib.ref = this.joinRange({\n start: this.joinRef(tableStart),\n end: this.joinRef(tableEnd),\n });\n }\n });\n }\n\n /**\n * 提取字符串中可能存在的占位符标记\n * 支持扩展:自定义正则表达式和自定义提取器\n */\n extractPlaceholders(inputString: string): Placeholder[] {\n // 如果提供了自定义占位符提取器,使用它\n if (this.option.customPlaceholderExtractor) {\n return this.option.customPlaceholderExtractor(inputString, this.option);\n }\n return defaultExtractPlaceholders(inputString, this.option);\n }\n\n private splitRef(ref: string): Ref {\n const match = ref.match(/(?:(.+)!)?(\\$)?([A-Z]+)?(\\$)?([0-9]+)/);\n return {\n table: match && match[1] || null,\n colAbsolute: Boolean(match && match[2]),\n col: match && match[3] || \"\",\n rowAbsolute: Boolean(match && match[4]),\n row: parseInt(match && match[5], 10)\n };\n }\n\n private joinRef(ref: Ref): string {\n return (ref.table ? ref.table + \"!\" : \"\") +\n (ref.colAbsolute ? \"$\" : \"\") +\n ref.col.toUpperCase() +\n (ref.rowAbsolute ? \"$\" : \"\") +\n Number(ref.row).toString();\n }\n\n private nextCol(ref: string): string {\n ref = ref.toUpperCase();\n return ref.replace(/[A-Z]+/, (match) => {\n return this.numToChar(this.charToNum(match) + 1);\n });\n }\n\n private nextRow(ref: string): string {\n ref = ref.toUpperCase();\n return ref.replace(/[0-9]+/, (match) => {\n return (parseInt(match, 10) + 1).toString();\n });\n }\n\n private charToNum(str: string | number): number {\n let num = 0;\n if (typeof str === \"string\") {\n for (let idx = str.length - 1, iteration = 0; idx >= 0; --idx, ++iteration) {\n const thisChar = str.charCodeAt(idx) - 64;\n const multiplier = Math.pow(26, iteration);\n num += multiplier * thisChar;\n }\n } else {\n num = str as number;\n }\n return num;\n }\n\n private numToChar(num: number): string {\n let str = \"\";\n for (let i = 0; num > 0; ++i) {\n let remainder = num % 26;\n let charCode = remainder + 64;\n num = (num - remainder) / 26;\n if (remainder === 0) {\n charCode = 90;\n --num;\n }\n str = String.fromCharCode(charCode) + str;\n }\n return str;\n }\n\n private generateUUID(): string {\n const hexDigits = '0123456789ABCDEF';\n let uuid = '{';\n for (let i = 0; i < 36; i++) {\n if (i === 8 || i === 13 || i === 18 || i === 23) {\n uuid += '-';\n } else {\n uuid += hexDigits[Math.floor(Math.random() * 16)];\n }\n }\n uuid += '}';\n return uuid;\n }\n\n private isRange(ref: string): boolean {\n return ref.indexOf(':') !== -1;\n }\n\n private isWithin(ref: string, startRef: string, endRef: string): boolean {\n const start = this.splitRef(startRef);\n const end = this.splitRef(endRef);\n const target = this.splitRef(ref);\n start.col = `${this.charToNum(start.col)}`;\n end.col = `${this.charToNum(end.col)}`;\n target.col = `${this.charToNum(target.col)}`;\n return (start.row <= target.row && target.row <= end.row &&\n start.col <= target.col && target.col <= end.col);\n }\n\n /**\n * 将任意类型的值转换为字符串\n * 支持扩展:使用自定义格式化器\n */\n stringify(value: any, placeholder?: Placeholder, key?: string): string {\n // 如果提供了占位符信息,使用格式化器链\n if (placeholder) {\n return this.executeFormatters(value, placeholder, key);\n }\n // 默认行为(向后兼容)\n if (value instanceof Date) {\n return Number((value.getTime() / (1000 * 60 * 60 * 24)) + 25569).toString();\n } else if (typeof (value) === \"number\" || typeof (value) === \"boolean\") {\n return Number(value).toString();\n } else if (typeof (value) === \"string\") {\n return String(value).toString();\n }\n return \"\";\n }\n\n private insertCellValue(cell: any, substitution: any): string {\n const cellValue = cell.find(\"v\");\n const stringify = this.stringify(substitution);\n if (typeof substitution === 'string' && substitution[0] === '=') {\n const formula = etree.Element(\"f\");\n formula.text = substitution.substring(1);\n cell.insert(1, formula);\n delete cell.attrib.t;\n return formula.text.toString();\n }\n if (typeof (substitution) === \"number\" || substitution instanceof Date) {\n delete cell.attrib.t;\n cellValue.text = stringify;\n } else if (typeof (substitution) === \"boolean\") {\n cell.attrib.t = \"b\";\n cellValue.text = stringify;\n } else {\n cell.attrib.t = \"s\";\n cellValue.text = Number(this.stringIndex(stringify)).toString();\n }\n return stringify;\n }\n\n /**\n * 执行单个值的替换\n * 支持扩展:调用自定义替换器\n */\n private substituteScalar(cell: any, string: string, placeholder: Placeholder, substitution: any): string {\n // 尝试执行自定义替换器\n const customResult = this.executeReplacers(cell, string, placeholder, substitution);\n if (customResult !== undefined) {\n if (placeholder.full) {\n return this.insertCellValue(cell, customResult);\n } else {\n cell.attrib.t = \"s\";\n return this.insertCellValue(cell, customResult);\n }\n }\n // 默认行为\n if (placeholder.full) {\n return this.insertCellValue(cell, substitution);\n } else {\n const newString = string.replace(placeholder.placeholder, this.stringify(substitution, placeholder));\n cell.attrib.t = \"s\";\n return this.insertCellValue(cell, newString);\n }\n }\n\n private substituteArray(cells: any[], cell: any, substitution: any[]): number {\n let newCellsInserted = -1;\n let currentCell = cell.attrib.r;\n substitution.forEach((element) => {\n ++newCellsInserted;\n if (newCellsInserted > 0) {\n currentCell = this.nextCol(currentCell);\n }\n const newCell = this.cloneElement(cell);\n this.insertCellValue(newCell, element);\n newCell.attrib.r = currentCell;\n cells.push(newCell);\n });\n return newCellsInserted;\n }\n\n private async substituteTable(\n row: any,\n newTableRows: any[],\n cells: any[],\n cell: any,\n namedTables: TableInfo[],\n substitution: any[],\n placeholder: Placeholder,\n drawing: DrawingInfo | null\n ): Promise<number> {\n let newCellsInserted = 0;\n if (substitution.length === 0) {\n delete cell.attrib.t;\n this.replaceChildren(cell, []);\n } else {\n const parentTables = namedTables.filter((namedTable) => {\n const range = this.splitRange(namedTable.root.attrib.ref);\n return this.isWithin(cell.attrib.r, range.start, range.end);\n });\n for (const [idx, element] of substitution.entries()) {\n let newRow: any;\n let newCell: any;\n let newCellsInsertedOnNewRow = 0;\n const newCells: any[] = [];\n const value = this.valueGet(element, placeholder);\n if (idx === 0) {\n if (value instanceof Array) {\n newCellsInserted = this.substituteArray(cells, cell, value);\n } else if (placeholder.subType == 'image' && value != \"\") {\n this.substituteImage(cell, placeholder.placeholder, placeholder, value, drawing);\n } else if (placeholder.subType === \"imageincell\" && value != \"\") {\n await this.substituteImageInCell(cell, value);\n } else {\n // 尝试自定义替换器\n const customResult = this.executeReplacers(cell, '', placeholder, value);\n if (customResult !== undefined) {\n this.insertCellValue(cell, customResult);\n } else {\n this.insertCellValue(cell, value);\n }\n }\n } else {\n if ((idx - 1) < newTableRows.length) {\n newRow = newTableRows[idx - 1];\n } else {\n newRow = this.cloneElement(row, false);\n newRow.attrib.r = this.getCurrentRow(row, newTableRows.length + 1);\n newTableRows.push(newRow);\n }\n newCell = this.cloneElement(cell);\n newCell.attrib.r = this.joinRef({\n row: newRow.attrib.r,\n col: this.splitRef(newCell.attrib.r).col\n });\n if (value instanceof Array) {\n newCellsInsertedOnNewRow = this.substituteArray(newCells, newCell, value);\n newCells.forEach((nc: any) => {\n newRow.append(nc)\n });\n this.updateRowSpan(newRow, newCellsInsertedOnNewRow);\n } else if (placeholder.subType == 'image' && value != '') {\n this.substituteImage(newCell, placeholder.placeholder, placeholder, value, drawing);\n } else if (placeholder.subType === \"imageincell\" && value != \"\") {\n await this.substituteImageInCell(newCell, value);\n newRow.append(newCell);\n } else {\n // 尝试自定义替换器\n const customResult = this.executeReplacers(newCell, '', placeholder, value);\n if (customResult !== undefined) {\n this.insertCellValue(newCell, customResult);\n } else {\n this.insertCellValue(newCell, value);\n }\n newRow.append(newCell);\n }\n // 检查合并单元格\n const mergeCell = this.sheet!.root.findall(\"mergeCells/mergeCell\")\n .find((c: any) => this.splitRange(c.attrib.ref).start === cell.attrib.r);\n const isMergeCell = mergeCell != null;\n if (isMergeCell) {\n const originalMergeRange = this.splitRange(mergeCell.attrib.ref);\n const originalMergeStart = this.splitRef(originalMergeRange.start);\n const originalMergeEnd = this.splitRef(originalMergeRange.end);\n for (let column = this.charToNum(originalMergeStart.col) + 1; column <= this.charToNum(originalMergeEnd.col); column++) {\n const data = this.sheet!.root.find('sheetData');\n const children = data.getchildren();\n const originalRow = children.find((f: any) => f.attrib.r == originalMergeStart.row);\n const col = this.numToChar(column);\n const originalCell = originalRow.getchildren().find((f: any) => f.attrib.r.startsWith(col));\n const additionalCell = this.cloneElement(originalCell);\n additionalCell.attrib.r = this.joinRef({\n row: newRow.attrib.r,\n col: this.numToChar(column)\n });\n newRow.append(additionalCell);\n }\n }\n // 扩展命名表范围\n parentTables.forEach((namedTable) => {\n const tableRoot = namedTable.root;\n const autoFilter = tableRoot.find(\"autoFilter\");\n const range = this.splitRange(tableRoot.attrib.ref);\n if (!this.isWithin(newCell.attrib.r, range.start, range.end)) {\n range.end = this.nextRow(range.end);\n tableRoot.attrib.ref = this.joinRange(range);\n if (autoFilter !== null) {\n autoFilter.attrib.ref = tableRoot.attrib.ref;\n }\n }\n });\n }\n }\n }\n return newCellsInserted;\n }\n\n private async initRichData(): Promise<void> {\n if (!this.richDataIsInit) {\n const _relsrichValueRel = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n\t <Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\n\t </Relationships>`;\n const rdrichvalue = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n\t <rvData xmlns=\"http://schemas.microsoft.com/office/spreadsheetml/2017/richdata\" count=\"0\">\n\t </rvData>`;\n const rdrichvaluestructure = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n\t <rvStructures xmlns=\"http://schemas.microsoft.com/office/spreadsheetml/2017/richdata\" count=\"1\">\n\t <s t=\"_localImage\">\n\t <k n=\"_rvRel:LocalImageIdentifier\" t=\"i\"/>\n\t <k n=\"CalcOrigin\" t=\"i\"/>\n\t </s>\n\t </rvStructures>`;\n const rdRichValueTypes = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n\t <rvTypesInfo xmlns=\"http://schemas.microsoft.com/office/spreadsheetml/2017/richdata2\"\n\t xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" mc:Ignorable=\"x\"\n\t xmlns:x=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\">\n\t <global>\n\t <keyFlags>\n\t <key name=\"_Self\">\n\t <flag name=\"ExcludeFromFile\" value=\"1\"/>\n\t <flag name=\"ExcludeFromCalcComparison\" value=\"1\"/>\n\t </key>\n\t <key name=\"_DisplayString\">\n\t <flag name=\"ExcludeFromCalcComparison\" value=\"1\"/>\n\t </key>\n\t <key name=\"_Flags\">\n\t <flag name=\"ExcludeFromCalcComparison\" value=\"1\"/>\n\t </key>\n\t <key name=\"_Format\">\n\t <flag name=\"ExcludeFromCalcComparison\" value=\"1\"/>\n\t </key>\n\t <key name=\"_SubLabel\">\n\t <flag name=\"ExcludeFromCalcComparison\" value=\"1\"/>\n\t </key>\n\t <key name=\"_Attribution\">\n\t <flag name=\"ExcludeFromCalcComparison\" value=\"1\"/>\n\t </key>\n\t <key name=\"_Icon\">\n\t <flag name=\"ExcludeFromCalcComparison\" value=\"1\"/>\n\t </key>\n\t <key name=\"_Display\">\n\t <flag name=\"ExcludeFromCalcComparison\" value=\"1\"/>\n\t </key>\n\t <key name=\"_CanonicalPropertyNames\">\n\t <flag name=\"ExcludeFromCalcComparison\" value=\"1\"/>\n\t </key>\n\t <key name=\"_ClassificationId\">\n\t <flag name=\"ExcludeFromCalcComparison\" value=\"1\"/>\n\t </key>\n\t </keyFlags>\n\t </global>\n\t </rvTypesInfo>`;\n const richValueRel = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n\t <richValueRels xmlns=\"http://schemas.microsoft.com/office/spreadsheetml/2022/richvaluerel\"\n\t xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">\n\t </richValueRels>`;\n const metadata = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n\t <metadata xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"\n\t xmlns:xlrd=\"http://schemas.microsoft.com/office/spreadsheetml/2017/richdata\">\n\t <metadataTypes count=\"1\">\n\t <metadataType name=\"XLRICHVALUE\" minSupportedVersion=\"120000\" copy=\"1\" pasteAll=\"1\" pasteValues=\"1\" merge=\"1\" splitFirst=\"1\" rowColShift=\"1\" clearFormats=\"1\" clearComments=\"1\" assign=\"1\" coerce=\"1\"/>\n\t </metadataTypes>\n\t <futureMetadata name=\"XLRICHVALUE\" count=\"0\">\n\t </futureMetadata>\n\t <valueMetadata count=\"0\">\n\t </valueMetadata>\n\t </metadata>`;\n const _relsrichValueRelFileName = 'xl/richData/_rels/richValueRel.xml.rels';\n const rdrichvalueFileName = 'xl/richData/rdrichvalue.xml';\n const rdrichvaluestructureFileName = 'xl/richData/rdrichvaluestructure.xml';\n const rdRichValueTypesFileName = 'xl/richData/rdRichValueTypes.xml';\n const richValueRelFileName = 'xl/richData/richValueRel.xml';\n const metadataFileName = 'xl/metadata.xml';\n this._relsrichValueRel = etree.parse(_relsrichValueRel).getroot();\n this.rdrichvalue = etree.parse(rdrichvalue).getroot();\n this.rdrichvaluestructure = etree.parse(rdrichvaluestructure).getroot();\n this.rdRichValueTypes = etree.parse(rdRichValueTypes).getroot();\n this.richValueRel = etree.parse(richValueRel).getroot();\n this.metadata = etree.parse(metadata).getroot();\n if (this.archive.file(_relsrichValueRelFileName)) {\n const content = await this.archive.file(_relsrichValueRelFileName).async(\"string\");\n this._relsrichValueRel = etree.parse(content).getroot();\n }\n if (this.archive.file(rdrichvalueFileName)) {\n const content = await this.archive.file(rdrichvalueFileName).async(\"string\");\n this.rdrichvalue = etree.parse(content).getroot();\n }\n if (this.archive.file(rdrichvaluestructureFileName)) {\n const content = await this.archive.file(rdrichvaluestructureFileName).async(\"string\");\n this.rdrichvaluestructure = etree.parse(content).getroot();\n }\n if (this.archive.file(rdRichValueTypesFileName)) {\n const content = await this.archive.file(rdRichValueTypesFileName).async(\"string\");\n this.rdRichValueTypes = etree.parse(content).getroot();\n }\n if (this.archive.file(richValueRelFileName)) {\n const content = await this.archive.file(richValueRelFileName).async(\"string\");\n this.richValueRel = etree.parse(content).getroot();\n }\n if (this.archive.file(metadataFileName)) {\n const content = await this.archive.file(metadataFileName).async(\"string\");\n this.metadata = etree.parse(content).getroot();\n }\n this.richDataIsInit = true;\n }\n }\n\n private writeRichDataAlreadyExist(element: any, elementSearchName: string, attributeName: string, attributeValue: string): boolean {\n for (const e of element.findall(elementSearchName)) {\n if (e.attrib[attributeName] == attributeValue) {\n return true;\n }\n }\n return false;\n }\n\n private writeRichData(): void {\n if (this.richDataIsInit) {\n const _relsrichValueRelFileName = 'xl/richData/_rels/richValueRel.xml.rels';\n const rdrichvalueFileName = 'xl/richData/rdrichvalue.xml';\n const rdrichvaluestructureFileName = 'xl/richData/rdrichvaluestructure.xml';\n const rdRichValueTypesFileName = 'xl/richData/rdRichValueTypes.xml';\n const richValueRelFileName = 'xl/richData/richValueRel.xml';\n const metadataFileName = 'xl/metadata.xml';\n const options = {encoding: \"utf-8\"};\n this.archive.file(_relsrichValueRelFileName, etree.tostring(this._relsrichValueRel, options));\n this.archive.file(rdrichvalueFileName, etree.tostring(this.rdrichvalue, options));\n this.archive.file(rdrichvaluestructureFileName, etree.tostring(this.rdrichvaluestructure, options));\n this.archive.file(rdRichValueTypesFileName, etree.tostring(this.rdRichValueTypes, options));\n this.archive.file(richValueRelFileName, etree.tostring(this.richValueRel, options));\n this.archive.file(metadataFileName, etree.tostring(this.metadata, options));\n const broadsideMax = this.findMaxId(this.workbookRels, 'Relationship', 'Id', /rId(\\d*)/);\n let _rel: any;\n if (!this.writeRichDataAlreadyExist(this.workbookRels, 'Relationship', 'Target', \"richData/rdrichvaluestructure.xml\")) {\n _rel = etree.SubElement(this.workbookRels, 'Relationship');\n _rel.set('Id', 'rId' + broadsideMax);\n _rel.set('Type', \"http://schemas.microsoft.com/office/2017/06/relationships/rdRichValueStructure\");\n _rel.set('Target', \"richData/rdrichvaluestructure.xml\");\n }\n if (!this.writeRichDataAlreadyExist(this.workbookRels, 'Relationship', 'Target', \"richData/rdrichvalue.xml\")) {\n _rel = etree.SubElement(this.workbookRels, 'Relationship');\n _rel.set('Id', \"rId\" + (broadsideMax + 1));\n _rel.set('Type', \"http://schemas.microsoft.com/office/2017/06/relationships/rdRichValue\");\n _rel.set('Target', \"richData/rdrichvalue.xml\");\n }\n if (!this.writeRichDataAlreadyExist(this.workbookRels, 'Relationship', 'Target', \"richData/richValueRel.xml\")) {\n _rel = etree.SubElement(this.workbookRels, 'Relationship');\n _rel.set('Id', \"rId\" + (broadsideMax + 2));\n _rel.set('Type', \"http://schemas.microsoft.com/office/2022/10/relationships/richValueRel\");\n _rel.set('Target', \"richData/richValueRel.xml\");\n }\n if (!this.writeRichDataAlreadyExist(this.workbookRels, 'Relationship', 'Target', \"metadata.xml\")) {\n _rel = etree.SubElement(this.workbookRels, 'Relationship');\n _rel.set('Id', \"rId\" + (broadsideMax + 3));\n _rel.set('Type', \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/sheetMetadata\");\n _rel.set('Target', \"metadata.xml\");\n }\n if (!this.writeRichDataAlreadyExist(this.workbookRels, 'Relationship', 'Target', \"richData/rdRichValueTypes.xml\")) {\n _rel = etree.SubElement(this.workbookRels, 'Relationship');\n _rel.set('Id', \"rId\" + (broadsideMax + 4));\n _rel.set('Type', \"http://schemas.microsoft.com/office/2017/06/relationships/rdRichValueTypes\");\n _rel.set('Target', \"richData/rdRichValueTypes.xml\");\n }\n if (!this.writeRichDataAlreadyExist(this.contentTypes, 'Override', 'PartName', \"/xl/metadata.xml\")) {\n let ctOverride = etree.SubElement(this.contentTypes, 'Override');\n ctOverride.set('PartName', \"/xl/metadata.xml\");\n ctOverride.set('ContentType', \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheetMetadata+xml\");\n }\n if (!this.writeRichDataAlreadyExist(this.contentTypes, 'Override', 'PartName', \"/xl/richData/richValueRel.xml\")) {\n let ctOverride = etree.SubElement(this.contentTypes, 'Override');\n ctOverride.set('PartName', \"/xl/richData/richValueRel.xml\");\n ctOverride.set('ContentType', \"application/vnd.ms-excel.richvaluerel+xml\");\n }\n if (!this.writeRichDataAlreadyExist(this.contentTypes, 'Override', 'PartName', \"/xl/richData/rdrichvalue.xml\")) {\n let ctOverride = etree.SubElement(this.contentTypes, 'Override');\n ctOverride.set('PartName', \"/xl/richData/rdrichvalue.xml\");\n ctOverride.set('ContentType', \"application/vnd.ms-excel.rdrichvalue+xml\");\n }\n if (!this.writeRichDataAlreadyExist(this.contentTypes, 'Override', 'PartName', \"/xl/richData/rdrichvaluestructure.xml\")) {\n let ctOverride = etree.SubElement(this.contentTypes, 'Override');\n ctOverride.set('PartName', \"/xl/richData/rdrichvaluestructure.xml\");\n ctOverride.set('ContentType', \"application/vnd.ms-excel.rdrichvaluestructure+xml\");\n }\n if (!this.writeRichDataAlreadyExist(this.contentTypes, 'Override', 'PartName', \"/xl/richData/rdRichValueTypes.xml\")) {\n let ctOverride = etree.SubElement(this.contentTypes, 'Override');\n ctOverride.set('PartName', \"/xl/richData/rdRichValueTypes.xml\");\n ctOverride.set('ContentType', \"application/vnd.ms-excel.rdrichvaluetypes+xml\");\n }\n this._rebuild();\n }\n }\n\n private async substituteImageInCell(cell: any, substitution: any): Promise<boolean> {\n if (substitution == null || substitution == \"\") {\n this.insertCellValue(cell, \"\");\n return true;\n }\n await this.initRichData();\n const maxFildId = this.findMaxFileId(/xl\\/media\\/image\\d*\\..*/, /image(\\d*)\\./);\n const fileExtension = \"jpg\";\n try {\n substitution = this.imageToBuffer(substitution);\n } catch (error) {\n if (this.option && this.option.handleImageError && typeof this.option.handleImageError === \"function\") {\n this.option.handleImageError(substitution, error as Error);\n } else {\n throw error;\n }\n }\n this.archive.file('xl/media/image' + maxFildId + '.' + fileExtension, toArrayBuffer(substitution), {\n binary: true,\n base64: false\n });\n const maxIdRichData = this.findMaxId(this._relsrichValueRel, 'Relationship', 'Id', /rId(\\d*)/);\n const _rel = etree.SubElement(this._relsrichValueRel, 'Relationship');\n _rel.set('Id', 'rId' + maxIdRichData);\n _rel.set('Type', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image');\n _rel.set('Target', '../media/image' + maxFildId + '.' + fileExtension);\n const currentCountedRichValue = this.rdrichvalue.get('count');\n this.rdrichvalue.set('count', parseInt(currentCountedRichValue) + 1);\n const rv = etree.SubElement(this.rdrichvalue, 'rv');\n rv.set('s', \"0\");\n const firstV = etree.SubElement(rv, 'v');\n const secondV = etree.SubElement(rv, 'v');\n firstV.text = currentCountedRichValue;\n secondV.text = \"5\";\n const rel = etree.SubElement(this.richValueRel, 'rel');\n rel.set(\"r:id\", 'rId' + maxIdRichData);\n const futureMetadata = this.metadata.findall('futureMetadata').find((fm: any) => {\n return fm.attrib.name === 'XLRICHVALUE';\n });\n const futureMetadataCount = futureMetadata.get('count');\n futureMetadata.set('count', parseInt(futureMetadataCount) + 1);\n const bk = etree.SubElement(futureMetadata, 'bk');\n const extLst = etree.SubElement(bk, 'extLst');\n const ext = etree.SubElement(extLst, 'ext');\n ext.set(\"uri\", \"{3e2802c4-a4d2-4d8b-9148-e3be6c30e623}\");\n const xlrd_rvb = etree.SubElement(ext, 'xlrd:rvb');\n xlrd_rvb.set(\"i\", futureMetadataCount);\n const valueMetadataCount = this.metadata.find('valueMetadata').get('count');\n this.metadata.find('valueMetadata').set('count', parseInt(valueMetadataCount) + 1);\n const bk_VM = etree.SubElement(this.metadata.find('valueMetadata'), 'bk');\n const rc = etree.SubElement(bk_VM, 'rc');\n const XLRICHVALUEMetaDataTypeIndex = this.metadata.find('metadataTypes').findall('metadataType').findIndex((el: any) => {\n return el.attrib.name === \"XLRICHVALUE\";\n });\n rc.set(\"t\", \"\" + (XLRICHVALUEMetaDataTypeIndex + 1));\n rc.set(\"v\", valueMetadataCount);\n cell.set(\"t\", \"e\");\n cell.set(\"vm\", parseInt(currentCountedRichValue) + 1);\n this.insertCellValue(cell, \"#VALUE!\");\n return true;\n }\n\n private substituteImage(cell: any, string: string, placeholder: Placeholder, substitution: any, drawing: DrawingInfo | null): boolean {\n this.substituteScalar(cell, string, placeholder, '');\n if (substitution == null || substitution == \"\") {\n return true;\n }\n const maxId = this.findMaxId(drawing!.relRoot, 'Relationship', 'Id', /rId(\\d*)/);\n const maxFildId = this.findMaxFileId(/xl\\/media\\/image\\d*.jpg/, /image(\\d*)\\.jpg/);\n const rel = etree.SubElement(drawing!.relRoot, 'Relationship');\n rel.set('Id', 'rId' + maxId);\n rel.set('Type', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image');\n rel.set('Target', '../media/image' + maxFildId + '.jpg');\n try {\n substitution = this.imageToBuffer(substitution);\n } catch (error) {\n if (this.option && this.option.handleImageError && typeof this.option.handleImageError === \"function\") {\n this.option.handleImageError(substitution, error as Error);\n } else {\n throw error;\n }\n }\n this.archive.file('xl/media/image' + maxFildId + '.jpg', toArrayBuffer(substitution), {\n binary: true,\n base64: false\n });\n const dimension = sizeOf(substitution);\n let imageWidth = this.pixelsToEMUs(dimension.width);\n let imageHeight = this.pixelsToEMUs(dimension.height);\n let imageInMergeCell = false;\n for (let mergeCell of this.sheet!.root.findall(\"mergeCells/mergeCell\")) {\n if (this.cellInMergeCells(cell, mergeCell)) {\n const mergeCellWidth = this.getWidthMergeCell(mergeCell, this.sheet! as SheetInfoMust);\n const mergeCellHeight = this.getHeightMergeCell(mergeCell, this.sheet! as SheetInfoMust);\n const mergeWidthEmus = this.columnWidthToEMUs(mergeCellWidth);\n const mergeHeightEmus = this.rowHeightToEMUs(mergeCellHeight);\n const widthRate = imageWidth / mergeWidthEmus;\n const heightRate = imageHeight / mergeHeightEmus;\n if (widthRate > heightRate) {\n imageWidth = Math.floor(imageWidth / widthRate);\n imageHeight = Math.floor(imageHeight / widthRate);\n } else {\n imageWidth = Math.floor(imageWidth / heightRate);\n imageHeight = Math.floor(imageHeight / heightRate);\n }\n imageInMergeCell = true;\n }\n }\n if (!imageInMergeCell) {\n let ratio = 100;\n if (this.option && this.option.imageRatio) {\n ratio = this.option.imageRatio;\n }\n if (ratio <= 0) {\n ratio = 100;\n }\n imageWidth = Math.floor(imageWidth * ratio / 100);\n imageHeight = Math.floor(imageHeight * ratio / 100);\n }\n const imagePart = etree.SubElement(drawing!.root, 'xdr:oneCellAnchor');\n const fromPart = etree.SubElement(imagePart, 'xdr:from');\n const fromCol = etree.SubElement(fromPart, 'xdr:col');\n fromCol.text = (this.charToNum(this.splitRef(cell.attrib.r).col) - 1).toString();\n const fromColOff = etree.SubElement(fromPart, 'xdr:colOff');\n fromColOff.text = '0';\n const fromRow = etree.SubElement(fromPart, 'xdr:row');\n fromRow.text = (this.splitRef(cell.attrib.r).row - 1).toString();\n const fromRowOff = etree.SubElement(fromPart, 'xdr:rowOff');\n fromRowOff.text = '0';\n const extImagePart = etree.SubElement(imagePart, 'xdr:ext', {cx: `${imageWidth}`, cy: `${imageHeight}`});\n const picNode = etree.SubElement(imagePart, 'xdr:pic');\n const nvPicPr = etree.SubElement(picNode, 'xdr:nvPicPr');\n const cNvPr = etree.SubElement(nvPicPr, 'xdr:cNvPr', {id: `${maxId}`, name: 'image_' + maxId, descr: ''});\n const cNvPicPr = etree.SubElement(nvPicPr, 'xdr:cNvPicPr');\n const picLocks = etree.SubElement(cNvPicPr, 'a:picLocks', {noChangeAspect: '1'});\n const blipFill = etree.SubElement(picNode, 'xdr:blipFill');\n const blip = etree.SubElement(blipFill, 'a:blip', {\n \"xmlns:r\": \"http://schemas.openxmlformats.org/officeDocument/2006/relationships\",\n \"r:embed\": \"rId\" + maxId\n });\n const stretch = etree.SubElement(blipFill, 'a:stretch');\n const fillRect = etree.SubElement(stretch, 'a:fillRect');\n const spPr = etree.SubElement(picNode, 'xdr:spPr');\n const xfrm = etree.SubElement(spPr, 'a:xfrm');\n const off = etree.SubElement(xfrm, 'a:off', {x: \"0\", y: \"0\"});\n const ext = etree.SubElement(xfrm, 'a:ext', {cx: `${imageWidth}`, cy: `${imageHeight}`});\n const prstGeom = etree.SubElement(spPr, 'a:prstGeom', {'prst': 'rect'});\n const avLst = etree.SubElement(prstGeom, 'a:avLst');\n const clientData = etree.SubElement(imagePart, 'xdr:clientData');\n return true;\n }\n\n private cloneElement(element: any, deep?: boolean): any {\n const newElement = etree.Element(element.tag, element.attrib);\n newElement.text = element.text;\n newElement.tail = element.tail;\n if (deep !== false) {\n element.getchildren().forEach((child: any) => {\n newElement.append(this.cloneElement(child, deep));\n });\n }\n return newElement;\n }\n\n private replaceChildren(parent: any, children: any[]): void {\n parent.delSlice(0, parent.len());\n children.forEach((child) => {\n parent.append(child);\n });\n }\n\n private getCurrentRow(row: any, rowsInserted: number): number {\n return parseInt(row.attrib.r, 10) + rowsInserted;\n }\n\n private getCurrentCell(cell: any, currentRow: number, cellsInserted: number): string {\n const colRef = this.splitRef(cell.attrib.r).col;\n const colNum = this.charToNum(colRef);\n return this.joinRef({\n row: currentRow,\n col: this.numToChar(colNum + cellsInserted)\n });\n }\n\n private updateRowSpan(row: any, cellsInserted: number): void {\n if (cellsInserted !== 0 && row.attrib.spans) {\n const rowSpan = row.attrib.spans.split(':').map((f: string) => parseInt(f, 10));\n rowSpan[1] += cellsInserted;\n row.attrib.spans = rowSpan.join(\":\");\n }\n }\n\n private splitRange(range: string): Range {\n const split = range.split(\":\");\n return {\n start: split[0],\n end: split[1]\n };\n }\n\n private joinRange(range: Range): string {\n return range.start + \":\" + range.end;\n }\n\n private pushRight(workbook: any, sheet: any, currentCell: string, numCols: number): void {\n const cellRef = this.splitRef(currentCell);\n const currentRow = cellRef.row;\n const currentCol = this.charToNum(cellRef.col);\n sheet.findall(\"mergeCells/mergeCell\").forEach((mergeCell: any) => {\n const mergeRange = this.splitRange(mergeCell.attrib.ref);\n const mergeStart = this.splitRef(mergeRange.start);\n const mergeStartCol = this.charToNum(mergeStart.col);\n const mergeEnd = this.splitRef(mergeRange.end);\n const mergeEndCol = this.charToNum(mergeEnd.col);\n if (mergeStart.row === currentRow && currentCol < mergeStartCol) {\n mergeStart.col = this.numToChar(mergeStartCol + numCols);\n mergeEnd.col = this.numToChar(mergeEndCol + numCols);\n mergeCell.attrib.ref = this.joinRange({\n start: this.joinRef(mergeStart),\n end: this.joinRef(mergeEnd),\n });\n }\n });\n workbook.findall(\"definedNames/definedName\").forEach((name: any) => {\n const ref = name.text;\n if (this.isRange(ref)) {\n const namedRange = this.splitRange(ref);\n const namedStart = this.splitRef(namedRange.start);\n const namedStartCol = this.charToNum(namedStart.col);\n const namedEnd = this.splitRef(namedRange.end);\n const namedEndCol = this.charToNum(namedEnd.col);\n if (namedStart.row === currentRow && currentCol < namedStartCol) {\n namedStart.col = this.numToChar(namedStartCol + numCols);\n namedEnd.col = this.numToChar(namedEndCol + numCols);\n name.text = this.joinRange({\n start: this.joinRef(namedStart),\n end: this.joinRef(namedEnd),\n });\n }\n } else {\n const namedRef = this.splitRef(ref);\n const namedCol = this.charToNum(namedRef.col);\n if (namedRef.row === currentRow && currentCol < namedCol) {\n namedRef.col = this.numToChar(namedCol + numCols);\n name.text = this.joinRef(namedRef);\n }\n }\n });\n sheet.findall(\"hyperlinks/hyperlink\").forEach((hyperlink: any) => {\n const ref = this.splitRef(hyperlink.attrib.ref);\n const colNumber = this.charToNum(ref.col);\n if (colNumber > currentCol) {\n ref.col = this.numToChar(colNumber + numCols);\n hyperlink.attrib.ref = this.joinRef(ref);\n }\n });\n }\n\n private pushDown(workbook: any, sheet: any, tables: TableInfo[], currentRow: number, numRows: number): void {\n const mergeCells = sheet.find(\"mergeCells\");\n sheet.findall(\"mergeCells/mergeCell\").forEach((mergeCell: any) => {\n const mergeRange = this.splitRange(mergeCell.attrib.ref);\n const mergeStart = this.splitRef(mergeRange.start);\n const mergeEnd = this.splitRef(mergeRange.end);\n if (mergeStart.row > currentRow) {\n mergeStart.row += numRows;\n mergeEnd.row += numRows;\n mergeCell.attrib.ref = this.joinRange({\n start: this.joinRef(mergeStart),\n end: this.joinRef(mergeEnd),\n });\n }\n if (mergeStart.row == currentRow) {\n for (let i = 1; i <= numRows; i++) {\n const newMergeCell = this.cloneElement(mergeCell);\n mergeStart.row += 1;\n mergeEnd.row += 1;\n newMergeCell.attrib.ref = this.joinRange({\n start: this.joinRef(mergeStart),\n end: this.joinRef(mergeEnd)\n });\n mergeCells.attrib.count += 1;\n mergeCells._children.push(newMergeCell);\n }\n }\n });\n tables.forEach((table) => {\n const tableRoot = table.root;\n const tableRange = this.splitRange(tableRoot.attrib.ref);\n const tableStart = this.splitRef(tableRange.start);\n const tableEnd = this.splitRef(tableRange.end);\n if (tableStart.row > currentRow) {\n tableStart.row += numRows;\n tableEnd.row += numRows;\n tableRoot.attrib.ref = this.joinRange({\n start: this.joinRef(tableStart),\n end: this.joinRef(tableEnd),\n });\n const autoFilter = tableRoot.find(\"autoFilter\");\n if (autoFilter !== null) {\n autoFilter.attrib.ref = tableRoot.attrib.ref;\n }\n }\n });\n workbook.findall(\"definedNames/definedName\").forEach((name: any) => {\n const ref = name.text;\n if (this.isRange(ref)) {\n const namedRange = this.splitRange(ref);\n const namedStart = this.splitRef(namedRange.start);\n const namedEnd = this.splitRef(namedRange.end);\n if (namedStart) {\n if (namedStart.row > currentRow) {\n namedStart.row += numRows;\n namedEnd.row += numRows;\n name.text = this.joinRange({\n start: this.joinRef(namedStart),\n end: this.joinRef(namedEnd),\n });\n }\n }\n if (this.option && this.option.pushDownPageBreakOnTableSubstitution) {\n if (this.sheet!.name == name.text.split(\"!\")[0].replace(/'/gi, \"\") && namedEnd) {\n if (namedEnd.row > currentRow) {\n namedEnd.row += numRows;\n name.text = this.joinRange({\n start: this.joinRef(namedStart),\n end: this.joinRef(namedEnd),\n });\n }\n }\n }\n } else {\n const namedRef = this.splitRef(ref);\n if (namedRef.row > currentRow) {\n namedRef.row += numRows;\n name.text = this.joinRef(namedRef);\n }\n }\n });\n sheet.findall(\"hyperlinks/hyperlink\").forEach((hyperlink: any) => {\n const ref = this.splitRef(hyperlink.attrib.ref);\n if (ref.row > currentRow) {\n ref.row += numRows;\n hyperlink.attrib.ref = this.joinRef(ref);\n }\n });\n }\n\n async hideCols(sheetName: string | number, hideItemIndexes: number[]): Promise<this> {\n const sheet = await this.loadSheet(sheetName);\n this.sheet = sheet;\n if (Array.isArray(hideItemIndexes) && hideItemIndexes.length) {\n const cols = sheet.root.find(\"cols\");\n if (cols) {\n hideItemIndexes.forEach((hideIndex) => {\n const colIndex = hideIndex + 1;\n const col = cols.findall(\"col\").find((c: any) => {\n const min = parseInt(c.attrib.min, 10);\n const max = parseInt(c.attrib.max, 10);\n return colIndex >= min && colIndex <= max;\n });\n if (col) {\n col.attrib.hidden = \"1\";\n }\n });\n }\n }\n this.archive.file(sheet.filename, etree.tostring(sheet.root, {encoding: 'utf-8'}));\n this._rebuild();\n return this;\n }\n\n private getWidthCell(numCol: number, sheet: SheetInfo | SheetInfoMust): number {\n let defaultWidth = sheet.root.find(\"sheetFormatPr\").attrib[\"defaultColWidth\"];\n if (!defaultWidth) {\n defaultWidth = \"11.42578125\";\n }\n let finalWidth = defaultWidth;\n sheet.root.findall(\"cols/col\").forEach((col: any) => {\n if (numCol >= col.attrib[\"min\"] && numCol <= col.attrib[\"max\"]) {\n if (col.attrib[\"width\"] != undefined) {\n finalWidth = col.attrib[\"width\"];\n }\n }\n });\n return Number.parseFloat(finalWidth);\n }\n\n private getWidthMergeCell(mergeCell: any, sheet: SheetInfoMust): number {\n let mergeWidth = 0;\n const mergeRange = this.splitRange(mergeCell.attrib.ref);\n const mergeStartCol = this.charToNum(this.splitRef(mergeRange.start).col);\n const mergeEndCol = this.charToNum(this.splitRef(mergeRange.end).col);\n for (let i = mergeStartCol; i < mergeEndCol + 1; i++) {\n mergeWidth += this.getWidthCell(i, sheet);\n }\n return mergeWidth;\n }\n\n private getHeightCell(numRow: number, sheet: SheetInfoMust): number {\n let finalHeight = sheet.root.find(\"sheetFormatPr\").attrib[\"defaultRowHeight\"];\n sheet.root.findall(\"sheetData/row\").forEach((row: any) => {\n if (numRow == row.attrib[\"r\"]) {\n if (row.attrib[\"ht\"] != undefined) {\n finalHeight = row.attrib[\"ht\"];\n }\n }\n });\n return Number.parseFloat(finalHeight);\n }\n\n private getHeightMergeCell(mergeCell: any, sheet: SheetInfoMust): number {\n let mergeHeight = 0;\n const mergeRange = this.splitRange(mergeCell.attrib.ref);\n const mergeStartRow = this.splitRef(mergeRange.start).row;\n const mergeEndRow = this.splitRef(mergeRange.end).row;\n for (let i = mergeStartRow; i < mergeEndRow + 1; i++) {\n mergeHeight += this.getHeightCell(i, sheet);\n }\n return mergeHeight;\n }\n\n private getNbRowOfMergeCell(mergeCell: any): number {\n const mergeRange = this.splitRange(mergeCell.attrib.ref);\n const mergeStartRow = this.splitRef(mergeRange.start).row;\n const mergeEndRow = this.splitRef(mergeRange.end).row;\n return mergeEndRow - mergeStartRow + 1;\n }\n\n private pixelsToEMUs(pixels: number): number {\n return Math.round(pixels * 914400 / 96);\n }\n\n private columnWidthToEMUs(width: number): number {\n return this.pixelsToEMUs(width * 7.625579987895905);\n }\n\n private rowHeightToEMUs(height: number): number {\n return Math.round(height / 72 * 914400);\n }\n\n private findMaxFileId(fileNameRegex: RegExp, idRegex: RegExp): number {\n const files = this.archive.file(fileNameRegex);\n const maxId = files.reduce((p: number, c: any) => {\n const num = parseInt(idRegex.exec(c.name)![1]);\n if (p == null) {\n return num;\n }\n return p > num ? p : num;\n }, 0);\n return maxId + 1;\n }\n\n private cellInMergeCells(cell: any, mergeCell: any): boolean {\n const cellCol = this.charToNum(this.splitRef(cell.attrib.r).col);\n const cellRow = this.splitRef(cell.attrib.r).row;\n const mergeRange = this.splitRange(mergeCell.attrib.ref);\n const mergeStartCol = this.charToNum(this.splitRef(mergeRange.start).col);\n const mergeEndCol = this.charToNum(this.splitRef(mergeRange.end).col);\n const mergeStartRow = this.splitRef(mergeRange.start).row;\n const mergeEndRow = this.splitRef(mergeRange.end).row;\n if (cellCol >= mergeStartCol && cellCol <= mergeEndCol) {\n if (cellRow >= mergeStartRow && cellRow <= mergeEndRow) {\n return true;\n }\n }\n return false;\n }\n\n private imageToBuffer(imageObj: any): Buffer {\n function checkImage(buffer: Buffer): Buffer {\n try {\n sizeOf(buffer);\n return buffer;\n } catch (error) {\n throw new TypeError('imageObj cannot be parse as a buffer image');\n }\n }\n\n if (!imageObj) {\n throw new TypeError('imageObj cannot be null');\n }\n if (imageObj instanceof Buffer) {\n return checkImage(imageObj);\n }\n if (typeof (imageObj) === 'string' || imageObj instanceof String) {\n imageObj = imageObj.toString();\n const imagePath = this.option && this.option.imageRootPath\n ? this.option.imageRootPath + \"/\" + imageObj\n : imageObj;\n if (fs.existsSync(imagePath)) {\n return checkImage(Buffer.from(fs.readFileSync(imagePath, {encoding: 'base64'}), 'base64'));\n }\n try {\n return checkImage(Buffer.from(imageObj, 'base64'));\n } catch (error) {\n throw new TypeError('imageObj cannot be parse as a buffer');\n }\n }\n throw new TypeError(\"imageObj type is not supported : \" + typeof (imageObj));\n }\n\n private findMaxId(element: any, tag: string, attr: string, idRegex: RegExp): number {\n let maxId = 0;\n element.findall(tag).forEach((el: any) => {\n const match = idRegex.exec(el.attrib[attr]);\n if (match == null) {\n throw new Error(\"Can not find the id!\");\n }\n const cid = parseInt(match[1]);\n if (cid > maxId) {\n maxId = cid;\n }\n });\n return ++maxId;\n }\n}\n\n// xlsx 模板 生成 - 函数一键调用\nconst generateXlsxTemplate = async function <T extends JsZip.OutputType>(data: Buffer, values: Object, options?: JsZip.JSZipGeneratorOptions<T> & FullOptions): Promise<OutputByType[T]> {\n const w = await Workbook.parse(data,options);\n await w.substituteAll(values);\n return w.generate(options);\n}\n\nexport {\n Workbook,\n Placeholder,\n Ref,\n Range,\n SheetInfo,\n DrawingInfo,\n TableInfo,\n RelsInfo,\n WorkbookOptions,\n ExtensionOptions,\n FullOptions,\n CustomReplacer,\n CustomPlaceholderExtractor,\n BeforeReplaceHook,\n AfterReplaceHook,\n CustomFormatter,\n OutputByType,\n BufferType,\n defaultFormatters,\n QueryFunction,\n toArrayBuffer,\n isUrl,\n valueDotGet,\n defaultValueDotGet,\n defaultExtractPlaceholders,\n generateXlsxTemplate,\n}","import exceljs from \"exceljs\";\nimport {Stream} from \"stream\";\n\ntype CellPosition = {\n Row: string;\n Column: number;\n Sheet?: string | number;\n};\n\ntype MergeCellRange = {\n top: number;\n left: number;\n bottom: number;\n right: number\n}\n\ntype CellPoint = {\n Row: number,\n Column: number,\n}\n\ninterface PlaceholderCellValue {\n toString(): string;\n\n mergeCell(values: string[]): string;\n}\n\ntype ScanTokenData = {\n value: string;\n token: string;\n}\n\ntype MacroArgs = {\n type: string\n columnParam: number\n rowParam: number[] | number\n formatter?: string\n}\n\ntype ExtractMacroArgs = {\n argToken: string\n startToken: string\n endToken: string\n}\n\nconst isPureNumber = /^[0-9]+$/;\nconst isPureUppercase = /^[A-Z]+$/;\nconst exprSingle = `expr`;\nconst exprArr = `exprArr`;\nconst exprIndex = `index`;\nconst defaultKey = `!!`;\nconst numberKey = `!!number`;\nconst codeKey = `!!codeKey`;\nconst funcCommand = \"fn:\";\n\nenum RuleToken {\n AliasToken = 'alias',\n CellToken = 'cell',\n MergeCellToken = 'mergeCell',\n RowCellToken = 'rowCell',\n UseAliasToken = '@',\n RangeToken = '-',\n PosToken = ':',\n FunctionPatternToken = '<?>',\n AnyToken = '?',\n VarPatternToken = '${?}',\n UndefinedToken = '',\n EqualToken = '=',\n ArgPosToken = ',',\n LparenToken = '(',\n RparenToken = ')',\n DotGetToken = '.',\n CompileGenToken = 'compile:GenCell',\n CompileMacroToken = 'compile:Macro',\n\n}\n\ntype RuleValue = {\n express: string;\n tokens: RuleToken[]; // express tokens\n cells?: CellPoint[];\n key?: string; // alias key\n ref?: string[]; // alias refs\n func?: string; // express ref function name\n compileExpress?: string[];// compileExpress\n posExpr?: RuleValue; // pos Expr\n funcExpr?: RuleValue; // function funcExpr\n value: string | number[] | number | CellPoint | RangeCell | any[]; // alias value\n // extends\n [key: string]: any;\n}\n\ntype RuleResult = {\n rules: Map<RuleToken, RuleValue[]>;\n}\n\ntype FilterMacroResult = {\n tokens: RuleToken[];\n express: string[];\n}\n\ntype CompileChecker = (iv: RuleResult, ctx: RuleMapOptions) => Error[] | undefined\n\ninterface RuleOptions {\n startLine?: number;\n endLine?: number;\n endColumn?: number;\n startColumn?: number;\n // rule token alias settings\n ruleKeyMap?: Map<RuleToken, string>;\n // compile settings\n compileCheckers?: CompileChecker[];\n compileSheets?: string[];\n\n // extends for custom\n [key: string]: any;\n\n setEndRow(end: number): RuleOptions;\n\n parseToken(value: string): RuleToken;\n\n setEndColumn(end: number): RuleOptions;\n\n setStartRow(start: number): RuleOptions;\n\n setStartColumn(start: number): RuleOptions;\n\n getContextMap(): Map<RuleToken, RuleValue[]>;\n\n addRuleMap(key: RuleToken, value: string): RuleOptions;\n\n parseDefault(worksheet: exceljs.Worksheet): RuleOptions;\n\n getCompileCheckHandlers(): CompileChecker[] | undefined;\n}\n\ninterface RangeCell {\n minRow: number;\n maxRow: number;\n stepRow: number;\n minColumn: number;\n maxColumn: number;\n stepColumn: number;\n\n getCells(): CellPoint[];\n}\n\nclass RuleMapOptions implements RuleOptions {\n // rule configure area\n startLine?: number = 1;\n endLine?: number;\n endColumn?: number;\n startColumn?: number = 1;\n // rule token alias settings\n ruleKeyMap?: Map<RuleToken, string>;\n // compile settings\n compileCheckers?: CompileChecker[];\n compileSheets?: string[];\n\n // extends for custom\n [key: string]: any;\n\n constructor(m?: Map<RuleToken, string>) {\n if (m === undefined) {\n this.ruleKeyMap = defaultRuleTokenMap;\n } else {\n this.ruleKeyMap = m;\n }\n }\n\n static withAllSheets(w: exceljs.Workbook, excludes?: string[]): RuleOptions {\n const compileSheets = [];\n const options = new RuleMapOptions();\n if (excludes === undefined) {\n excludes = [];\n }\n if (w.worksheets.length > 0 && excludes.length > 0) {\n for (const [index, sheet] of w.worksheets.entries()) {\n if (excludes.includes(index.toString()) || excludes.includes(sheet.name)) {\n continue;\n }\n if (sheet.name.endsWith(\".json\")) {\n continue;\n }\n compileSheets.push(sheet.name);\n }\n }\n options.compileSheets = compileSheets;\n return options;\n }\n\n parseDefault(worksheet: exceljs.Worksheet): RuleOptions {\n this.ruleKeyMap = mergeOption(this.ruleKeyMap, defaultRuleTokenMap);\n if (this.startLine === undefined) {\n this.startLine = 1;\n }\n if (this.endLine === undefined) {\n this.endLine = worksheet.rowCount;\n }\n if (this.startColumn === undefined) {\n this.startColumn = 1;\n }\n if (this.endColumn === undefined) {\n this.endColumn = worksheet.columnCount;\n }\n return this;\n }\n\n addRuleMap(key: RuleToken, value: string): RuleOptions {\n this.ruleKeyMap.set(key, value);\n return this;\n }\n\n setStartRow(start: number): RuleOptions {\n this.startLine = start;\n return this;\n }\n\n setStartColumn(start: number): RuleOptions {\n this.startColumn = start;\n return this;\n }\n\n setEndRow(end: number): RuleOptions {\n this.endLine = end;\n return this;\n }\n\n setEndColumn(end: number): RuleOptions {\n this.endColumn = end;\n return this;\n }\n\n parseToken(value: string): RuleToken {\n if (value === \"\") {\n return RuleToken.UndefinedToken;\n }\n for (const [token, alias] of this.ruleKeyMap.entries()) {\n if (alias === value) {\n return token;\n }\n }\n return RuleToken.UndefinedToken;\n }\n\n getContextMap(): Map<RuleToken, RuleValue[]> {\n const ctx = new Map<RuleToken, RuleValue[]>();\n for (const [token, expr] of this.ruleKeyMap.entries()) {\n if (!isRuleToken(token)) {\n const value: RuleValue[] = [{\n express: expr,\n key: expr,\n tokens: [token],\n value: token.toString(),\n }];\n ctx.set(token, value);\n }\n }\n return ctx;\n }\n\n getCompileCheckHandlers(): CompileChecker[] | undefined {\n if (this.compileCheckers !== undefined && this.compileCheckers.length > 0) {\n return this.compileCheckers;\n }\n return undefined;\n }\n\n}\n\nclass CompileContext extends RuleMapOptions {\n private aliasMap: Map<string, string> = new Map<string, string>();\n\n sheet?: exceljs.Worksheet;\n\n constructor(m?: Map<RuleToken, string>) {\n super(m);\n }\n\n static create(r: RuleMapOptions): CompileContext {\n const ctx = new CompileContext(r.ruleKeyMap);\n Object.assign(ctx, {...r})\n return ctx.init();\n }\n\n private init(): this {\n if (this.ruleKeyMap === undefined) {\n this.ruleKeyMap = defaultRuleTokenMap;\n }\n return this;\n }\n\n loadAlias(m: Map<RuleToken, RuleValue[]>): this {\n if (m.size <= 0 || !m.has(RuleToken.AliasToken)) {\n return this;\n }\n const values = m.get(RuleToken.AliasToken);\n for (const vs of values) {\n if (typeof vs.value === \"string\") {\n this.aliasMap.set(vs.key, vs.value as string);\n }\n }\n return this;\n }\n\n /**\n * 设置别名缓存\n */\n public setAlias(key: string, value: string): void {\n this.aliasMap.set(key, value);\n }\n\n /**\n * 获取别名缓存值\n */\n public getAlias(key: string): string | undefined {\n return this.aliasMap.get(key);\n }\n\n /**\n * 检查别名是否存在\n */\n public hasAlias(key: string): boolean {\n return this.aliasMap.has(key);\n }\n\n public filterSheet(sheetName: string): boolean {\n if (sheetName !== \"\" && this.compileSheets !== undefined && this.compileSheets.length > 0) {\n return this.compileSheets.includes(sheetName)\n }\n return false;\n }\n\n}\n\ntype TokenParserReply = {\n ok: boolean\n values?: any,\n expr?: RuleValue,\n [key: string]: any;\n}\n\ntype TokenParser = (ctx: Map<RuleToken, RuleValue[]>, t: RuleToken, value: string) => TokenParserReply;\n\ntype TokenParseResolver = { exists: boolean, handler?: TokenParser }\n\ntype RangeValueParserOptions = {\n rowRange: number;\n columnRange: number;\n row: string;\n column: string;\n express: string;\n token: RuleToken;\n};\n\nconst defaultRuleTokenMap = new Map<RuleToken, string>([\n [RuleToken.AliasToken, RuleToken.AliasToken.toString()],\n [RuleToken.AnyToken, RuleToken.AnyToken.toString()],\n [RuleToken.CellToken, RuleToken.CellToken.toString()],\n [RuleToken.RowCellToken, RuleToken.RowCellToken.toString()],\n [RuleToken.MergeCellToken, RuleToken.MergeCellToken.toString()],\n [RuleToken.UseAliasToken, RuleToken.UseAliasToken.toString()],\n [RuleToken.PosToken, RuleToken.PosToken.toString()],\n [RuleToken.RangeToken, RuleToken.RangeToken.toString()],\n [RuleToken.FunctionPatternToken, RuleToken.FunctionPatternToken.toString()],\n [RuleToken.VarPatternToken, RuleToken.VarPatternToken.toString()],\n [RuleToken.EqualToken, RuleToken.EqualToken.toString()],\n [RuleToken.ArgPosToken, RuleToken.ArgPosToken.toString()],\n [RuleToken.LparenToken, RuleToken.LparenToken.toString()],\n [RuleToken.RparenToken, RuleToken.RparenToken.toString()],\n [RuleToken.DotGetToken, RuleToken.DotGetToken.toString()],\n [RuleToken.CompileMacroToken, RuleToken.CompileMacroToken.toString()],\n [RuleToken.CompileGenToken, RuleToken.CompileGenToken.toString()],\n]);\n\nclass DefaultPlaceholderCellValue implements PlaceholderCellValue {\n private readonly placeholder: string;\n private readonly mergeCellPlaceholder?: string;\n\n constructor(p: string, merge?: string) {\n this.placeholder = p;\n this.mergeCellPlaceholder = merge === undefined ? \"\" : merge;\n }\n\n mergeCell(values: string[]): string {\n if (this.mergeCellPlaceholder !== undefined) {\n return this.mergeCellPlaceholder.replace(\"?\", values.join(\",\"));\n }\n return \"\";\n }\n\n toString(): string {\n return this.placeholder;\n }\n}\n\nconst _getCells = (thisArg: RangeCell): CellPoint[] => {\n let cells: CellPoint[] = [];\n for (let j = thisArg.minColumn; j <= thisArg.maxColumn; j += thisArg.stepColumn) {\n for (let i = thisArg.minRow; i <= thisArg.maxRow; i += thisArg.stepRow) {\n cells.push({\n Row: i,\n Column: j,\n });\n }\n }\n return cells;\n}\n\nclass TokenParserManger {\n\n // T=xxx\n static aliasParse(ctx: Map<RuleToken, RuleValue[]>, token: RuleToken, value: string): TokenParserReply {\n if (token !== RuleToken.AliasToken) {\n return {\n ok: false\n }\n }\n // value eg: T=xxx.xxx.Tell\n const parser = getTokenParser(RuleToken.EqualToken);\n const {values, expr, ok} = parser.handler(ctx, RuleToken.EqualToken, value);\n if (!ok) {\n return {\n ok: false,\n }\n }\n if (typeof expr.value !== \"string\" || expr.value === \"\") {\n return {\n ok: false,\n error: new Error(`alias express right value cannot be a empty value.`),\n }\n }\n return {\n ok: true,\n expr: {\n express: value,\n key: expr.key, // alias key\n value: expr.value, // alias value\n tokens: [token, RuleToken.EqualToken], // express tokens\n },\n values: values,\n }\n }\n\n // x=xx\n static equalParse(ctx: Map<RuleToken, RuleValue[]>, token: RuleToken, value: string): TokenParserReply {\n if (token !== RuleToken.EqualToken) {\n return {\n ok: false,\n }\n }\n const equalToken = TokenParserManger.getTokenByCtx(ctx, RuleToken.EqualToken);\n const offset = equalToken.length;\n const index = value.indexOf(equalToken);\n if (index < 0) {\n return {\n ok: false,\n }\n }\n const len = value.length;\n const key = value.substring(0, index);\n const rightValue = value.substring(index + offset, len);\n if (rightValue === \"\") {\n return {\n ok: false,\n error: new Error(`equal express right value cannot be a empty value.`),\n }\n }\n const expr: RuleValue = {\n key: key,\n value: rightValue,\n express: value,\n tokens: [token],\n }\n return {\n ok: true,\n values: [key, rightValue],\n expr,\n }\n }\n\n //cell| X:Y=${?}\n static cellParse(ctx: Map<RuleToken, RuleValue[]>, token: RuleToken, value: string): TokenParserReply {\n if (token !== RuleToken.CellToken) {\n return {\n ok: false\n }\n }\n const equalToken = TokenParserManger.getTokenByCtx(ctx, RuleToken.EqualToken);\n const eqOffset = equalToken.length;\n const posToken = TokenParserManger.getTokenByCtx(ctx, RuleToken.PosToken);\n const eqIndex = value.indexOf(equalToken);\n const posIndex = value.indexOf(posToken);\n if (eqIndex < 0 || posIndex < 0) {\n return {\n ok: false,\n }\n }\n const parser = getTokenParser(RuleToken.PosToken);\n const varParser = getTokenParser(RuleToken.VarPatternToken);\n const posValue = value.substring(0, eqIndex);\n const varValue = value.substring(eqIndex + eqOffset);\n const posReply = parser.handler(ctx, RuleToken.PosToken, posValue);\n if (!posReply.ok) {\n return {\n ok: false,\n ...posReply,\n }\n }\n const varReply = varParser.handler(ctx, RuleToken.VarPatternToken, varValue);\n if (!varReply.ok) {\n return {\n ok: false,\n ...varReply,\n }\n }\n const expr: RuleValue = {\n ...varReply.expr,\n };\n expr.express = value\n expr.cells = posReply.expr.cells\n expr.value = varReply.expr.value // var expr value\n expr.ref = varReply.expr.ref // alias refs\n expr.tokens = [token, RuleToken.EqualToken, ...posReply.expr.tokens, ...varReply.expr.tokens]// token\n return {\n ok: true,\n expr: expr,\n values: [posReply.values, varReply.values],\n }\n }\n\n static useAliasParse(ctx: Map<RuleToken, RuleValue[]>, token: RuleToken, value: string): TokenParserReply {\n if (token !== RuleToken.UseAliasToken) {\n return {\n ok: false,\n }\n }\n // @X.test or @X.@T or @U@T\n const useAliasToken = TokenParserManger.getTokenByCtx(ctx, RuleToken.UseAliasToken);\n const offset = useAliasToken.length;\n const has = offset !== 0 && value.indexOf(useAliasToken) >= 0;\n if (!has) {\n return {\n ok: false,\n }\n }\n const endTokens = [RuleToken.UseAliasToken, RuleToken.LparenToken, RuleToken.ArgPosToken, RuleToken.DotGetToken];\n const values = TokenParserManger.scanToken(value, useAliasToken, TokenParserManger.toList(ctx, endTokens));\n if (values === undefined || values.length <= 0) {\n return {\n ok: false,\n }\n }\n const keys: string[] = [];\n const tokens: RuleToken[] = [];\n const expr: RuleValue = {\n express: value,\n tokens: tokens,\n value: keys,\n ref: [],\n }\n for (const v of values) {\n tokens.push(token);\n keys.push(v.token);\n expr.ref.push(v.value);\n }\n expr.value = keys\n expr.tokens = tokens\n return {\n expr,\n ok: true,\n values: values,\n }\n }\n\n static rangeParse(ctx: Map<RuleToken, RuleValue[]>, token: RuleToken, value: string): TokenParserReply {\n // A-AA or A-AZ or 1-7 or 1-7,2 [step] or A-Z,2 [step]\n if (token !== RuleToken.RangeToken) {\n return {\n ok: false,\n }\n }\n const rangeToken = TokenParserManger.getTokenByCtx(ctx, RuleToken.RangeToken);\n const offset = rangeToken.length;\n const index = value.indexOf(rangeToken);\n if (index < 0 || offset <= 0) {\n return {\n ok: false,\n }\n }\n let setup = 1;\n let startNumber: number = NaN;\n let endNumber: number = NaN;\n let startPos = value.substring(0, index).trim();\n let endPos = value.substring(index + offset).trim();\n const argPosToken = TokenParserManger.getTokenByCtx(ctx, RuleToken.ArgPosToken);\n const endSetupIndex = endPos.indexOf(argPosToken);\n if (endSetupIndex > 0) {\n setup = Number.parseInt(endPos.substring(endSetupIndex).trim(), 10);\n endPos = endPos.substring(0, endSetupIndex).trim()\n }\n if (isNaN(setup)) {\n return {\n ok: false,\n error: new Error(`rangeToken parse setup NaN, ${value}`),\n }\n }\n endNumber = TokenParserManger.parsePosNumber(endPos);\n startNumber = TokenParserManger.parsePosNumber(startPos);\n if (isNaN(startNumber) || isNaN(endNumber)) {\n return {\n ok: false,\n error: new Error(`rangeToken parse start,end has NaN, ${value}`),\n }\n }\n const expr: RuleValue = {\n express: value,\n tokens: [token],\n value: [startNumber, endNumber, setup],\n };\n return {\n expr,\n ok: true,\n values: [startNumber, endNumber, setup],\n }\n }\n\n static posParse(ctx: Map<RuleToken, RuleValue[]>, token: RuleToken, value: string): TokenParserReply {\n if (token !== RuleToken.PosToken) {\n return {\n ok: false\n }\n }\n // A:1 or A-Z:1 or A:1-10 or A-AA:2-10\n const posToken = TokenParserManger.getTokenByCtx(ctx, RuleToken.PosToken);\n const offset = posToken.length;\n const index = value.indexOf(posToken);\n const len = value.length;\n const column = value.substring(0, index).trim(); // column\n const row = value.substring(index + offset, len).trim(); // row\n const rangeToken = TokenParserManger.getTokenByCtx(ctx, RuleToken.RangeToken);\n const columnRange = column.indexOf(rangeToken);\n const rowRange = row.indexOf(rangeToken);\n if (rowRange > 0 || columnRange > 0) {\n return TokenParserManger.parseRangeValue(ctx, {rowRange, columnRange, row, column, token, express: value})\n }\n const cell: CellPoint = {\n Row: Number.parseInt(row, 10),\n Column: columnLetterToNumber(column),\n };\n const expr: RuleValue = {\n value: cell,\n cells: [cell],\n express: value,\n tokens: [token],\n }\n return {\n ok: true,\n values: [row, column],\n expr,\n }\n }\n\n // value input: A-AQ:13-15=<sum(#,[compile:Macro(exprArr,[F],[13,15],!codeKey)],compile:Marco(index),0)>\n // output: {\n // A:13 => sum(#,[ codeKey(F:13.value),codeKey(F:14.value),codeKey(F:15.value)],1,0),\n // B:13 => sum(#,[ codeKey(F:13.value),codeKey(F:14.value),codeKey(F:15.value)],2,0),\n // C:13 => sum(#,[ codeKey(F:13.value),codeKey(F:14.value),codeKey(F:15.value)],3,0),\n // ....,\n // A:14 => sum(#,[ codeKey(F:13.value),codeKey(F:14.value),codeKey(F:15.value)],1,0),\n // B:14 => sum(#,[ codeKey(F:13.value),codeKey(F:14.value),codeKey(F:15.value)],2,0),\n // C:14 => sum(#,[ codeKey(F:13.value),codeKey(F:14.value),codeKey(F:15.value)],3,0),\n // }\n static mergeCellParse(ctx: Map<RuleToken, RuleValue[]>, token: RuleToken, value: string): TokenParserReply {\n // Logic: Range=Expression. Eg: A-AQ:13-15=<sum(...)>\n if (token !== RuleToken.MergeCellToken && token !== RuleToken.RowCellToken) {\n return {ok: false};\n }\n const equalToken = TokenParserManger.getTokenByCtx(ctx, RuleToken.EqualToken);\n const index = value.indexOf(equalToken);\n const offset = equalToken.length;\n if (index <= 0) return {ok: false, error: new Error(`merge cell config syntax error: ${value}`)};\n const rangeStr = value.substring(0, index).trim();\n const exprStr = value.substring(index + offset)\n // Parse Range (PosToken logic usually handles X:Y, here we wrap it)\n // We reuse PosToken parsing logic which handles ranges via RangeToken\n const posParser = getTokenParser(RuleToken.PosToken);\n const posReply = posParser.handler(ctx, RuleToken.PosToken, rangeStr);\n const functionToken = getTokenParser(RuleToken.FunctionPatternToken);\n if (!posReply.ok) return {ok: false, ...posReply};\n const macroGenToken = TokenParserManger.getTokenByCtx(ctx, RuleToken.CompileGenToken);\n // Parse Expression (could be function, var, or raw string)\n // We treat the right side as a raw string or simple token for the generator to handle\n const expr: RuleValue = {\n express: value,\n value: exprStr, // The template expression\n posExpr: posReply.expr,\n tokens: [token, ...posReply.expr.tokens],\n };\n if (exprStr.startsWith(macroGenToken)) {\n const argsSplitToken = TokenParserManger.getTokenByCtx(ctx, RuleToken.ArgPosToken);\n const args = TokenParserManger.split(exprStr, argsSplitToken, [`(`, `)`]);\n const macro = TokenParserManger.filterMacro(args);\n const aliasTokens = TokenParserManger.extractUseAliasTokens(ctx, args);\n if (aliasTokens !== undefined && aliasTokens.length > 0) {\n expr.tokens.push(...aliasTokens);\n }\n if (macro !== undefined && macro.tokens.length > 0) {\n expr.macro = macro;\n expr.tokens.push(...macro.tokens);\n }\n } else {\n const exprReply = functionToken.handler(ctx, RuleToken.FunctionPatternToken, exprStr);\n if (exprReply.error !== undefined && exprReply.error instanceof Error) {\n return {\n ok: false,\n ...exprReply,\n }\n }\n if (exprReply.ok && exprReply.expr !== undefined) {\n expr.funcExpr = exprReply.expr\n expr.tokens.push(...exprReply.expr.tokens);\n }\n }\n return {\n ok: true,\n expr,\n values: [rangeStr, exprStr],\n };\n }\n\n // G-AQ:12=compile:GenCell(compile:Macro(expr,F,12),'.',compile:Marco(index))\n static rowCellParse(ctx: Map<RuleToken, RuleValue[]>, token: RuleToken, value: string): TokenParserReply {\n // Logic: G-AQ:12=compile:GenCell(...)\n if (token !== RuleToken.RowCellToken) {\n return {ok: false};\n }\n // Reuse logic similar to mergeCellParse for range/expression split\n return TokenParserManger.mergeCellParse(ctx, token, value);\n }\n\n // $functionName($arg0:string,$arg1:string[],$arg2:string|number,$arg3:string|number)\n // eg: func(A,[xx1,xx2],xxx3), sum(#,[F,12,13],1,0)\n // $functionName not in compile:Macro,compile:GenCell\n // extract => {func:$functionName, arguments:[$arg0,$arg1,$arg2,$argN...]}\n // output: {func:\"sum\",arguments:[\"A\",[\"F\",\"12\",\"13\"],\"1\",\"0\"]}\n static functionPatternParse(ctx: Map<RuleToken, RuleValue[]>, token: RuleToken, value: string): TokenParserReply {\n // <?> or <functionName(args)>\n if (token !== RuleToken.FunctionPatternToken) {\n return {ok: false};\n }\n const wordToken = TokenParserManger.getTokenByCtx(ctx, RuleToken.AnyToken);\n const funcToken = TokenParserManger.getTokenByCtx(ctx, RuleToken.FunctionPatternToken);\n const splitIndex = funcToken.indexOf(wordToken);\n const splitOffset = wordToken.length;\n const funcStartToken = funcToken.substring(0, splitIndex);\n const funcEndToken = funcToken.substring(splitIndex + splitOffset);\n const rparenToken = TokenParserManger.getTokenByCtx(ctx, RuleToken.RparenToken);\n const lparenToken = TokenParserManger.getTokenByCtx(ctx, RuleToken.LparenToken);\n const argsSplitToken = TokenParserManger.getTokenByCtx(ctx, RuleToken.ArgPosToken);\n // Check structure <?>\n if (value.startsWith(funcStartToken) && value.endsWith(funcEndToken)) {\n const content = value.substring(1, value.length - 1);\n // Simple parse: functionName(arg1,arg2)\n const lparen = content.indexOf(lparenToken);\n const rparen = content.lastIndexOf(rparenToken);\n if (lparen > 0 && rparen > lparen) {\n const funcName = content.substring(0, lparen);\n const argsStr = content.substring(lparen + lparenToken.length, rparen);\n // Basic argument splitting, does not handle nested commas deeply here\n const args = TokenParserManger.split(argsStr, argsSplitToken, [`[`, `]`]);\n const macro = TokenParserManger.filterMacro(args);\n const tokens: RuleToken[] = [token];\n const expr: RuleValue = {\n express: value,\n func: funcName,\n value: args, // arguments array\n tokens: tokens,\n };\n const alias = TokenParserManger.extractUseAliasTokens(ctx, args);\n if (alias !== undefined && alias.length > 0) {\n expr.tokens.push(...alias);\n }\n if (macro !== undefined && macro.tokens.length > 0) {\n expr.macro = macro;\n expr.tokens.push(...macro.tokens)\n }\n return {\n ok: true,\n expr: expr,\n values: [funcName, args],\n };\n }\n }\n return {\n ok: false,\n error: new Error(`function express systax error`),\n };\n }\n\n static varPatternParse(ctx: Map<RuleToken, RuleValue[]>, token: RuleToken, value: string): TokenParserReply {\n // ${?} or ${xxx}\n if (token !== RuleToken.VarPatternToken) {\n return {ok: false};\n }\n // Check if value matches the pattern like ${...}\n const wordToken = TokenParserManger.getTokenByCtx(ctx, RuleToken.AnyToken);\n const varToken = TokenParserManger.getTokenByCtx(ctx, RuleToken.VarPatternToken);\n const index = varToken.indexOf(wordToken);\n const workTokenOffset = wordToken.length;\n const startToken = varToken.substring(0, index);\n const endToken = varToken.substring(workTokenOffset + index);\n if (!value.startsWith(startToken) || !value.endsWith(endToken)) {\n return {\n ok: false,\n error: new Error(`variable expression syntax error,\\$\\{ or \\} flag is miss`),\n };\n }\n const innerContent = value.substring(startToken.length, value.length - endToken.length);\n if (innerContent === \"\") {\n return {\n ok: false,\n error: new Error(\"variable expression syntax error, variable name is empty\"),\n }\n }\n const expr: RuleValue = {\n express: value,\n value: innerContent,\n tokens: [token],\n };\n const aliasToken = TokenParserManger.getTokenByCtx(ctx, RuleToken.UseAliasToken);\n if (innerContent.indexOf(aliasToken) >= 0) {\n const parser = getTokenParser(RuleToken.UseAliasToken);\n const aliasReply = parser.handler(ctx, RuleToken.UseAliasToken, innerContent);\n if (aliasReply.ok) {\n expr.ref = aliasReply.expr.ref\n expr.alias = aliasReply.values\n expr.tokens.push(...aliasReply.expr.tokens);\n }\n }\n return {\n expr,\n ok: true,\n values: [innerContent],\n };\n }\n\n // compile:GenCell(expr1,expr2,...,) => {G:13=>`${expr1}${expr2}..`,G:14=>`${expr1}${expr2}..`,G:15=>`${expr1}${expr2}..`,...}\n // compile:Macro($exprType,$X,$Y,$formater)\n // $exprType: enums [ expr:(single value), exprArr:(array value) ]\n // $X: column index value, number|string or number[]|string[]\n // $Y: row index value, number or number[]\n // $formater: enums [ codeKey(a function for format string),number(a function for string to number) ]\n // compile:Macro(exprArr,[X1,X2],[Y1,Y2],!codeKey) =>\n // codeKey(X1:Y1.value),codeKey(X1:Y2.value),codeKey(X2:Y1.value),codeKey(X2:Y2.value)\n // compile:Macro(exprArr,[X1],[Y1,Y2],!codeKey) => codeKey(X1:Y1.value),codeKey(X1:Y2.value)\n // compile:Marco(index,!number) => number(i),number(i+1),number(i+2) ,i=1\n static compileExprExtract(value: string): RuleToken[] {\n const results: RuleToken[] = [];\n const lp = RuleToken.LparenToken.toString();\n const args = RuleToken.ArgPosToken.toString();\n const values = value.split(lp);\n for (const v of values) {\n let items: string[] = [];\n if (v.indexOf(args) >= 0) {\n items = v.split(args);\n } else {\n items.push(v);\n }\n for (const it of items) {\n if (it === RuleToken.CompileMacroToken.toString() ||\n it.startsWith(RuleToken.CompileMacroToken) ||\n it.endsWith(RuleToken.CompileMacroToken)) {\n results.push(RuleToken.CompileMacroToken);\n } else if (it === RuleToken.CompileGenToken.toString() ||\n it.startsWith(RuleToken.CompileGenToken) ||\n it.endsWith(RuleToken.CompileGenToken)) {\n results.push(RuleToken.CompileGenToken);\n }\n }\n }\n return results;\n }\n\n static getTokenByCtx(ctx: Map<RuleToken, RuleValue[]>, token: RuleToken): string {\n if (ctx.size <= 0 || !ctx.has(token)) {\n return token.toString()\n }\n const values = ctx.get(token)\n if (values.length <= 0 || values[0].key === \"\") {\n return token.toString()\n }\n return values[0].key\n }\n\n static scanToken(value: string, startToken: string, endTokens: string[]): ScanTokenData[] {\n let token: string = \"\";\n let data: string = \"\";\n let end: boolean = false;\n let start: boolean = false;\n const items: ScanTokenData[] = [];\n const offset = [startToken, ...endTokens].sort((a, b) => a.length - b.length)[0].length;\n const size = value.length;\n for (let i = 0; i < size; i += offset) {\n let leftToken: string;\n if (value[i] === startToken) {\n start = true;\n if (token !== \"\") {\n items.push({\n token,\n value: \"\",\n })\n }\n token = startToken;\n } else {\n start = token === startToken;\n leftToken = `${token}${value[i]}`\n }\n let subfix = endTokens.filter(s => s === leftToken);\n end = endTokens.includes(value[i]) || subfix.length > 0;\n if (subfix.length > 0) {\n token = leftToken;\n data = \"\";\n }\n if (start && end) {\n continue;\n }\n if (!end) {\n token = `${token}${value[i]}`;\n data = `${data}${value[i]}`;\n }\n if (end || i + offset >= size) {\n if (data !== \"\") {\n items.push({\n token,\n value: data,\n });\n }\n token = \"\";\n data = \"\";\n end = false;\n }\n }\n return items;\n }\n\n static split(argsStr: string, argsSplitToken: string, ignoreTokenRange: string[]): string[] {\n let value: string = \"\";\n // 使用 depth 处理嵌套情况(如括号嵌套)或简单的开关状态(如引号)\n // depth > 0 表示当前处于“不分割”的区域内\n let depth = 0;\n const items: string[] = [];\n // 预计算 Token 长度,避免循环中重复计算\n const splitLen = argsSplitToken.length;\n const startLen = ignoreTokenRange[0].length;\n const endLen = ignoreTokenRange[1].length;\n const startToken = ignoreTokenRange[0];\n const endToken = ignoreTokenRange[1];\n // 判断是否为同一种符号(如单引号、双引号)\n const isToggleMode = startToken === endToken;\n for (let i = 0; i < argsStr.length;) {\n // 截取当前位置开始的子串用于匹配\n const substr = argsStr.substring(i);\n // 1. 检测是否遇到“结束忽略”标记 (必须在检测“开始标记”之前,否则同符号模式会瞬间开关)\n if (depth > 0 && substr.startsWith(endToken)) {\n value += endToken;\n i += endLen;\n // 如果是同符号模式(如引号),直接关闭;否则减少嵌套深度\n depth = isToggleMode ? 0 : depth - 1;\n continue;\n }\n // 2. 检测是否遇到“开始忽略”标记\n if (substr.startsWith(startToken)) {\n // 如果是同符号模式,只有当前处于关闭状态(depth=0)才打开\n // 如果是不同符号模式(如括号),则增加深度\n if (!isToggleMode || depth === 0) {\n value += startToken;\n i += startLen;\n depth++;\n continue;\n }\n }\n // 3. 检测分隔符 (仅当不在忽略区域内时生效)\n if (depth === 0 && substr.startsWith(argsSplitToken)) {\n items.push(value);\n value = \"\";\n i += splitLen; // 跳过分隔符\n continue;\n }\n // 4. 默认情况:追加当前字符,索引+1\n value += argsStr[i];\n i++;\n }\n // 将最后一段内容推入结果\n // 如果字符串以分隔符结尾,此时 value 为空,应 push 空字符串以保持 split 行为一致性\n if (value !== \"\") {\n items.push(value);\n }\n return items;\n }\n\n static filterMacro(values: string[]): FilterMacroResult | undefined {\n const filter: FilterMacroResult = {\n tokens: [],\n express: [],\n };\n for (const expr of values) {\n let items = TokenParserManger.compileExprExtract(expr);\n if (items === undefined || items.length <= 0) {\n continue;\n }\n filter.express.push(expr);\n filter.tokens.push(...items);\n }\n return filter.tokens.push() <= 0 ? undefined : filter;\n }\n\n static extractUseAliasTokens(ctx: Map<RuleToken, RuleValue[]>, args: string[]): RuleToken[] {\n const tokens: RuleToken[] = [];\n const useAliasToken = TokenParserManger.getTokenByCtx(ctx, RuleToken.UseAliasToken);\n args.forEach(v => v.startsWith(useAliasToken) && tokens.push(RuleToken.UseAliasToken))\n return tokens;\n }\n\n static toList(ctx: Map<RuleToken, RuleValue[]>, endTokens: RuleToken[]): string[] {\n const items: string[] = [];\n for (const token of endTokens) {\n items.push(TokenParserManger.getTokenByCtx(ctx, token));\n }\n return items;\n }\n\n private static parseRangeValue(ctx: Map<RuleToken, RuleValue[]>, options: RangeValueParserOptions): TokenParserReply {\n let rowReply: TokenParserReply;\n let columnReply: TokenParserReply;\n const rangeCell: RangeCell = {\n stepRow: 1,\n stepColumn: 1,\n minColumn: 0,\n minRow: 0,\n maxRow: 0,\n maxColumn: 0,\n getCells: function (): CellPoint[] {\n return _getCells(this);\n }\n };\n const {rowRange, row, column, columnRange, express, token} = options;\n const rangeParse = getTokenParser(RuleToken.RangeToken);\n if (rowRange > 0) {\n columnReply = rangeParse.handler(ctx, RuleToken.RangeToken, row);\n } else {\n const rowValue = Number.parseInt(row, 10);\n rangeCell.maxRow = rowValue;\n rangeCell.minRow = rowValue;\n }\n if (columnRange > 0) {\n rowReply = rangeParse.handler(ctx, RuleToken.RangeToken, column)\n } else {\n const columnValue = columnLetterToNumber(column);\n rangeCell.maxColumn = columnValue;\n rangeCell.minColumn = columnValue;\n }\n if (columnReply !== undefined) {\n if (!columnReply.ok || columnReply.values === undefined) {\n return columnReply\n }\n const values = columnReply.values as number[];\n let min = values[0];\n let max = values[1];\n let setup = values[2] ?? 1;\n rangeCell.minRow = min;\n rangeCell.maxRow = max;\n rangeCell.stepRow = setup;\n }\n if (rowReply !== undefined) {\n if (!rowReply.ok || rowReply.values === undefined) {\n return rowReply\n }\n const values = rowReply.values as number[];\n let min = values[0];\n let max = values[1];\n let setup = values[2] ?? 1;\n rangeCell.minColumn = min;\n rangeCell.maxColumn = max;\n rangeCell.stepColumn = setup;\n }\n const expr: RuleValue = {\n express: express,\n tokens: [token], // express tokens\n value: rangeCell, // alias value\n }\n return {\n ok: true,\n expr,\n values: rangeCell,\n };\n }\n\n private static parsePosNumber(value: string): number {\n let num: number = NaN;\n if (isPureNumber.test(value)) {\n num = Number.parseInt(value, 10)\n } else if (isPureUppercase.test(value)) {\n num = columnLetterToNumber(value);\n }\n return !isNaN(num) && num <= 0 ? NaN : num;\n }\n\n}\n\nconst defaultRuleTokenParserMap = new Map<RuleToken, TokenParser>([\n [RuleToken.AliasToken, TokenParserManger.aliasParse],\n [RuleToken.CellToken, TokenParserManger.cellParse],\n [RuleToken.EqualToken, TokenParserManger.equalParse],\n [RuleToken.MergeCellToken, TokenParserManger.mergeCellParse],\n [RuleToken.RowCellToken, TokenParserManger.rowCellParse],\n [RuleToken.UseAliasToken, TokenParserManger.useAliasParse],\n [RuleToken.RangeToken, TokenParserManger.rangeParse],\n [RuleToken.PosToken, TokenParserManger.posParse],\n [RuleToken.VarPatternToken, TokenParserManger.varPatternParse],\n [RuleToken.FunctionPatternToken, TokenParserManger.functionPatternParse],\n]);\n\nconst macroTokens: RuleToken[] = [RuleToken.CompileGenToken, RuleToken.CompileMacroToken,];\n\nfunction columnLetterToNumber(letter: string): number {\n let num = 0;\n for (let i = 0; i < letter.length; i++) {\n num = num * 26 + (letter.charCodeAt(i) - 64);\n }\n return num;\n}\n\nfunction columnNumberToLetter(num: number): string {\n // 处理非正整数情况\n if (num <= 0) {\n return \"\";\n }\n let letter = \"\";\n while (num > 0) {\n // 核心逻辑:Excel 列标是从1开始的26进制数\n // 1 -> A, 26 -> Z, 27 -> AA\n // 计算当前位的字符:先减1以映射到 0-25 的区间\n let remainder = (num - 1) % 26;\n // A 的 ASCII 码是 65\n letter = String.fromCharCode(65 + remainder) + letter;\n // 移动到下一位:由于是整数除法,需减去当前位再除以26\n // 或者更简单的写法:num = Math.floor((num - 1) / 26);\n num = Math.floor((num - 1) / 26);\n }\n return letter;\n}\n\nfunction isBase64(str: string): boolean {\n if (str.length < 20) return false;\n if (str.includes(\"\\\\\") || str.includes(\" \")) return false;\n if (str.indexOf(\"./\") >= 0 ||\n str.startsWith(\"file://\") ||\n str.startsWith(\"/\") ||\n str.startsWith(\".\")) {\n return false;\n }\n // 剔除可能存在的换行符后再进行纯字符集校验\n const data = str.replace(/^data:.*?;base64,/, \"\");\n const cleanedStr = data.replace(/[\\r\\n]/g, \"\");\n try {\n return Buffer.from(cleanedStr, 'base64').toString('utf-8') !== \"\";\n } catch (e) {\n return false;\n }\n}\n\nfunction base64ToArrayBuffer(base64: string): ArrayBuffer {\n const data = base64.replace(/^data:.*?;base64,/, \"\");\n const binaryString = atob(data);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n return bytes.buffer;\n}\n\nfunction getMergeRange(ws: exceljs.Worksheet, row: number, col: number): MergeCellRange | null {\n const merges = ws.model.merges as string[];\n for (const mergeStr of merges) {\n const parts = mergeStr.split(\":\");\n const tl = ws.getCell(parts[0]);\n const br = ws.getCell(parts[1]);\n const tlRow = Number(tl.row)\n const tlCol = Number(tl.col)\n const brRow = Number(br.row)\n const brCol = Number(br.col)\n if (row >= tlRow && row <= brRow && col >= tlCol && col <= brCol) {\n return {\n top: tlRow,\n left: tlCol,\n bottom: brRow,\n right: brCol,\n };\n }\n }\n return null;\n}\n\nconst resolveCompileMacroGen = (ctx: CompileContext, expr: string, currentCellIndex: number): string => {\n let parts: string[] = [];\n let join = \".\";\n const m = ctx.getContextMap()\n const aliasToken = TokenParserManger.getTokenByCtx(m, RuleToken.UseAliasToken);\n const genToken = TokenParserManger.getTokenByCtx(m, RuleToken.CompileGenToken);\n const endTokens = [RuleToken.CompileGenToken, RuleToken.LparenToken, RuleToken.ArgPosToken, RuleToken.RparenToken];\n const values = TokenParserManger.scanToken(expr, genToken, TokenParserManger.toList(m, endTokens));\n for (const [_, item] of values.entries()) {\n if (item.value === undefined && item.value !== \"\") {\n continue\n }\n if (!item.token.startsWith(aliasToken) && item.value !== exprIndex) {\n parts.push(item.value);\n } else {\n parts.push(resolveAliasExpr(ctx, item.value, currentCellIndex));\n }\n }\n return parts.join(join);\n}\n\nconst getExprEnd = function (macroExpr: string, matchIndex: number, rparenToken: string): number {\n return macroExpr.indexOf(rparenToken, matchIndex);\n}\n\nconst macroFormatters: string[] = [numberKey, codeKey];\ntype MacroUnitHelper = (v: string) => string;\n\n// compile:Macro(type, X_arr, Y_arr, formatter)\nconst extractMacro = function (expr: string, options: ExtractMacroArgs): MacroArgs {\n let end = NaN;\n const offset = options.startToken.length;\n const startIndex = expr.indexOf(options.startToken);\n const endIndex = expr.indexOf(options.endToken);\n const argValues = expr.substring(startIndex + offset, endIndex);\n const values = argValues.split(options.argToken);\n const extracResult: MacroArgs = {type: values[0], rowParam: [], columnParam: undefined};\n if (values.length > 1) {\n extracResult.columnParam = columnLetterToNumber(values[1])\n }\n if (macroFormatters.includes(values[values.length - 1])) {\n end = values.length - 1;\n extracResult.formatter = values[end]\n }\n if (!isNaN(end) && values.length > 2) {\n extracResult.rowParam = values.slice(2, end).map(x => Number.parseInt(x, 10));\n } else if (values.length > 2) {\n extracResult.rowParam = values.slice(2, values.length).map(x => Number.parseInt(x, 10));\n }\n if (extracResult.rowParam !== undefined && extracResult.rowParam instanceof Array && extracResult.rowParam.length === 1) {\n extracResult.rowParam = extracResult.rowParam[0];\n }\n return extracResult;\n}\n\nconst __codeKey = (str: string): string => {\n let vs = str.trim().replace(\"-\", \"_\").replace(\"/\", \"_\").trim();\n for (; vs.indexOf(\"__\") >= 0;) {\n vs = vs.replace(\"__\", \"_\")\n }\n for (; vs.indexOf(\" \") >= 0;) {\n vs = vs.replace(\" \", \"\")\n }\n return vs.trim().toUpperCase();\n}\n\nconst __numberKey = (str: string): string => {\n return Number.parseInt(str, 10).toString()\n}\n\nconst macroFormatter: Map<string, MacroUnitHelper> = new Map<string, MacroUnitHelper>([\n [codeKey, __codeKey],\n [numberKey, __numberKey],\n [defaultKey, (v: string): string => v],\n]);\n\nconst execMacroFormat = function (value: string, formatter: string): string {\n if (!macroFormatter.has(formatter)) {\n return value;\n }\n return macroFormatter.get(formatter)(value)\n}\n\nconst toCellRow = (rowVals: number[], setup?: number): number[] => {\n if (setup === undefined) {\n setup = 1;\n }\n if (rowVals.length == 2) {\n const values: number[] = [];\n for (let start = rowVals[0]; start <= rowVals[1]; start += setup) {\n values.push(start);\n }\n return values;\n }\n return rowVals;\n}\n\nconst toCellColumn = (columnVals: number[], setup?: number): number[] => {\n return toCellRow(columnVals, setup);\n}\n\n/**\n * 核心宏解析函数\n * 支持:\n * 1. compile:Macro(expr/exprArr, [X], [Y], !formatter)\n * 2. compile:Gen(expr, expr1, ...)\n */\nconst resolveCompileMacroExpr = (ctx: CompileContext, macroExpr: string, macroTokens: RuleToken[], currentCellIndex: number, totalCells: number): string => {\n if (macroTokens === undefined || macroTokens.length <= 0) {\n return macroExpr;\n }\n\n const sheet = ctx.sheet;\n if (sheet === undefined) {\n throw new Error(`miss context worksheet`);\n }\n const m = ctx.getContextMap();\n const argToken = TokenParserManger.getTokenByCtx(m, RuleToken.ArgPosToken);\n const rparenToken = TokenParserManger.getTokenByCtx(m, RuleToken.RparenToken);\n const lparenToken = TokenParserManger.getTokenByCtx(m, RuleToken.LparenToken);\n const genToken = TokenParserManger.getTokenByCtx(m, RuleToken.CompileGenToken);\n const maroToken = TokenParserManger.getTokenByCtx(m, RuleToken.CompileMacroToken);\n const tokenMap: Map<RuleToken, number[]> = new Map<RuleToken, number[]>();\n for (const [index, token] of macroTokens.entries()) {\n let items: number[] = [];\n if (tokenMap.has(token)) {\n items = tokenMap.get(token);\n }\n items.push(index);\n tokenMap.set(token, items);\n }\n const resolveArray = (param: number | number[]): number[] => {\n if (param instanceof Array) {\n return param;\n }\n return [param];\n };\n // 1. 处理 compile:Macro -> gen.expr | gen.exprArr\n // 语法: compile:Macro(type, X_arr, Y_arr, formatter)\n if (tokenMap.has(RuleToken.CompileMacroToken)) {\n let offset: number = 0;\n let exprValue: string = macroExpr;\n const times = tokenMap.get(RuleToken.CompileMacroToken).length;\n for (let i = times; i > 0; i--) {\n const matchIndex: number = exprValue.indexOf(maroToken, offset);\n if (matchIndex < 0) {\n break;\n }\n offset = getExprEnd(exprValue, matchIndex, rparenToken);\n const macroCurrent = exprValue.substring(matchIndex, offset + rparenToken.length);\n const opts: ExtractMacroArgs = {startToken: lparenToken, endToken: rparenToken, argToken};\n // compile:Macro(type, X_arr, Y_arr, formatter)\n let {type, columnParam, rowParam, formatter} = extractMacro(macroCurrent, opts);\n let rowVals: number[];\n let columnVals: number[];\n const parts: string[] = [];\n // 辅助函数:解析参数数组\n if (columnParam !== undefined && rowParam !== undefined) {\n rowVals = resolveArray(rowParam);\n columnVals = resolveArray(columnParam);\n const rowItems = toCellRow(rowVals);\n const columnItems = toCellColumn(columnVals);\n rowItems.forEach(r => {\n columnItems.forEach(c => {\n // 构建坐标引用,如 F:13\n //const cellRef = `${columnNumberToLetter(r)}:${c}`;\n const cellValue = sheet.findCell(r, c);\n if (cellValue === undefined || cellValue.value === null) {\n return;\n }\n const value = cellValue.value;\n parts.push(execMacroFormat(value.toString(), formatter));\n });\n });\n }\n // 处理 exprArr (笛卡尔积展开)\n if (type === exprArr) {\n macroExpr = macroExpr.replace(macroCurrent, parts.join(','))\n } else if (type === exprSingle) {\n // 处理 expr (单一值或索引)\n // 如果是 expr 类型,通常用于取特定值\n macroExpr = macroExpr.replace(macroCurrent, parts[0])\n } else if (type === exprIndex) {\n // 处理 exprIndex == index\n const indexValue = currentCellIndex + 1;\n macroExpr = macroExpr.replace(macroCurrent, indexValue.toString())\n }\n }\n }\n\n // 2. 处理 compile:Gen -> expr,expr1,expr2...\n // 逻辑: 递归解析参数并拼接\n // 语法: compile:Gen(expr1, expr2, ...)\n if (tokenMap.has(RuleToken.CompileGenToken)) {\n let exprValue: string = macroExpr;\n const times = tokenMap.get(RuleToken.CompileGenToken).length;\n for (let i = times; i > 0; i--) {\n const matchIndex: number = exprValue.indexOf(genToken);\n if (matchIndex < 0) {\n break;\n }\n // compile:Gen(expr1, expr2, ...)\n const offset = getExprEnd(exprValue, matchIndex, rparenToken);\n const macroCurrent = exprValue.substring(matchIndex, offset + rparenToken.length);\n // args.join('.')\n exprValue = resolveCompileMacroGen(ctx, macroCurrent, currentCellIndex);\n }\n macroExpr = exprValue;\n }\n\n return macroExpr;\n};\n\nconst loadWorkbook = async function <T extends ArrayBuffer | Buffer | string>(data: T): Promise<exceljs.Workbook> {\n const w = new exceljs.Workbook();\n if (typeof data === \"string\") {\n if (!isBase64(data)) {\n await w.xlsx.readFile(data);\n } else {\n await w.xlsx.load(base64ToArrayBuffer(data));\n }\n } else if (data instanceof Stream) {\n await w.xlsx.read(data);\n } else if (data instanceof ArrayBuffer) {\n await w.xlsx.load(data);\n } else if (data instanceof Buffer) {\n await w.xlsx.load(data as any);\n } else {\n throw new Error(`unSupport buffer type ${typeof data}`);\n }\n return w;\n}\n\nconst scanCellSetPlaceholder = async function <T extends ArrayBuffer | Buffer | string>(\n excelBuffer: T,\n cell: CellPosition & { Sheet: string | number },\n placeholder: PlaceholderCellValue\n): Promise<ArrayBuffer | undefined> {\n const workbook = await loadWorkbook(excelBuffer);\n const worksheet = workbook.getWorksheet(cell.Sheet);\n if (!worksheet) return undefined;\n workSheetSetPlaceholder(worksheet, cell, placeholder)\n return workbook.xlsx.writeBuffer()\n}\n\nconst workSheetSetPlaceholder = function (worksheet: exceljs.Worksheet, cell: CellPosition, placeholder: PlaceholderCellValue): exceljs.Worksheet {\n const colNum = columnLetterToNumber(cell.Row);\n const rowNum = cell.Column;\n const targetCell = worksheet.getCell(rowNum, colNum);\n if (targetCell.isMerged) {\n const range = getMergeRange(worksheet, rowNum, colNum);\n if (range) {\n const leftCol = colNum - 1;\n const values: string[] = [];\n if (leftCol > 0) {\n for (let r = range.top; r <= range.bottom; r++) {\n const val = worksheet.getCell(r, leftCol).value;\n if (val !== null && val !== undefined && val !== \"\") {\n values.push(String(val));\n }\n }\n }\n if (values.length === 0) {\n targetCell.value = placeholder.toString();\n } else {\n targetCell.value = placeholder.mergeCell(values);\n }\n return worksheet;\n }\n }\n const currentValue = targetCell.value;\n if (currentValue === null || currentValue === undefined || currentValue === \"\") {\n targetCell.value = placeholder.toString();\n }\n return worksheet;\n}\n\nconst compileCellTokens: RuleToken[] = [RuleToken.CellToken, RuleToken.MergeCellToken, RuleToken.RowCellToken];\nconst ruleTokens: RuleToken[] = [RuleToken.AliasToken, RuleToken.CellToken, RuleToken.MergeCellToken, RuleToken.RowCellToken];\n\nconst isRuleToken = function (t: RuleToken): boolean {\n return ruleTokens.includes(t)\n}\n\nconst mergeOption = function (ruleKeyMap: Map<RuleToken, string>, defaultRuleTokenMap: Map<RuleToken, string>): Map<RuleToken, string> {\n for (const [key, value] of defaultRuleTokenMap.entries()) {\n if (!ruleKeyMap.has(key)) {\n ruleKeyMap.set(key, value)\n }\n }\n return ruleKeyMap;\n}\n\nconst getTokenParser = function (token: RuleToken): TokenParseResolver {\n if (!defaultRuleTokenParserMap.has(token)) {\n return {\n exists: false,\n }\n }\n return {\n exists: true,\n handler: defaultRuleTokenParserMap.get(token),\n }\n}\n\nconst registerTokenParser = function (token: RuleToken, h: TokenParser): boolean {\n if (defaultRuleTokenParserMap.has(token)) {\n return false;\n }\n defaultRuleTokenParserMap.set(token, h)\n return true;\n}\n\nconst registerTokenParserMust = function (token: RuleToken, h: TokenParser): void {\n defaultRuleTokenParserMap.set(token, h)\n}\n\nconst scanWorkSheetRules = function (worksheet: exceljs.Worksheet, options: RuleOptions): RuleResult {\n const result = {rules: options.getContextMap()};\n // row\n for (let r = options.startLine; r <= options.endLine; r++) {\n let emptyValue = false;\n let ruleToken = RuleToken.UndefinedToken;\n // column\n for (let c = options.startColumn; c <= options.endColumn; c++) {\n const cell = worksheet.findCell(r, c);\n if (cell === undefined || cell.value === undefined || cell.value === null) {\n continue;\n }\n const cellValue = cell.value;\n const value = cellValue.toString();\n let isStartCell = c === options.startColumn;\n if (emptyValue && ruleToken === RuleToken.UndefinedToken) {\n isStartCell = true;\n }\n if (value === \"\" && isStartCell) {\n emptyValue = true;\n continue;\n }\n if (isStartCell) {\n ruleToken = options.parseToken(value);\n continue;\n } else {\n if (!isRuleToken(ruleToken)) {\n break;\n }\n emptyValue = false;\n }\n const {handler, exists} = getTokenParser(ruleToken);\n if (!exists) {\n continue;\n }\n let values: RuleValue[] = [];\n if (result.rules.has(ruleToken)) {\n values = result.rules.get(ruleToken);\n }\n const {expr, ok} = handler(result.rules, ruleToken, value);\n if (ok && expr !== undefined) {\n values.push(expr);\n }\n result.rules.set(ruleToken, values);\n }\n }\n return result;\n}\n\nconst parseWorkSheetRules = function (worksheet: exceljs.Worksheet, options?: RuleOptions): RuleResult {\n const result: RuleResult = {rules: new Map<RuleToken, RuleValue[]>()};\n if (worksheet === undefined || worksheet === null) {\n return result;\n }\n if (options === undefined) {\n options = new RuleMapOptions();\n }\n return scanWorkSheetRules(worksheet, options.parseDefault(worksheet));\n}\n\nconst compileCheck = function (iv: RuleResult, ctx: RuleOptions): Error[] | undefined {\n if (iv.rules.size <= 0) {\n return undefined;\n }\n const errs: Error[] = [];\n // alias configuration check\n const values = iv.rules.get(RuleToken.AliasToken);\n if (values !== undefined && values.length > 0) {\n const set = new Set<string>();\n for (const [idx, value] of values.entries()) {\n if (idx === 0) {\n set.add(value.key);\n continue\n }\n if (set.has(value.key)) {\n errs.push(Error(`Duplicate alias(${value.key},${value.express}) configuration`));\n }\n }\n }\n // custom compile checker\n const handlers = ctx.getCompileCheckHandlers();\n if (handlers !== undefined && handlers.length > 0) {\n for (const h of handlers) {\n let err = h(iv, ctx);\n if (err !== undefined && err.length > 0) {\n errs.push(...err);\n }\n }\n }\n if (errs.length > 0) {\n return errs;\n }\n return undefined;\n}\n\nconst getMacroTokens = function (expr: RuleValue): RuleToken[] {\n const tokens: RuleToken[] = [];\n for (const token of expr.tokens) {\n if (macroTokens.includes(token)) {\n tokens.push(token);\n }\n }\n return tokens;\n}\n\nconst toRowCells = function (cells: CellPoint[]): CellPoint[][] {\n const indexes: number[] = [];\n const rows: CellPoint[][] = [];\n const rowMap: Map<number, CellPoint[]> = new Map<number, CellPoint[]>();\n for (const cell of cells) {\n let cells: CellPoint[] = [];\n if (rowMap.has(cell.Row)) {\n cells = rowMap.get(cell.Row);\n } else {\n indexes.push(cell.Row);\n }\n cells.push(cell);\n rowMap.set(cell.Row, cells);\n }\n indexes.sort((a, b) => a - b);\n for (const row of indexes) {\n const values = rowMap.get(row);\n rows.push(values);\n }\n return rows;\n}\n\nconst resolveFunctionExpr = (ctx: CompileContext, templateValue: string, expr: RuleValue): string => {\n const anyToken = defaultRuleTokenMap.get(RuleToken.AnyToken);\n const funToken = defaultRuleTokenMap.get(RuleToken.FunctionPatternToken);\n const functionTokens = expr.tokens.filter(s => s === RuleToken.FunctionPatternToken);\n if (functionTokens === undefined || functionTokens.length <= 0) {\n return templateValue;\n }\n const [start, end] = funToken.split(anyToken);\n for (let times = functionTokens.length; times > 0; times--) {\n const index = templateValue.indexOf(start);\n const offset = templateValue.indexOf(end);\n if (offset > 0 && index >= 0) {\n templateValue = templateValue.replace(start, funcCommand).replace(end, \"\");\n }\n }\n return templateValue;\n}\n\nconst searchIndexOf = (str: string, substr: string[], position?: number): number => {\n let index: number = NaN;\n for (let sub of substr) {\n if (position === undefined || position === null) {\n index = str.indexOf(sub);\n } else {\n index = str.indexOf(sub, position);\n }\n if (!isNaN(index) && index >= 0) {\n return index;\n }\n }\n return -1;\n}\n\nconst resolveAliasExpr = (ctx: CompileContext, templateValue: string, index: number): string => {\n const expr = ctx.currentExpr as RuleValue;\n if (expr === undefined) {\n throw new Error(`miss context expr value`);\n }\n let compileValue = templateValue;\n const aliasToken = defaultRuleTokenMap.get(RuleToken.UseAliasToken);\n let aliasTokens = expr.tokens.filter(s => s === RuleToken.UseAliasToken);\n if (aliasTokens.length <= 0) {\n const num = templateValue.split(aliasToken).length - 1;\n if (num > 0) {\n aliasTokens = new Array(num).fill(aliasToken);\n }\n }\n if ((aliasTokens !== undefined && aliasTokens.length > 0)) {\n for (let i = 0; i < aliasTokens.length; ++i) {\n const token = aliasToken;\n const start = compileValue.indexOf(token);\n if (start < 0) {\n break;\n }\n const offset = aliasTokens[i].length;\n let end = searchIndexOf(compileValue, [',', '.', ')', ']'], start);\n if (end < 0) {\n end = compileValue.length\n }\n const sv = compileValue.substring(start + offset, end);\n const pl = `${token}${sv}`;\n const value = ctx.getAlias(sv);\n if (value !== undefined) {\n if (compileValue === pl) {\n compileValue = value;\n } else {\n compileValue = compileValue.replace(`${pl}`, value);\n }\n }\n }\n }\n return compileValue;\n}\n\nconst resolveValueExpr = (ctx: CompileContext, templateValue: string): string | null => {\n const expr: RuleValue = ctx.currentExpr;\n if (expr === undefined || expr.tokens.length <= 0) {\n return templateValue;\n }\n const m = ctx.getContextMap();\n const token = TokenParserManger.getTokenByCtx(m, RuleToken.VarPatternToken);\n const anyToken = TokenParserManger.getTokenByCtx(m, RuleToken.AnyToken);\n const [start, end] = token.split(anyToken);\n if (!templateValue.startsWith(start)) {\n templateValue = `${start}${templateValue}`\n }\n if (!templateValue.endsWith(end)) {\n templateValue = `${templateValue}${end}`\n }\n return templateValue;\n}\n\nconst compileRowCells = function (ctx: CompileContext, expr: RuleValue, cellPoints: CellPoint[], rowIndex: number, errs: Error[]) {\n if (ctx.sheet === undefined) {\n errs.push(new Error(`ctx miss worksheet`));\n return;\n }\n ctx.currentExpr = expr;\n cellPoints.forEach((cellPoint, index) => {\n const r = cellPoint.Row;\n const sheet = ctx.sheet;\n const c = cellPoint.Column;\n // 我们的解析逻辑中 X 已经转换为数字索引\n const cell = sheet.findCell(r, c);\n if (cell === undefined ||\n (cell.value !== undefined && cell.value !== null && cell.value !== \"\")) {\n return;\n }\n // 获取表达式模板\n let templateValue = String(expr.value);\n // 步骤 1: 解析宏指令\n // 提取所有 compile: 开头的指令\n const macroTokens = getMacroTokens(expr);\n // 递归替换宏\n templateValue = resolveFunctionExpr(ctx, templateValue, expr); // <?>\n templateValue = resolveCompileMacroExpr(ctx, templateValue, macroTokens, index, cellPoints.length); // compile:Macro,compile:Gen\n templateValue = resolveAliasExpr(ctx, templateValue, index); // @\n // 写入单元格\n cell.value = resolveValueExpr(ctx, templateValue);\n })\n\n}\n\nconst generateWorkSheetCellsPlaceholder = function (ctx: CompileContext, expr: RuleValue, sheet: exceljs.Worksheet): Error[] | undefined {\n const errs: Error[] = [];\n const posExpr: RuleValue = expr.posExpr;\n let cellsItems = expr.cells;\n if ((cellsItems === undefined || cellsItems.length <= 0) &&\n posExpr !== undefined &&\n posExpr.value !== undefined) {\n const r = posExpr.value as RangeCell;\n if (r !== undefined) {\n cellsItems = r.getCells();\n }\n }\n if (!cellsItems || cellsItems.length === 0) {\n return undefined;\n }\n ctx.sheet = sheet;\n const cells = cellsItems;\n // 遍历目标单元格\n toRowCells(cells).forEach((cellPoints, index) => compileRowCells(ctx, expr, cellPoints, index, errs));\n return errs.length > 0 ? errs : undefined;\n};\n\nconst hasGeneratorToken = function (tokens: RuleToken[]): boolean {\n for (const t of tokens) {\n if (compileCellTokens.includes(t)) {\n return true;\n }\n }\n return false;\n}\n\nconst compileWorkSheetPlaceholder = function (ctx: CompileContext, sheet: exceljs.Worksheet, result: RuleResult): Error[] | undefined {\n // check need compile sheet setting\n if (ctx.compileSheets !== undefined && ctx.compileSheets.length > 0 && !ctx.compileSheets.includes(sheet.name)) {\n return undefined;\n }\n const errs: Error[] = [];\n for (const [token, express] of result.rules.entries()) {\n if (!isRuleToken(token)) {\n continue\n }\n // expr generat worksheet cells\n for (const expr of express) {\n if (expr.tokens.length <= 0 || !hasGeneratorToken(expr.tokens)) {\n continue;\n }\n let err = generateWorkSheetCellsPlaceholder(ctx, expr, sheet);\n if (err !== undefined && err.length > 0) {\n errs.push(...err);\n }\n }\n }\n if (errs.length > 0) {\n return errs;\n }\n return undefined;\n}\n\ntype CompileResult = {\n workbook: exceljs.Workbook\n configure?: RuleResult\n errs?: Error[]\n}\n\nconst compile = async function <T extends ArrayBuffer | Buffer | string>(\n data: T,\n ruleSheetName: string | number,\n options?: RuleOptions): Promise<CompileResult> {\n const workbook = await loadWorkbook(data);\n const sheet = workbook.getWorksheet(ruleSheetName);\n if (sheet === undefined) {\n return {\n workbook,\n errs: [new Error(`compile error, ${ruleSheetName} not exists!`)],\n };\n }\n if (workbook.worksheets === undefined) {\n return {\n workbook,\n errs: [new Error(`worksheet, ${ruleSheetName} not exists!`)],\n };\n }\n if (options === undefined) {\n const excludes = [ruleSheetName as string];\n options = RuleMapOptions.withAllSheets(workbook, excludes);\n }\n // parse rules\n const result = parseWorkSheetRules(sheet, options);\n const errs = compileCheck(result, options);\n if (errs !== undefined) {\n return {\n errs,\n workbook,\n configure: result,\n };\n }\n // compile\n const compileErrs: Error[] = [];\n const ctx = CompileContext.create(options).loadAlias(result.rules);\n for (const [i, w] of workbook.worksheets.entries()) {\n if (w.name === ruleSheetName ||\n i === ruleSheetName ||\n !ctx.filterSheet(w.name)) {\n continue;\n }\n\n let err = compileWorkSheetPlaceholder(ctx, w, result);\n if (err !== undefined && err.length > 0) {\n compileErrs.push(...err);\n }\n }\n if (compileErrs.length > 0) {\n return {\n workbook,\n configure: result,\n errs: compileErrs,\n };\n }\n return {\n workbook,\n configure: result,\n };\n}\n\nconst compileWorkSheet = async function <T extends ArrayBuffer | Buffer | string>(\n data: T,\n sheetName: string | number,\n options?: RuleOptions): Promise<exceljs.Xlsx | Error[]> {\n const reply = await compile(data, sheetName, options);\n if (reply.errs !== undefined && reply.errs.length > 0) {\n return reply.errs;\n }\n return reply.workbook.xlsx;\n}\n\nconst fetchAlias = (m: Map<RuleToken, RuleValue[]> | RuleResult): Map<string, string> => {\n let sv: Map<RuleToken, RuleValue[]>;\n const alias = new Map<string, string>();\n if (!(m instanceof Map) && m.rules !== undefined) {\n sv = m.rules;\n } else if (m instanceof Map) {\n if (m.size <= 0 || !m.has(RuleToken.AliasToken)) {\n return alias;\n }\n sv = m;\n } else {\n return alias;\n }\n const values = sv.get(RuleToken.AliasToken);\n for (const vs of values) {\n if (typeof vs.value === \"string\") {\n alias.set(vs.key, vs.value as string);\n }\n }\n return alias;\n}\n\nconst removeUnExportSheets = (w: exceljs.Workbook, options: RuleOptions): exceljs.Workbook => {\n const removes: string[] = [];\n if (options.compileSheets === undefined || options.compileSheets.length <= 0) {\n for (const [i, v] of w.worksheets.entries()) {\n const sheetName = v.name;\n if (sheetName.endsWith(\".config\") ||\n sheetName.endsWith(\".json\")) {\n removes.push(sheetName);\n }\n }\n } else {\n for (const [i, v] of w.worksheets.entries()) {\n if (!options.compileSheets.includes(v.name)) {\n removes.push(v.name);\n }\n }\n }\n for (const [_,name] of removes.entries()) {\n w.removeWorksheet(name)\n }\n return w;\n}\n\nconst toBuffer = async (w: exceljs.Workbook): Promise<Buffer> => {\n const arrayBuffer = await w.xlsx.writeBuffer()\n return Buffer.from(arrayBuffer);\n}\n\nclass ExprResolver {\n static toBuffer = toBuffer;\n static compile = compile;\n static toRowCells = toRowCells;\n static fetchAlias = fetchAlias;\n static getExprEnd = getExprEnd;\n static compileCheck = compileCheck;\n static extractMacro = extractMacro;\n static compileRowCells = compileRowCells;\n static searchIndexOf = searchIndexOf;\n static resolveAliasExpr = resolveAliasExpr;\n static resolveValueExpr = resolveValueExpr;\n static resolveFunctionExpr = resolveFunctionExpr;\n static removeUnExportSheets = removeUnExportSheets;\n static resolveCompileMacroGen = resolveCompileMacroGen;\n static resolveCompileMacroExpr = resolveCompileMacroExpr;\n}\n\nexport {\n CellPosition,\n CompileResult,\n DefaultPlaceholderCellValue,\n PlaceholderCellValue,\n exceljs,\n RuleToken,\n RuleMapOptions,\n TokenParserManger,\n RuleResult,\n RuleOptions,\n CompileContext,\n FilterMacroResult,\n MacroUnitHelper,\n MacroArgs,\n ExtractMacroArgs,\n ExprResolver,\n scanCellSetPlaceholder,\n workSheetSetPlaceholder,\n parseWorkSheetRules,\n columnLetterToNumber,\n columnNumberToLetter,\n isRuleToken,\n hasGeneratorToken,\n getTokenParser,\n registerTokenParser,\n registerTokenParserMust,\n compileWorkSheet,\n compileWorkSheetPlaceholder,\n loadWorkbook,\n};","import JsZip, {OutputType} from \"jszip\";\nimport {\n Placeholder,\n Workbook,\n FullOptions,\n OutputByType,\n defaultValueDotGet,\n valueDotGet,\n QueryFunction,\n} from \"./core\";\nimport {ExprResolver, RuleOptions, RuleResult} from \"./helper\";\n\ntype Argument = {\n root: string;\n alias?: string;\n groups?: string[];\n suffix?: string;\n default: number | string | any;\n func: string;\n p: Placeholder;\n}\n\ntype CmdFunction = (\n obj: Object | Record<string, any>,\n argument: Argument,\n) => any | undefined;\n\ninterface HasToString {\n toString(): string;\n}\n\nfunction hasToString(obj: any): obj is HasToString {\n return obj != null && typeof obj.toString === 'function';\n}\n\nconst tokenNextIter = [`root`, `groups`, `suffix`, `default`];\n\nconst aliasKey = `__alias`;\n\nclass ArgumentData {\n root: string;\n p: Placeholder;\n default: number | string | any = '';\n alias?: string;\n suffix?: string;\n groups?: string[] = [];\n tokenIterIndex: number = 0;\n private readonly func: string;\n\n constructor(fn: string, p: Placeholder) {\n this.p = p;\n this.func = fn;\n this.groups = [];\n }\n\n To(): Argument {\n return {\n p: this.p,\n root: this.root,\n alias: this.alias,\n groups: this.groups,\n suffix: this.suffix,\n default: this.default,\n func: this.func,\n };\n }\n\n Add(startToken: string, value: string | undefined) {\n if (value === undefined) {\n this.tokenIterIndex++;\n return;\n }\n switch (startToken) {\n case `(`:\n if (tokenNextIter[this.tokenIterIndex] === \"root\") {\n this.root = value;\n this.tokenIterIndex++;\n }\n break;\n case `[`:\n if (tokenNextIter[this.tokenIterIndex] === \"groups\") {\n this.groups.push(value)\n }\n break;\n case `]`:\n if (tokenNextIter[this.tokenIterIndex] === \"groups\") {\n this.groups.push(value);\n }\n break;\n case `,`:\n const token = tokenNextIter[this.tokenIterIndex];\n if (token === \"root\") {\n this.root = value;\n this.tokenIterIndex++;\n } else if (token === \"groups\") {\n this.groups.push(value);\n } else if (token === \"suffix\") {\n this.suffix = value;\n this.tokenIterIndex++;\n } else if (token === \"default\") {\n this.default = value;\n this.tokenIterIndex++;\n }\n break;\n case `)`:\n this.tokenIterIndex++;\n break;\n }\n }\n\n ParseAlias(alias: any | object | Record<string, string>) {\n if (alias === undefined || this.root === undefined || this.root === \"\") {\n return;\n }\n const value = valueDotGet(alias, this.root);\n if (value === undefined || typeof value !== \"string\" || !hasToString(value)) {\n return;\n }\n this.alias = this.root;\n this.root = value as string;\n }\n}\n\nclass ArgumentValue {\n private readonly value: any;\n private readonly defaultValue: any;\n\n constructor(value: any, defValue: any) {\n this.value = value;\n this.defaultValue = defValue;\n }\n\n isUndefined(): boolean {\n return this.value === undefined;\n }\n\n getDefault(): any {\n return this.defaultValue;\n }\n\n getNumber(): number {\n return Number(this.value);\n }\n\n toString(): string {\n if (this.isUndefined()) {\n return \"\";\n }\n if (typeof this.value === \"string\") {\n return this.value as string;\n }\n if (hasToString(this.value)) {\n return this.value.toString();\n }\n return \"\";\n }\n}\n\nconst ArgumentValueLoader = (values: Object | Record<string, any>, args: Argument): ArgumentValue[] => {\n let all: string[] = [];\n for (let v of args.groups) {\n let key = `${args.root}.${v}`;\n if (args.suffix !== undefined && args.suffix !== \"\") {\n key = `${key}.${args.suffix}`\n }\n all.push(key);\n }\n if (all.length <= 0) {\n return args.default || '';\n }\n const items: ArgumentValue[] = [];\n for (let k of all) {\n let vs = valueDotGet(values, k);\n items.push(new ArgumentValue(vs, args.default));\n }\n return items;\n}\n\n// ${fn:sum(#,[C308,C342,C321,C3016,C309_C409],1,0)}\nconst sum_all: CmdFunction = (values: Object | Record<string, any>, argument: Argument,): any | undefined => {\n let sum: number = NaN;\n let emptyTimes = 0;\n let argc = argument.groups.length;\n let items = ArgumentValueLoader(values, argument);\n for (let value of items) {\n let num = value.getNumber();\n if (value.isUndefined()) {\n emptyTimes++;\n num = Number(argument.default);\n }\n if (isNaN(sum)) {\n sum = num;\n } else {\n sum = sum + Number(num);\n }\n }\n if (emptyTimes === argc) {\n return undefined;\n }\n if (isNaN(sum)) {\n throw new Error(`parse ${argument.p.name} NaN error`);\n }\n return sum;\n}\n\n// ${fn:sub(#,[C308,C342,C321,C3016,C309_C409],1,0)}\nconst sub_value: CmdFunction = (values: Object | Record<string, any>, argument: Argument,): any | undefined => {\n let sub: number = NaN;\n let emptyTimes = 0;\n let argc = argument.groups.length;\n let items = ArgumentValueLoader(values, argument);\n for (let value of items) {\n let num = value.getNumber();\n if (value.isUndefined()) {\n emptyTimes++;\n num = Number(argument.default);\n }\n if (isNaN(num)) {\n continue;\n }\n if (isNaN(sub)) {\n sub = num;\n } else {\n sub = sub - Number(num);\n }\n }\n if (emptyTimes === argc) {\n return undefined;\n }\n if (isNaN(sub)) {\n throw new Error(`parse ${argument.p.name} NaN error`);\n }\n return sub;\n}\n\nconst defaultCommands = new Map<string, CmdFunction>([\n [\"sum\", sum_all],\n [\"sub\", sub_value],\n]);\n\nconst resolveFunc = function (value: string): string {\n if (value.indexOf(\"(\") > 0 && value.endsWith(\")\")) {\n const names = value.split(\"(\")\n return names[0]\n }\n return \"\"\n}\n\nconst resolveArgument = function (p: Placeholder, data: object | Record<string, any>): Argument {\n const value = p.name;\n const fn = resolveFunc(value);\n const args = new ArgumentData(fn, p);\n if (fn !== \"\") {\n let key: string = \"\";\n let startT: string = \"\";\n const endToken = [`)`, `,`, `]`];\n const startToken = [`(`, `,`, `[`];\n const tokenRow = value.split(`${fn}`)[1]\n const len = tokenRow.length;\n for (let i = 0; i < len; i++) {\n let start = startToken.includes(tokenRow[i]);\n let end = endToken.includes(tokenRow[i]);\n if (start) {\n startT = tokenRow[i];\n }\n if (startT !== \"\" && tokenRow[i] !== startT && !end) {\n key = `${key}${tokenRow[i]}`;\n }\n if (end) {\n if (key === \"\") {\n args.Add(startT, undefined);\n } else {\n args.Add(startT, key);\n key = \"\";\n }\n }\n }\n }\n const alias = valueDotGet(data, aliasKey);\n if (alias !== undefined) {\n args.ParseAlias(alias)\n }\n return args.To();\n}\n\nconst commandExtendQuery: QueryFunction = function (values: object | Record<string, any>, p: Placeholder): any | undefined {\n if (p.type !== \"fn\") {\n return defaultValueDotGet(values, p)\n }\n const argument = resolveArgument(p, values);\n if (argument.func !== \"\" && defaultCommands.has(argument.func)) {\n return defaultCommands.get(argument.func)(values, argument)\n }\n return defaultValueDotGet(values, p)\n}\n\n/**\n * 安全添加扩展函数支持\n * @param key\n * @param h\n * @constructor\n */\nconst AddCommand = (key: string, h: CmdFunction): boolean => {\n if (defaultCommands.has(key)) {\n return false;\n }\n defaultCommands.set(key, h);\n return true;\n}\n\n/**\n * 强制添加扩展函数支持\n * @param key\n * @param h\n * @constructor\n */\nconst AddCommandMust = (key: string, h: CmdFunction): void => {\n defaultCommands.set(key, h);\n}\n\n// xlsx 模板 生成 - 函数一键调用\nconst generateCommandsXlsxTemplate = async function <T extends JsZip.OutputType>(data: Buffer, values: Object, options?: JsZip.JSZipGeneratorOptions<T> & FullOptions): Promise<OutputByType[T]> {\n const w = await Workbook.parse(data, options);\n w.setQueryFunctionHandler(commandExtendQuery);\n await w.substituteAll(values);\n return w.generate(options);\n}\n\nconst getCommands = (): Map<string, CmdFunction> => {\n return defaultCommands;\n}\n\ntype AutoOptions = RuleOptions & {sheetName?:string};\n\nconst compileRuleSheetName = \"export_metadata.config\";\n\nconst mergeMap = function (source: Map<string, string>, dest: Map<string, string>): Map<string, string> {\n for (const [key, value] of dest.entries()) {\n source.set(key, value)\n }\n return source;\n}\n\nconst autoRegisterAlias = function (values: Object,configure: RuleResult): Object {\n let alias = ExprResolver.fetchAlias(configure);\n if (values[aliasKey] !== undefined && values[aliasKey] instanceof Map) {\n alias = mergeMap(alias, values[aliasKey] as Map<string, string>);\n }\n values[aliasKey] = alias;\n return values;\n}\n\n// xlsx 模板 编译生成 - 函数一键调用\nconst generateCommandsXlsxTemplateWithCompile = async function <T extends JsZip.OutputType>(data: Buffer, values: Object, compileOptions: AutoOptions, options?: JsZip.JSZipGeneratorOptions<T> & FullOptions): Promise<OutputByType[T]> {\n if (compileOptions.sheetName === undefined || compileOptions.sheetName === \"\") {\n compileOptions.sheetName = compileRuleSheetName;\n }\n const result = await ExprResolver.compile(data, compileOptions.sheetName,compileOptions);\n if (result.errs !== undefined && result.errs.length > 0) {\n throw result.errs[0];\n }\n values = autoRegisterAlias(values,result.configure);\n result.workbook = ExprResolver.removeUnExportSheets(result.workbook, compileOptions);\n const wb = await ExprResolver.toBuffer(result.workbook);\n const w = await Workbook.parse(wb, options);\n w.setQueryFunctionHandler(commandExtendQuery);\n await w.substituteAll(values);\n return w.generate(options);\n}\n\nexport {\n mergeMap,\n autoRegisterAlias,\n commandExtendQuery,\n getCommands,\n resolveArgument,\n ArgumentValue,\n CmdFunction,\n Argument,\n ArgumentData,\n AutoOptions,\n compileRuleSheetName,\n AddCommand,\n AddCommandMust,\n ArgumentValueLoader,\n generateCommandsXlsxTemplate,\n generateCommandsXlsxTemplateWithCompile,\n}"],"mappings":"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","names":["BufferType","path","match","ElementTree","drawingElement","fromRow","nbRow","RuleToken","join","macroTokens","defaultRuleTokenMap","cells"]}
1
+ {"version":3,"sources":["../src/core.ts","../src/helper.ts","../src/extends.ts"],"sourcesContent":["import * as path from 'path';\nimport * as fs from 'fs';\nimport * as etree from 'elementtree';\nimport {Element} from 'elementtree';\nimport JsZip from \"jszip\";\nimport * as console from \"node:console\";\nimport {imageSize as sizeOf} from 'image-size';\nimport {isMap} from \"node:util/types\";\n\n// ==================== 常量定义 ====================\nconst DOCUMENT_RELATIONSHIP = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\";\nconst CALC_CHAIN_RELATIONSHIP = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/calcChain\";\nconst SHARED_STRINGS_RELATIONSHIP = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings\";\nconst HYPERLINK_RELATIONSHIP = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink\";\n\n// ==================== 类型定义 ====================\n/** 占位符信息 */\ninterface Placeholder {\n /** 完整占位符字符串,如 ${name} 或 ${table:items.key} */\n placeholder: string;\n /** 类型:normal, table, image, imageincell,fn 或自定义类型 */\n type: string;\n /** 变量名 */\n name: string;\n /** 对象属性键(table 类型时使用) */\n key?: string;\n /** 子类型(如 image) */\n subType?: string;\n /** 是否是字符串的全部内容 */\n full: boolean;\n\n /** 自定义属性,用于扩展 */\n [customKey: string]: any;\n}\n\n/** 单元格引用 */\ninterface Ref {\n table?: string | null;\n colAbsolute?: boolean;\n col: string;\n rowAbsolute?: boolean;\n row: number;\n}\n\n/** 范围 */\ninterface Range {\n start: string;\n end: string;\n}\n\n/** 工作表信息 */\ninterface SheetInfo {\n id: number;\n name: string;\n filename: string;\n root?: etree.Element;\n}\n\ninterface SheetInfoMust {\n id: number;\n name: string;\n filename: string;\n root: etree.Element;\n}\n\n/** 绘图信息 */\ninterface DrawingInfo {\n filename: string;\n root: any;\n relFilename?: string;\n relRoot?: any;\n}\n\n/** 表格信息 */\ninterface TableInfo {\n filename: string;\n root: any;\n}\n\n/** 关系文件信息 */\ninterface RelsInfo {\n filename: string;\n root: any;\n}\n\n/** 基础工作簿选项 */\ninterface WorkbookOptions {\n moveImages?: boolean;\n substituteAllTableRow?: boolean;\n moveSameLineImages?: boolean;\n imageRatio?: number;\n pushDownPageBreakOnTableSubstitution?: boolean;\n imageRootPath?: string | null;\n handleImageError?: ((imageObj: any, error: Error) => void) | null;\n}\n\n/** 生成选项 */\ntype OutputByType = {\n readonly base64: string;\n readonly string: string;\n readonly text: string;\n readonly binarystring: string;\n readonly array: readonly number[];\n readonly uint8array: Uint8Array;\n readonly arraybuffer: ArrayBuffer;\n readonly blob: Blob;\n readonly nodebuffer: Buffer;\n};\n\n// ==================== 扩展类型定义 ====================\n/**\n * 自定义替换函数类型\n * @param cell - XML 单元格元素\n * @param stringValue - 当前字符串值\n * @param placeholder - 解析出的占位符信息\n * @param substitution - 替换值\n * @returns 返回替换后的字符串,或 undefined/null 表示不处理(交给下一个替换器)\n */\ntype CustomReplacer = (\n cell: any,\n stringValue: string,\n placeholder: Placeholder,\n substitution: any\n) => string | undefined | null;\n/**\n * 自定义占位符提取函数类型\n * @param inputString - 输入字符串\n * @returns 解析出的占位符数组\n */\ntype CustomPlaceholderExtractor = (\n inputString: string,\n options: ExtensionOptions,\n) => Placeholder[];\n\n// 输出Buffer 类型\nenum BufferType {\n Base64 = \"base64\",\n String = \"string\",\n Text = \"text\",\n Blob = \"blob\",\n Array = \"array\",\n NodeBuffer = \"nodebuffer\",\n Uint8array = \"uint8array\",\n Arraybuffer = \"arraybuffer\",\n BinaryString = \"binarystring\",\n}\n\n/**\n * 替换前钩子函数类型\n * @param stringValue - 原始字符串\n * @param substitutions - 替换数据对象\n * @returns 返回修改后的字符串或 undefined(不修改)\n */\ntype BeforeReplaceHook = (\n stringValue: string,\n substitutions: Record<string, any>\n) => string | undefined | null;\n\n/**\n * 替换后钩子函数类型\n * @param resultString - 替换后的字符串\n * @param stringValue - 原始字符串\n * @param substitutions - 替换数据对象\n * @returns 返回最终字符串\n */\ntype AfterReplaceHook = (\n resultString: string,\n stringValue: string,\n substitutions: Record<string, any>\n) => string;\n\n/**\n * 自定义值格式化函数类型\n * @param value - 原始值\n * @param placeholder - 占位符信息\n * @param key - 可选的键名\n * @returns 格式化后的字符串\n */\ntype CustomFormatter = (\n value: any,\n placeholder: Placeholder,\n key?: string\n) => string | undefined | null;\n\n/**\n * 自定义数据查询函数类型\n * @param obj - 数据对象\n * @param p - 占位符\n * @returns 返回对应键key值或者undefined\n */\ntype QueryFunction = (\n obj: Object | Record<string, any>,\n p: Placeholder,\n) => any | undefined;\n\n/** 扩展配置接口 */\ninterface ExtensionOptions {\n /**\n * 自定义替换函数,在默认替换逻辑之前调用\n * 返回非空值则使用返回值,否则走默认逻辑\n */\n customReplacer?: CustomReplacer;\n /**\n * 自定义占位符提取函数\n * 如果提供,将完全替代默认的 extractPlaceholders\n */\n customPlaceholderExtractor?: CustomPlaceholderExtractor;\n /**\n * 额外的替换函数列表,按顺序尝试\n * 每个函数返回非空值则停止后续处理\n */\n replacers?: CustomReplacer[];\n /**\n * 替换前钩子,在所有替换开始前调用\n */\n beforeReplace?: BeforeReplaceHook;\n /**\n * 替换后钩子,在所有替换完成后调用\n */\n afterReplace?: AfterReplaceHook;\n /**\n * 自定义值格式化函数列表\n * 按顺序尝试,返回非空值则使用\n */\n formatters?: CustomFormatter[];\n /**\n * 自定义模板正则表达式\n * 用于替代默认的占位符匹配模式\n */\n customPlaceholderRegex?: RegExp;\n /**\n * 是否启用默认占位符解析(当使用 customPlaceholderRegex 时)\n * 默认为 true\n */\n enableDefaultParsing?: boolean;\n\n /**\n * 设置自定义数据查询处理器\n * 默认为 undefined\n */\n customQueryFunction?: QueryFunction;\n}\n\n/** 完整选项类型 */\ntype FullOptions = WorkbookOptions & ExtensionOptions;\n\n// ==================== 辅助函数 ====================\n/*function _get_simple(obj: any, keys: string): any {\n if (keys.indexOf(\"[\") >= 0) {\n const specification = keys.split(/[[[\\]]/);\n const property = specification[0];\n const index = specification[1];\n return obj[property][index];\n }\n return obj[keys];\n}*/\n\n/*function valueDotGet<T extends OutputValue = OutputValue>(obj: any|object|Record<string, any>, keys: string, defaultValue?: ValuerType[T]): ValuerType[T] {\n const arr = keys.split('.');\n try {\n while (arr.length) {\n obj = _get_simple(obj, arr.shift()!);\n }\n } catch (ex) {\n obj = undefined;\n }\n return obj === undefined ? defaultValue : obj;\n}*/\n\nfunction _getSimple(obj: any|object|Record<string, any>|Record<string, string>, key: string): any {\n if (key.includes(\"[\")) {\n // 修正正则:匹配 [ 和 ] 并进行拆分\n // 例如:'list[0]' -> ['list', '0', '']\n const parts = key.split(/[\\[\\]]/);\n const property = parts[0];\n const index = parts[1];\n if (property && index !== undefined) {\n return obj?.[property]?.[index];\n }\n }\n if(isMap(obj)){\n return obj.get(key)\n }\n return obj?.[key];\n}\n\ntype PathImpl<T, Key extends string> =\n T extends object\n ? Key extends `${infer K}.${infer Rest}`\n ? K extends keyof T\n ? PathImpl<T[K], Rest>\n : never\n : Key extends keyof T\n ? T[Key]\n : never\n : any;\n\ntype PathType<T, Key extends string> = string extends Key ? any : PathImpl<T, Key>;\n\n/**\n * 基于路径从对象中获取值\n * 模拟 lodash 的 get 方法\n */\nfunction valueDotGet<T extends Record<string, any> & object, P extends string>(\n obj: T,\n path: P,\n defaultValue?: PathType<T, P>\n): PathType<T, P> {\n if (!path || !obj) return defaultValue as PathType<T, P>;\n const keys = path.split('.');\n let current: any = obj;\n for (const key of keys) {\n if (current === null || current === undefined) return defaultValue as PathType<T, P>;\n current = _getSimple(current, key);\n }\n return current === undefined ? defaultValue as PathType<T, P> : current;\n}\n\n/**\n * 基于路径从对象中获取值,默认方法\n * 模拟 lodash 的 get 方法\n */\nfunction defaultValueDotGet<T extends Record<string, any> & object>(obj: T, p: Placeholder): PathType<T, string> {\n return valueDotGet(obj, p.name, p.default || '');\n}\n\n// ==================== 内置格式化器 ====================\n/** 日期格式化器 */\nconst dateFormatter: CustomFormatter = (value: any, _placeholder: Placeholder, _key?: string): string | undefined => {\n if (value instanceof Date) {\n // Excel 中日期是从 1900/01/01 开始的天数\n return Number((value.getTime() / (1000 * 60 * 60 * 24)) + 25569).toString();\n }\n return undefined;\n};\n\n/** 数字格式化器 */\nconst numberFormatter: CustomFormatter = (value: any, _placeholder: Placeholder, _key?: string): string | undefined => {\n if (typeof value === \"number\") {\n return value.toString();\n }\n return undefined;\n};\n\n/** 布尔格式化器 */\nconst booleanFormatter: CustomFormatter = (value: any, _placeholder: Placeholder, _key?: string): string | undefined => {\n if (typeof value === \"boolean\") {\n return Number(value).toString();\n }\n return undefined;\n};\n\n/** 字符串格式化器(默认) */\nconst stringFormatter: CustomFormatter = (value: any, _placeholder: Placeholder, _key?: string): string | undefined => {\n if (typeof value === \"string\") {\n return value.toString();\n }\n return undefined;\n};\n\nconst defaultRe = /\\${(?:([^{}:]+?):)?([^{}:]+?)(?:\\.([^{}:]+?))?(?::([^{}:]+?))??}/g;\n\n/**默认占位符提取器**/\nconst defaultExtractPlaceholders: CustomPlaceholderExtractor = (inputString: string, options: ExtensionOptions): Placeholder[] => {\n const matches: Placeholder[] = [];\n // 默认正则表达式\n // 使用自定义正则表达式(如果提供)\n const re = options.customPlaceholderRegex || defaultRe;\n // 如果启用了默认解析且使用了自定义正则,先执行默认解析\n if (options.enableDefaultParsing && options.customPlaceholderRegex) {\n let match: RegExpExecArray | null;\n while ((match = defaultRe.exec(inputString)) !== null) {\n matches.push({\n placeholder: match[0],\n type: match[1] || 'normal',\n name: match[2],\n key: match[3],\n subType: match[4],\n full: match[0].length === inputString.length\n });\n }\n }\n // 执行当前正则匹配\n let match: RegExpExecArray | null;\n // 重置 lastIndex(如果正则不是全局的)\n re.lastIndex = 0;\n while ((match = re.exec(inputString)) !== null) {\n // 如果已经启用了默认解析,检查是否重复\n if (options.enableDefaultParsing && options.customPlaceholderRegex) {\n const isDuplicate = matches.some(m => m.placeholder === match![0]);\n if (isDuplicate) continue;\n }\n matches.push({\n placeholder: match[0],\n type: match[1] || 'normal',\n name: match[2],\n key: match[3],\n subType: match[4],\n full: match[0].length === inputString.length\n });\n }\n return matches;\n}\n\n/** 默认格式化器列表 */\nconst defaultFormatters: CustomFormatter[] = [\n dateFormatter,\n numberFormatter,\n booleanFormatter,\n stringFormatter\n];\n\nconst pattern = new RegExp('^(https?:\\\\/\\\\/)?' +\n '((([a-z\\\\d]([a-z\\\\d-]*[a-z\\\\d])*)\\\\.)+[a-z]{2,}|' +\n '((\\\\d{1,3}\\\\.){3}\\\\d{1,3}))' +\n '(\\\\:\\\\d+)?(\\\\/[-a-z\\\\d%_.~+]*)*' +\n '(\\\\?[;&a-z\\\\d%_.~+=-]*)?' +\n '(\\\\#[-a-z\\\\d_]*)?$', 'i');\n\nconst isUrl = function (str: string): boolean {\n return !!pattern.test(str);\n}\n\nconst toArrayBuffer = function (buffer: Buffer): ArrayBuffer {\n const ab = new ArrayBuffer(buffer.length);\n const view = new Uint8Array(ab);\n for (let i = 0; i < buffer.length; ++i) {\n view[i] = buffer[i];\n }\n return ab;\n}\n\n// ==================== Workbook 类 ====================\nclass Workbook {\n // ==================== 属性定义 ====================\n option: FullOptions;\n archive: JsZip;\n sharedStrings: string[] = [];\n sharedStringsLookup: Record<string, number> = {};\n sharedStringsPath: string = \"\";\n sheets: SheetInfo[] | SheetInfoMust[] = [];\n sheet: SheetInfo | SheetInfoMust | null = null;\n workbook: Element | null = null;\n workbookPath: string | null = null;\n contentTypes: any = null;\n prefix: string | null = null;\n workbookRels: Element | null = null;\n calChainRel: any = null;\n calcChainPath: string = \"\";\n\n // RichData 相关属性\n private richDataIsInit: boolean = false;\n private _relsrichValueRel: any = null;\n private rdrichvalue: any = null;\n private rdrichvaluestructure: any = null;\n private rdRichValueTypes: any = null;\n private richValueRel: any = null;\n private metadata: any = null;\n\n // ==================== 构造函数 ====================\n constructor(option?: FullOptions) {\n this.option = {\n moveImages: false,\n substituteAllTableRow: false,\n moveSameLineImages: false,\n imageRatio: 100,\n pushDownPageBreakOnTableSubstitution: false,\n imageRootPath: null,\n handleImageError: null,\n ...option\n };\n }\n\n // ==================== parse 构造函数 ====================\n static async parse(data: Buffer | string, option?: FullOptions): Promise<Workbook> {\n const w = new Workbook(option);\n await w.loadTemplate(data);\n return w;\n }\n\n // ==================== 扩展方法 ====================\n /**\n * 添加自定义替换器\n * @param replacer - 替换函数\n * @returns this(支持链式调用)\n */\n addReplacer(replacer: CustomReplacer): this {\n if (!this.option.replacers) {\n this.option.replacers = [];\n }\n this.option.replacers.push(replacer);\n return this;\n }\n\n /**\n * 添加自定义格式化器\n * @param formatter - 格式化函数\n * @returns this(支持链式调用)\n */\n addFormatter(formatter: CustomFormatter): this {\n if (!this.option.formatters) {\n this.option.formatters = [];\n }\n this.option.formatters.push(formatter);\n return this;\n }\n\n /**\n * 设置替换前钩子\n * @param hook - 钩子函数\n * @returns this(支持链式调用)\n */\n setBeforeReplaceHook(hook: BeforeReplaceHook): this {\n this.option.beforeReplace = hook;\n return this;\n }\n\n /**\n * 设置替换后钩子\n * @param hook - 钩子函数\n * @returns this(支持链式调用)\n */\n setAfterReplaceHook(hook: AfterReplaceHook): this {\n this.option.afterReplace = hook;\n return this;\n }\n\n /**\n * 设置自定义占位符提取器\n * @param extractor - 提取函数\n * @returns this(支持链式调用)\n */\n setPlaceholderExtractor(extractor: CustomPlaceholderExtractor): this {\n this.option.customPlaceholderExtractor = extractor;\n return this;\n }\n\n /**\n * 设置自定义模板正则表达式\n * @param regex - 正则表达式\n * @param enableDefaultParsing - 是否同时启用默认解析,默认 false\n * @returns this(支持链式调用)\n */\n setPlaceholderRegex(regex: RegExp, enableDefaultParsing: boolean = false): this {\n this.option.customPlaceholderRegex = regex;\n this.option.enableDefaultParsing = enableDefaultParsing;\n return this;\n }\n\n /**\n * 设置数值查询器\n * @param h QueryFunction - 设置数值查询器\n * @returns this(支持链式调用)\n */\n setQueryFunctionHandler(h: QueryFunction): this {\n this.option.customQueryFunction = h\n return this;\n }\n\n // ==================== 扩展点执行方法 ====================\n /**\n * 执行自定义替换器链\n * @param cell - 单元格元素\n * @param stringValue - 字符串值\n * @param placeholder - 占位符信息\n * @param substitution - 替换值\n * @returns 替换结果或 undefined\n */\n private executeReplacers(\n cell: any,\n stringValue: string,\n placeholder: Placeholder,\n substitution: any\n ): string | undefined {\n // 首先执行 customReplacer(向后兼容)\n if (this.option.customReplacer) {\n const result = this.option.customReplacer(cell, stringValue, placeholder, substitution);\n if (result !== undefined && result !== null) {\n return result;\n }\n }\n // 执行 replacers 列表\n if (this.option.replacers && this.option.replacers.length > 0) {\n for (const replacer of this.option.replacers) {\n const result = replacer(cell, stringValue, placeholder, substitution);\n if (result !== undefined && result !== null) {\n return result;\n }\n }\n }\n return undefined;\n }\n\n /**\n * 执行格式化器链\n * @param value - 原始值\n * @param placeholder - 占位符信息\n * @param key - 可选键名\n * @returns 格式化后的字符串\n */\n private executeFormatters(value: any, placeholder: Placeholder, key?: string): string {\n // 自定义格式化器\n if (this.option.formatters && this.option.formatters.length > 0) {\n for (const formatter of this.option.formatters) {\n const result = formatter(value, placeholder, key);\n if (result !== undefined && result !== null) {\n return result;\n }\n }\n }\n // 默认格式化器\n for (const formatter of defaultFormatters) {\n const result = formatter(value, placeholder, key);\n if (result !== undefined && result !== null) {\n return result;\n }\n }\n return \"\";\n }\n\n /**\n * 执行替换前钩子\n */\n private executeBeforeReplaceHook(\n stringValue: string,\n substitutions: Record<string, any>\n ): string {\n if (this.option.beforeReplace) {\n const result = this.option.beforeReplace(stringValue, substitutions);\n if (result !== undefined && result !== null) {\n return result;\n }\n }\n return stringValue;\n }\n\n /**\n * 执行替换后钩子\n */\n private executeAfterReplaceHook(\n resultString: string,\n stringValue: string,\n substitutions: Record<string, any>\n ): string {\n if (this.option.afterReplace) {\n return this.option.afterReplace(resultString, stringValue, substitutions);\n }\n return resultString;\n }\n\n // ==================== 核心方法 ====================\n /**\n * 删除工作表\n */\n async deleteSheet(sheetName: string | number): Promise<this> {\n const sheet = await this.loadSheet(sheetName);\n const sh = this.workbook.find(`sheets/sheet[@sheetId='${sheet.id}']`);\n const sheets = this.workbook.findall(\"sheets/sheet\");\n const sheetIndex = sheets.indexOf(sh);\n // 移除关联的 definedNames\n const definedNamesParent = this.workbook.find(\"definedNames\");\n if (definedNamesParent) {\n const toRemove: any[] = [];\n this.workbook.findall(\"definedNames/definedName\").forEach((def: any) => {\n if (def.attrib.localSheetId !== undefined) {\n const localId = parseInt(def.attrib.localSheetId);\n if (localId === sheetIndex) {\n toRemove.push(def);\n } else if (localId > sheetIndex) {\n def.attrib.localSheetId = (localId - 1).toString();\n }\n }\n });\n toRemove.forEach((def: any) => {\n definedNamesParent.remove(def);\n });\n }\n this.workbook.find(\"sheets\").remove(sh);\n const rel = this.workbookRels.find(`Relationship[@Id='${sh.attrib['r:id']}']`);\n this.workbookRels.remove(rel);\n this._rebuild();\n return this;\n }\n\n /**\n * 复制工作表\n */\n async copySheet(sheetName: string | number, copyName?: string, binary: boolean = true): Promise<this> {\n // 警告用户 binary 模式已禁用\n if (binary === false && !process.env.JEST_WORKER_ID) {\n console.warn('Warning: copySheet() called with binary=false. UTF-8 characters may be corrupted.');\n }\n const sheet = await this.loadSheet(sheetName);\n const newSheetIndex = (this.workbook.findall(\"sheets/sheet\").length + 1).toString();\n const fileName = 'worksheets/sheet' + newSheetIndex + '.xml';\n const arcName = this.prefix + '/' + fileName;\n // 以二进制模式复制工作表文件以保留 UTF-8 编码\n const sourceSheetFile = this.archive.file(sheet.filename);\n let sheetContent = await sourceSheetFile.async(`nodebuffer`);\n this.archive.file(arcName, sheetContent);\n this.archive.files[arcName].options.compression = binary ? \"STORE\" : \"DEFLATE\";\n\n // 为新工作表添加内容类型\n const sheetContentType = etree.SubElement(this.contentTypes, 'Override');\n sheetContentType.attrib.PartName = '/' + arcName;\n sheetContentType.attrib.ContentType = 'application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml';\n // 在工作簿中复制工作表名称\n const newSheet = etree.SubElement(this.workbook.find('sheets'), 'sheet');\n const finalSheetName = copyName || 'Sheet' + newSheetIndex;\n newSheet.attrib.name = finalSheetName;\n newSheet.attrib.sheetId = newSheetIndex;\n newSheet.attrib['r:id'] = 'rId' + newSheetIndex;\n // 复制 definedName(如果有)\n this.workbook.findall('definedNames/definedName').forEach((element: any) => {\n if (element.text && element.text.split(\"!\").length && element.text.split(\"!\")[0] == sheetName) {\n const newDefinedName = etree.SubElement(this.workbook.find('definedNames'), 'definedName', element.attrib);\n newDefinedName.text = finalSheetName + \"!\" + element.text.split(\"!\")[1];\n const index = Number.parseInt(newSheetIndex, 10) - 1;\n newDefinedName.attrib.localSheetId = `${index}`;\n }\n });\n const newRel = etree.SubElement(this.workbookRels, 'Relationship');\n newRel.attrib.Type = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet';\n newRel.attrib.Target = fileName;\n // 复制工作表关系及其目标文件\n const sourceRels = await this.loadSheetRels(sheet.filename);\n const relFileName = 'worksheets/_rels/sheet' + newSheetIndex + '.xml.rels';\n const relArcName = this.prefix + '/' + relFileName;\n const newRelsRoot = this.cloneElement(sourceRels.root, true);\n // 为注释生成新的 UUID\n const newCommentUuid = this.generateUUID();\n // 处理每个关系以使用唯一名称复制目标文件\n sourceRels.root.findall('Relationship').forEach((rel: any, index: number) => {\n const relType = rel.attrib.Type;\n const target = rel.attrib.Target;\n const needsFileCopy = [\n 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments',\n 'http://schemas.microsoft.com/office/2017/10/relationships/threadedComment',\n 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing'\n ];\n if (needsFileCopy.indexOf(relType) !== -1) {\n const sheetDirectory = path.dirname(sheet.filename);\n const sourceFilePath = path.join(sheetDirectory, target).replace(/\\\\/g, '/');\n const sourceFile = this.archive.file(sourceFilePath);\n if (sourceFile) {\n const fileExtension = path.extname(target);\n const fileBaseName = path.basename(target, fileExtension);\n const fileDir = path.dirname(target);\n const baseNameWithoutNumber = fileBaseName.replace(/\\d+$/, '');\n const newFileName = baseNameWithoutNumber + newSheetIndex + fileExtension;\n const newTarget = path.join(fileDir, newFileName).replace(/\\\\/g, '/');\n const newFilePath = path.join(sheetDirectory, newTarget).replace(/\\\\/g, '/');\n const content = sourceFile.async(`string`);\n content.then((binaryContent) => {\n // 应用特定于文件的转换\n if (relType === 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing') {\n binaryContent = binaryContent.replace(/data=\"\\d+\"/, 'data=\"' + newSheetIndex + '\"');\n } else if (relType === 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments') {\n const uuidWithoutBraces = newCommentUuid.replace(/[{}]/g, '');\n binaryContent = binaryContent.replace(/(<author>tc=\\{)[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}(\\}<\\/author>)/gi, '$1' + uuidWithoutBraces + '$2');\n binaryContent = binaryContent.replace(/(xr:uid=\"\\{)[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}(\\}\\\")/gi, '$1' + uuidWithoutBraces + '$2');\n const commentsContentType = etree.SubElement(this.contentTypes, 'Override');\n commentsContentType.attrib.PartName = '/' + newFilePath;\n commentsContentType.attrib.ContentType = 'application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml';\n } else if (relType === 'http://schemas.microsoft.com/office/2017/10/relationships/threadedComment') {\n const uuidWithoutBraces = newCommentUuid.replace(/[{}]/g, '');\n binaryContent = binaryContent.replace(/(\\sid=\"\\{)[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}(\\}\")/gi, '$1' + uuidWithoutBraces + '$2');\n const threadedCommentContentType = etree.SubElement(this.contentTypes, 'Override');\n threadedCommentContentType.attrib.PartName = '/' + newFilePath;\n threadedCommentContentType.attrib.ContentType = 'application/vnd.ms-excel.threadedcomments+xml';\n }\n this.archive.file(newFilePath, binaryContent);\n this.archive.files[newFilePath].options.compression = binary ? \"STORE\" : \"DEFLATE\";\n const newRelInRels = newRelsRoot.findall('Relationship')[index];\n if (newRelInRels) {\n newRelInRels.attrib.Target = newTarget;\n }\n }).catch(err => {\n console.log(err)\n })\n }\n }\n });\n this.archive.file(relArcName, etree.tostring(newRelsRoot, {encoding: 'utf-8'}));\n this.archive.files[relArcName].options.compression = binary ? \"STORE\" : \"DEFLATE\";\n this.archive.file('[Content_Types].xml', etree.tostring(this.contentTypes, {encoding: 'utf-8'}));\n this._rebuild();\n return this;\n }\n\n /**\n * 部分重建(复制/删除工作表后)\n */\n private _rebuild(): void {\n const order = ['worksheet', 'theme', 'styles', 'sharedStrings'];\n this.workbookRels.findall(\"*\")\n .sort((rel1: any, rel2: any) => {\n const index1 = order.indexOf(path.basename(rel1.attrib.Type));\n const index2 = order.indexOf(path.basename(rel2.attrib.Type));\n if (index1 < 0 && index2 >= 0) return 1;\n if (index1 >= 0 && index2 < 0) return -1;\n if (index1 < 0 && index2 < 0) return 0;\n if ((index1 + index2) === 0) {\n if (rel1.attrib.Id && rel2.attrib.Id) {\n return rel1.attrib.Id.substring(3) - rel2.attrib.Id.substring(3);\n }\n return rel1._id - rel2._id;\n }\n return index1 - index2;\n })\n .forEach((item: any, index: number) => {\n item.attrib.Id = 'rId' + (index + 1);\n });\n this.workbook.findall(\"sheets/sheet\").forEach((item: any, index: number) => {\n item.attrib['r:id'] = 'rId' + (index + 1);\n item.attrib.sheetId = (index + 1).toString();\n });\n this.archive.file(\n this.prefix + '/' + '_rels' + '/' + path.basename(this.workbookPath!) + '.rels',\n etree.tostring(this.workbookRels, {encoding: 'utf-8'})\n );\n this.archive.file(this.workbookPath!, etree.tostring(this.workbook, {encoding: 'utf-8'}));\n this.sheets = this.loadSheets(this.prefix!, this.workbook, this.workbookRels);\n }\n\n /**\n * 从字节数组加载 .xlsx 文件\n */\n async loadTemplate(data: Buffer | string): Promise<void> {\n if (Buffer.isBuffer(data)) {\n data = data.toString('binary');\n }\n this.archive = await JsZip.loadAsync(data, {base64: false, checkCRC32: true});\n // 加载关系\n const text = await this.archive.file(\"_rels/.rels\").async(\"string\");\n const rels = etree.parse(text).getroot();\n const workbookPath = rels.find(`Relationship[@Type='${DOCUMENT_RELATIONSHIP}']`).attrib.Target;\n this.workbookPath = workbookPath;\n this.prefix = path.dirname(workbookPath);\n const workbookText = await this.archive.file(workbookPath).async(`string`);\n this.workbook = etree.parse(workbookText).getroot();\n const refText = await this.archive.file(this.prefix + \"/\" + '_rels' + \"/\" + path.basename(workbookPath) + '.rels').async(`string`);\n this.workbookRels = etree.parse(refText).getroot();\n this.sheets = this.loadSheets(this.prefix, this.workbook, this.workbookRels);\n this.calChainRel = this.workbookRels.find(`Relationship[@Type='${CALC_CHAIN_RELATIONSHIP}']`);\n if (this.calChainRel) {\n this.calcChainPath = this.prefix + \"/\" + this.calChainRel.attrib.Target;\n }\n this.sharedStringsPath = this.prefix + \"/\" + this.workbookRels.find(`Relationship[@Type='${SHARED_STRINGS_RELATIONSHIP}']`).attrib.Target;\n this.sharedStrings = [];\n this.sharedStringsLookup = {};\n const sharedText = await this.archive.file(this.sharedStringsPath).async(`string`);\n etree.parse(sharedText).getroot().findall('si').forEach((si: any) => {\n const t = {text: ''};\n si.findall('t').forEach((tmp: any) => {\n t.text += tmp.text;\n });\n si.findall('r/t').forEach((tmp: any) => {\n t.text += tmp.text;\n });\n this.sharedStrings.push(t.text);\n this.sharedStringsLookup[t.text] = this.sharedStrings.length - 1;\n });\n const contentTypeText = await this.archive.file('[Content_Types].xml').async(`string`);\n this.contentTypes = etree.parse(contentTypeText).getroot();\n const jpgType = this.contentTypes.find('Default[@Extension=\"jpg\"]');\n if (jpgType === null) {\n etree.SubElement(this.contentTypes, 'Default', {'ContentType': 'image/png', 'Extension': 'jpg'});\n }\n }\n\n /**\n * 使用给定的替换数据对所有工作表进行插值\n */\n async substituteAll(substitutions: Record<string, any>): Promise<void> {\n const sheets = this.loadSheets(this.prefix!, this.workbook, this.workbookRels);\n for (let sheet of sheets) {\n await this.substitute(sheet.id, substitutions);\n }\n }\n\n /**\n * 使用给定的替换数据对指定工作表进行插值\n */\n async substitute(sheetName: string | number, substitutions: Record<string, any>): Promise<void> {\n const sheet = await this.loadSheet(sheetName);\n this.sheet = sheet;\n const dimension = sheet.root.find(\"dimension\");\n const sheetData = sheet.root.find(\"sheetData\");\n let currentRow: number | null = null;\n let totalRowsInserted = 0;\n let totalColumnsInserted = 0;\n const namedTables = await this.loadTables(sheet.root, sheet.filename);\n const rows: any[] = [];\n let drawing: DrawingInfo | null = null;\n const rels = await this.loadSheetRels(sheet.filename);\n for (let row of sheetData.findall(\"row\")) {\n currentRow = this.getCurrentRow(row, totalRowsInserted);\n row.attrib.r = `${currentRow}`\n rows.push(row);\n let cells: any[] = [];\n let cellsInserted = 0;\n const newTableRows: any[] = [];\n const cellsSubstituteTable: any[] = [];\n for (let cell of row.findall(\"c\")) {\n let appendCell = true;\n cell.attrib.r = this.getCurrentCell(cell, currentRow!, cellsInserted);\n // 如果是字符串列,查找共享字符串\n if (cell.attrib.t === \"s\") {\n const cellValue = cell.find(\"v\");\n const stringIndex = parseInt(cellValue.text.toString(), 10);\n let strValue = this.sharedStrings[stringIndex];\n if (strValue === undefined) {\n break;\n }\n // 执行替换前钩子\n strValue = this.executeBeforeReplaceHook(strValue, substitutions);\n // 遍历占位符\n for (let placeholder of this.extractPlaceholders(strValue)) {\n let newCellsInserted = 0;\n let substitution = this.valueGet(substitutions, placeholder);\n // 尝试执行自定义替换器\n const customResult = this.executeReplacers(cell, strValue, placeholder, substitution);\n if (customResult !== undefined) {\n strValue = customResult;\n return;\n }\n if (placeholder.full && placeholder.type === \"table\" && substitution instanceof Array) {\n if (placeholder.subType === 'image' && drawing == null) {\n if (rels) {\n drawing = await this.loadDrawing(sheet.root, sheet.filename, rels.root);\n } else {\n console.log(\"Need to implement initRels. Or init this with Excel\");\n }\n }\n cellsSubstituteTable.push(cell);\n newCellsInserted = await this.substituteTable(\n row, newTableRows, cells, cell, namedTables,\n substitution, placeholder, drawing\n );\n if (newCellsInserted !== 0 || substitution.length) {\n if (substitution.length === 1) {\n appendCell = true;\n }\n if (substitution[0][placeholder.key] instanceof Array) {\n appendCell = false;\n }\n }\n if (newCellsInserted !== 0) {\n cellsInserted += newCellsInserted;\n this.pushRight(this.workbook, sheet.root, cell.attrib.r, newCellsInserted);\n }\n }\n if (placeholder.full && placeholder.type === \"normal\" && substitution instanceof Array) {\n appendCell = false;\n newCellsInserted = this.substituteArray(cells, cell, substitution);\n if (newCellsInserted !== 0) {\n cellsInserted += newCellsInserted;\n this.pushRight(this.workbook, sheet.root, cell.attrib.r, newCellsInserted);\n }\n }\n if (placeholder.type === \"image\" && placeholder.full) {\n if (rels != null) {\n if (drawing == null) {\n drawing = await this.loadDrawing(sheet.root, sheet.filename, rels.root);\n }\n this.substituteImage(cell, strValue, placeholder, substitution, drawing);\n } else {\n console.log(\"Need to implement initRels. Or init this with Excel\");\n }\n }\n if (placeholder.type === \"imageincell\" && placeholder.full) {\n await this.substituteImageInCell(cell, substitution);\n } else {\n if (placeholder.key) {\n substitution = this.valueGet(substitutions, placeholder, true);\n }\n strValue = this.substituteScalar(cell, strValue, placeholder, substitution);\n }\n }\n // 执行替换后钩子\n strValue = this.executeAfterReplaceHook(strValue, strValue, substitutions);\n }\n if (appendCell) {\n cells.push(cell);\n }\n }\n // 重建行的子节点\n this.replaceChildren(row, cells);\n // 更新行跨度属性\n if (cellsInserted !== 0) {\n this.updateRowSpan(row, cellsInserted);\n if (cellsInserted > totalColumnsInserted) {\n totalColumnsInserted = cellsInserted;\n }\n }\n // 添加新插入的行\n if (newTableRows.length > 0) {\n if (this.option[\"moveImages\"] && rels) {\n if (drawing == null) {\n drawing = await this.loadDrawing(sheet.root, sheet.filename, rels.root);\n }\n if (drawing != null) {\n this.moveAllImages(drawing, row.attrib.r, newTableRows.length);\n }\n }\n const cellsOverTable = row.findall(\"c\").filter(\n (cell: any) => !cellsSubstituteTable.includes(cell)\n );\n newTableRows.forEach((newRow: any) => {\n if (this.option && this.option.substituteAllTableRow) {\n cellsOverTable.forEach((cellOverTable: any) => {\n const newCell = this.cloneElement(cellOverTable);\n newCell.attrib.r = this.joinRef({\n row: newRow.attrib.r,\n col: this.splitRef(newCell.attrib.r).col\n });\n newRow.append(newCell);\n });\n const newSortRow = newRow.findall(\"c\").sort((a: any, b: any) => {\n const colA = this.splitRef(a.attrib.r).col;\n const colB = this.splitRef(b.attrib.r).col;\n return this.charToNum(colA) - this.charToNum(colB);\n });\n this.replaceChildren(newRow, newSortRow);\n }\n rows.push(newRow);\n ++totalRowsInserted;\n });\n this.pushDown(this.workbook, sheet.root, namedTables, currentRow!, newTableRows.length);\n }\n }\n // 重建 sheetData 的子节点\n this.replaceChildren(sheetData, rows);\n // 更新表格列标题中的占位符\n this.substituteTableColumnHeaders(namedTables, substitutions);\n // 更新超链接中的占位符\n this.substituteHyperlinks(rels, substitutions);\n // 更新 <dimension />\n if (dimension) {\n if (totalRowsInserted > 0 || totalColumnsInserted > 0) {\n const dimensionRange = this.splitRange(dimension.attrib.ref);\n const dimensionEndRef = this.splitRef(dimensionRange.end);\n dimensionEndRef.row += totalRowsInserted;\n dimensionEndRef.col = this.numToChar(this.charToNum(dimensionEndRef.col) + totalColumnsInserted);\n dimensionRange.end = this.joinRef(dimensionEndRef);\n dimension.attrib.ref = this.joinRange(dimensionRange);\n }\n }\n // 强制重新计算公式值\n sheetData.findall(\"row\").forEach((row: any) => {\n row.findall(\"c\").forEach((cell: any) => {\n const formulas = cell.findall('f');\n if (formulas && formulas.length > 0) {\n cell.findall('v').forEach((v: any) => {\n cell.remove(v);\n });\n }\n });\n });\n // 写回修改后的 XML 树\n this.archive.file(sheet.filename, etree.tostring(sheet.root, {encoding: 'utf-8'}));\n this.archive.file(this.workbookPath!, etree.tostring(this.workbook, {encoding: 'utf-8'}));\n if (rels) {\n this.archive.file(rels.filename, etree.tostring(rels.root, {encoding: 'utf-8'}));\n }\n this.writeRichData();\n this.archive.file('[Content_Types].xml', etree.tostring(this.contentTypes, {encoding: 'utf-8'}));\n // 移除计算链\n if (this.calcChainPath && this.archive.file(this.calcChainPath)) {\n this.archive.remove(this.calcChainPath);\n }\n await this.writeSharedStrings();\n this.writeTables(namedTables);\n this.writeDrawing(drawing);\n }\n\n /**\n * 生成新的二进制 .xlsx 文件\n */\n async generate<T extends JsZip.OutputType>(options?: JsZip.JSZipGeneratorOptions<T>): Promise<OutputByType[T]> {\n return await this.archive.generateAsync(options);\n }\n\n /**\n * 查询占位符合数据值\n * @param substitutions 数据对象\n * @param p 占位符\n * @param full 是否fullKey\n * @return any\n */\n public valueGet(substitutions: object | Record<string, any>, p: Placeholder, full?: boolean): any {\n if (this.option.customQueryFunction === undefined) {\n if (full !== undefined && typeof full === \"boolean\" && full && p.key) {\n return valueDotGet(substitutions, p.name + '.' + p.key, p.default || '');\n }\n return valueDotGet(substitutions, p.name, p.default || '')\n }\n if (full !== undefined && typeof full === \"boolean\" && full &&\n p.key && !p.name.endsWith(`.${p.key}`)) {\n p.name = p.name + '.' + p.key\n }\n return this.option.customQueryFunction(substitutions, p)\n }\n\n // ==================== 辅助方法 ====================\n private async writeSharedStrings(): Promise<void> {\n const content = await this.archive.file(this.sharedStringsPath).async(\"string\");\n const root = etree.parse(content).getroot();\n const children = root.getchildren();\n root.delSlice(0, children.length);\n this.sharedStrings.forEach((string) => {\n const si = etree.Element(\"si\");\n const t = etree.Element(\"t\");\n t.text = string;\n si.append(t);\n root.append(si);\n });\n root.attrib.count = `${this.sharedStrings.length}`;\n root.attrib.uniqueCount = `${this.sharedStrings.length}`;\n this.archive.file(this.sharedStringsPath, etree.tostring(root, {encoding: 'utf-8'}));\n }\n\n private addSharedString(s: string): number {\n const idx = this.sharedStrings.length;\n this.sharedStrings.push(s);\n this.sharedStringsLookup[s] = idx;\n return idx;\n }\n\n private stringIndex(s: string): number {\n let idx = this.sharedStringsLookup[s];\n if (idx === undefined) {\n idx = this.addSharedString(s);\n }\n return idx;\n }\n\n private replaceString(oldString: string, newString: string): number {\n let idx = this.sharedStringsLookup[oldString];\n if (idx === undefined) {\n idx = this.addSharedString(newString);\n } else {\n this.sharedStrings[idx] = newString;\n delete this.sharedStringsLookup[oldString];\n this.sharedStringsLookup[newString] = idx;\n }\n return idx;\n }\n\n private loadSheets(prefix: string, workbook: Element, workbookRels: any): SheetInfo[] {\n const sheets: SheetInfo[] = [];\n for (const sheet of workbook.findall(\"sheets/sheet\")) {\n const sheetId = sheet.attrib.sheetId;\n const relId = sheet.attrib['r:id'];\n const relationship = workbookRels.find(`Relationship[@Id='${relId}']`);\n const filename = prefix + \"/\" + relationship.attrib.Target;\n sheets.push({\n root: sheet,\n filename: filename,\n name: sheet.attrib.name,\n id: parseInt(sheetId, 10),\n });\n }\n return sheets;\n }\n\n async loadSheet(sheet: string | number): Promise<SheetInfoMust> {\n let info: SheetInfo | null = null;\n for (let i = 0; i < this.sheets.length; ++i) {\n if ((typeof (sheet) === \"number\" && this.sheets[i].id === sheet) || (this.sheets[i].name === sheet)) {\n info = this.sheets[i];\n break;\n }\n }\n if (info === null && (typeof (sheet) === \"number\")) {\n info = this.sheets[sheet - 1];\n }\n if (info === null) {\n throw new Error(\"Sheet \" + sheet + \" not found\");\n }\n const content = await this.archive.file(info.filename).async(\"string\");\n return {\n filename: info.filename,\n name: info.name,\n id: info.id,\n root: etree.parse(content).getroot()\n };\n }\n\n async loadSheetRels(sheetFilename: string): Promise<RelsInfo> {\n const sheetDirectory = path.dirname(sheetFilename);\n const sheetName = path.basename(sheetFilename);\n const relsFilename = path.join(sheetDirectory, '_rels', sheetName + '.rels').replace(/\\\\/g, '/');\n const relsFile = this.archive.file(relsFilename);\n if (relsFile === null) {\n return this.initSheetRels(sheetFilename);\n }\n const content = await relsFile.async(\"string\");\n return {\n filename: relsFilename,\n root: etree.parse(content).getroot()\n };\n }\n\n private initSheetRels(sheetFilename: string): RelsInfo {\n const sheetDirectory = path.dirname(sheetFilename);\n const sheetName = path.basename(sheetFilename);\n const relsFilename = path.join(sheetDirectory, '_rels', sheetName + '.rels').replace(/\\\\/g, '/');\n const element = etree.Element;\n const ElementTree = etree.ElementTree;\n const root = element('Relationships');\n root.set('xmlns', 'http://schemas.openxmlformats.org/package/2006/relationships');\n const relsEtree = new ElementTree(root);\n return {\n filename: relsFilename,\n root: relsEtree.getroot()\n };\n }\n\n private async loadDrawing(sheet: any, sheetFilename: string, rels: any): Promise<DrawingInfo> {\n // const sheetName = path.basename(sheetFilename);\n const sheetDirectory = path.dirname(sheetFilename);\n const drawing: DrawingInfo = {filename: '', root: null};\n const drawingPart = sheet.find(\"drawing\");\n if (drawingPart === null) {\n return this.initDrawing(sheet, rels);\n }\n const relationshipId = drawingPart.attrib['r:id'];\n const target = rels.find(`Relationship[@Id='${relationshipId}']`).attrib.Target;\n const drawingFilename = path.join(sheetDirectory, target).replace(/\\\\/g, '/');\n const drawContent = await this.archive.file(drawingFilename).async(\"string\");\n const drawingTree = etree.parse(drawContent);\n drawing.filename = drawingFilename;\n drawing.root = drawingTree.getroot();\n drawing.relFilename = path.dirname(drawingFilename) + '/_rels/' + path.basename(drawingFilename) + '.rels';\n const relFile = this.archive.file(drawing.relFilename);\n if (relFile === null) {\n drawing.relRoot = etree.Element('Relationships');\n drawing.relRoot.set('xmlns', \"http://schemas.openxmlformats.org/package/2006/relationships\");\n } else {\n const relContent = await relFile.async(\"string\");\n drawing.relRoot = etree.parse(relContent).getroot();\n }\n return drawing;\n }\n\n private addContentType(partName: string, contentType: string): void {\n etree.SubElement(this.contentTypes, 'Override', {'ContentType': contentType, 'PartName': partName});\n }\n\n private initDrawing(sheet: any, rels: any): DrawingInfo {\n const maxId = this.findMaxId(rels, 'Relationship', 'Id', /rId(\\d*)/);\n const rel = etree.SubElement(rels, 'Relationship');\n sheet.insert(sheet._children.length, etree.Element('drawing', {'r:id': 'rId' + maxId}));\n rel.set('Id', 'rId' + maxId);\n rel.set('Type', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing');\n const drawing: DrawingInfo = {} as DrawingInfo;\n const drawingFilename = 'drawing' + this.findMaxFileId(/xl\\/drawings\\/drawing\\d*\\.xml/, /drawing(\\d*)\\.xml/) + '.xml';\n rel.set('Target', '../drawings/' + drawingFilename);\n drawing.root = etree.Element('xdr:wsDr');\n drawing.root.set('xmlns:xdr', \"http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing\");\n drawing.root.set('xmlns:a', \"http://schemas.openxmlformats.org/drawingml/2006/main\");\n drawing.filename = 'xl/drawings/' + drawingFilename;\n drawing.relFilename = 'xl/drawings/_rels/' + drawingFilename + '.rels';\n drawing.relRoot = etree.Element('Relationships');\n drawing.relRoot.set('xmlns', \"http://schemas.openxmlformats.org/package/2006/relationships\");\n this.addContentType('/' + drawing.filename, 'application/vnd.openxmlformats-officedocument.drawing+xml');\n return drawing;\n }\n\n private writeDrawing(drawing: DrawingInfo | null): void {\n if (drawing !== null) {\n this.archive.file(drawing.filename, etree.tostring(drawing.root, {encoding: \"utf-8\"}));\n this.archive.file(drawing.relFilename, etree.tostring(drawing.relRoot, {encoding: \"utf-8\"}));\n }\n }\n\n private moveAllImages(drawing: DrawingInfo, fromRow: string, nbRow: number): void {\n drawing.root.getchildren().forEach((drawElement: any) => {\n if (drawElement.tag == \"xdr:twoCellAnchor\") {\n this._moveTwoCellAnchor(drawElement, fromRow, nbRow);\n }\n });\n }\n\n private _moveTwoCellAnchor(drawingElement: any, fromRow: string, nbRow: number): void {\n const _moveImage = (drawingElement: any, fromRow: string, nbRow: number | string) => {\n let num: number;\n if (typeof nbRow === \"string\") {\n num = Number.parseInt(nbRow, 10);\n } else {\n num = nbRow;\n }\n drawingElement.find('xdr:from').find('xdr:row').text = Number.parseInt(drawingElement.find('xdr:from').find('xdr:row').text, 10) + num;\n drawingElement.find('xdr:to').find('xdr:row').text = Number.parseInt(drawingElement.find('xdr:to').find('xdr:row').text, 10) + num;\n };\n if (this.option[\"moveSameLineImages\"]) {\n if (parseInt(drawingElement.find('xdr:from').find('xdr:row').text) + 1 >= parseInt(fromRow)) {\n _moveImage(drawingElement, fromRow, nbRow);\n }\n } else {\n if (parseInt(drawingElement.find('xdr:from').find('xdr:row').text) + 1 > parseInt(fromRow)) {\n _moveImage(drawingElement, fromRow, nbRow);\n }\n }\n }\n\n async loadTables(sheet: Element, sheetFilename: string): Promise<TableInfo[]> {\n const sheetDirectory = path.dirname(sheetFilename);\n const sheetName = path.basename(sheetFilename);\n const relsFilename = sheetDirectory + \"/\" + '_rels' + \"/\" + sheetName + '.rels';\n const relsFile = this.archive.file(relsFilename);\n const tables: TableInfo[] = [];\n if (relsFile === null) {\n return tables;\n }\n const relsContent = await relsFile.async(\"string\");\n const rels = etree.parse(relsContent).getroot();\n for (let tablePart of sheet.findall(\"tableParts/tablePart\")) {\n const relationshipId = tablePart.attrib['r:id'];\n const target = rels.find(`Relationship[@Id='${relationshipId}']`).attrib.Target;\n const tableFilename = target.replace('..', this.prefix!);\n const content = await this.archive.file(tableFilename).async(\"string\");\n const tableTree = etree.parse(content);\n tables.push({\n filename: tableFilename,\n root: tableTree.getroot()\n });\n }\n return tables;\n }\n\n private writeTables(tables: TableInfo[]): void {\n tables.forEach((namedTable) => {\n this.archive.file(namedTable.filename, etree.tostring(namedTable.root, {encoding: 'utf-8'}));\n });\n }\n\n private substituteHyperlinks(rels: RelsInfo | null, substitutions: Record<string, any>): void {\n if (rels === null) {\n return;\n }\n const relationships = rels.root._children;\n relationships.forEach((relationship: any) => {\n if (relationship.attrib.Type === HYPERLINK_RELATIONSHIP) {\n let target = relationship.attrib.Target;\n target = decodeURI(decodeURI(target));\n this.extractPlaceholders(target).forEach((placeholder) => {\n const substitution = substitutions[placeholder.name];\n if (substitution === undefined) {\n return;\n }\n target = target.replace(placeholder.placeholder, this.stringify(substitution));\n relationship.attrib.Target = encodeURI(target);\n });\n }\n });\n }\n\n private substituteTableColumnHeaders(tables: TableInfo[], substitutions: Record<string, any>): void {\n tables.forEach((table) => {\n const root = table.root;\n const columns = root.find(\"tableColumns\");\n const autoFilter = root.find(\"autoFilter\");\n const tableRange = this.splitRange(root.attrib.ref);\n let idx = 0;\n let inserted = 0;\n const newColumns: any[] = [];\n columns.findall(\"tableColumn\").forEach((col: any) => {\n ++idx;\n col.attrib.id = Number(idx).toString();\n newColumns.push(col);\n let name = col.attrib.name;\n this.extractPlaceholders(name).forEach((placeholder) => {\n const substitution = substitutions[placeholder.name];\n if (substitution === undefined) {\n return;\n }\n if (placeholder.full && placeholder.type === \"normal\" && substitution instanceof Array) {\n substitution.forEach((element: any, i: number) => {\n let newCol = col;\n if (i > 0) {\n newCol = this.cloneElement(newCol);\n newCol.attrib.id = Number(++idx).toString();\n newColumns.push(newCol);\n ++inserted;\n tableRange.end = this.nextCol(tableRange.end);\n }\n newCol.attrib.name = this.stringify(element);\n });\n } else {\n name = name.replace(placeholder.placeholder, this.stringify(substitution));\n col.attrib.name = name;\n }\n });\n });\n this.replaceChildren(columns, newColumns);\n if (inserted > 0) {\n columns.attrib.count = Number(idx).toString();\n root.attrib.ref = this.joinRange(tableRange);\n if (autoFilter !== null) {\n autoFilter.attrib.ref = this.joinRange(tableRange);\n }\n }\n const tableRoot = table.root;\n const tableRange2 = this.splitRange(tableRoot.attrib.ref);\n const tableStart = this.splitRef(tableRange2.start);\n const tableEnd = this.splitRef(tableRange2.end);\n if (tableRoot.attrib.totalsRowCount) {\n const autoFilter2 = tableRoot.find(\"autoFilter\");\n if (autoFilter2 !== null) {\n autoFilter2.attrib.ref = this.joinRange({\n start: this.joinRef(tableStart),\n end: this.joinRef(tableEnd),\n });\n }\n ++tableEnd.row;\n tableRoot.attrib.ref = this.joinRange({\n start: this.joinRef(tableStart),\n end: this.joinRef(tableEnd),\n });\n }\n });\n }\n\n /**\n * 提取字符串中可能存在的占位符标记\n * 支持扩展:自定义正则表达式和自定义提取器\n */\n extractPlaceholders(inputString: string): Placeholder[] {\n // 如果提供了自定义占位符提取器,使用它\n if (this.option.customPlaceholderExtractor) {\n return this.option.customPlaceholderExtractor(inputString, this.option);\n }\n return defaultExtractPlaceholders(inputString, this.option);\n }\n\n private splitRef(ref: string): Ref {\n const match = ref.match(/(?:(.+)!)?(\\$)?([A-Z]+)?(\\$)?([0-9]+)/);\n return {\n table: match && match[1] || null,\n colAbsolute: Boolean(match && match[2]),\n col: match && match[3] || \"\",\n rowAbsolute: Boolean(match && match[4]),\n row: parseInt(match && match[5], 10)\n };\n }\n\n private joinRef(ref: Ref): string {\n return (ref.table ? ref.table + \"!\" : \"\") +\n (ref.colAbsolute ? \"$\" : \"\") +\n ref.col.toUpperCase() +\n (ref.rowAbsolute ? \"$\" : \"\") +\n Number(ref.row).toString();\n }\n\n private nextCol(ref: string): string {\n ref = ref.toUpperCase();\n return ref.replace(/[A-Z]+/, (match) => {\n return this.numToChar(this.charToNum(match) + 1);\n });\n }\n\n private nextRow(ref: string): string {\n ref = ref.toUpperCase();\n return ref.replace(/[0-9]+/, (match) => {\n return (parseInt(match, 10) + 1).toString();\n });\n }\n\n private charToNum(str: string | number): number {\n let num = 0;\n if (typeof str === \"string\") {\n for (let idx = str.length - 1, iteration = 0; idx >= 0; --idx, ++iteration) {\n const thisChar = str.charCodeAt(idx) - 64;\n const multiplier = Math.pow(26, iteration);\n num += multiplier * thisChar;\n }\n } else {\n num = str as number;\n }\n return num;\n }\n\n private numToChar(num: number): string {\n let str = \"\";\n for (let i = 0; num > 0; ++i) {\n let remainder = num % 26;\n let charCode = remainder + 64;\n num = (num - remainder) / 26;\n if (remainder === 0) {\n charCode = 90;\n --num;\n }\n str = String.fromCharCode(charCode) + str;\n }\n return str;\n }\n\n private generateUUID(): string {\n const hexDigits = '0123456789ABCDEF';\n let uuid = '{';\n for (let i = 0; i < 36; i++) {\n if (i === 8 || i === 13 || i === 18 || i === 23) {\n uuid += '-';\n } else {\n uuid += hexDigits[Math.floor(Math.random() * 16)];\n }\n }\n uuid += '}';\n return uuid;\n }\n\n private isRange(ref: string): boolean {\n return ref.indexOf(':') !== -1;\n }\n\n private isWithin(ref: string, startRef: string, endRef: string): boolean {\n const start = this.splitRef(startRef);\n const end = this.splitRef(endRef);\n const target = this.splitRef(ref);\n start.col = `${this.charToNum(start.col)}`;\n end.col = `${this.charToNum(end.col)}`;\n target.col = `${this.charToNum(target.col)}`;\n return (start.row <= target.row && target.row <= end.row &&\n start.col <= target.col && target.col <= end.col);\n }\n\n /**\n * 将任意类型的值转换为字符串\n * 支持扩展:使用自定义格式化器\n */\n stringify(value: any, placeholder?: Placeholder, key?: string): string {\n // 如果提供了占位符信息,使用格式化器链\n if (placeholder) {\n return this.executeFormatters(value, placeholder, key);\n }\n // 默认行为(向后兼容)\n if (value instanceof Date) {\n return Number((value.getTime() / (1000 * 60 * 60 * 24)) + 25569).toString();\n } else if (typeof (value) === \"number\" || typeof (value) === \"boolean\") {\n return Number(value).toString();\n } else if (typeof (value) === \"string\") {\n return String(value).toString();\n }\n return \"\";\n }\n\n private insertCellValue(cell: any, substitution: any): string {\n const cellValue = cell.find(\"v\");\n const stringify = this.stringify(substitution);\n if (typeof substitution === 'string' && substitution[0] === '=') {\n const formula = etree.Element(\"f\");\n formula.text = substitution.substring(1);\n cell.insert(1, formula);\n delete cell.attrib.t;\n return formula.text.toString();\n }\n if (typeof (substitution) === \"number\" || substitution instanceof Date) {\n delete cell.attrib.t;\n cellValue.text = stringify;\n } else if (typeof (substitution) === \"boolean\") {\n cell.attrib.t = \"b\";\n cellValue.text = stringify;\n } else {\n cell.attrib.t = \"s\";\n cellValue.text = Number(this.stringIndex(stringify)).toString();\n }\n return stringify;\n }\n\n /**\n * 执行单个值的替换\n * 支持扩展:调用自定义替换器\n */\n private substituteScalar(cell: any, string: string, placeholder: Placeholder, substitution: any): string {\n // 尝试执行自定义替换器\n const customResult = this.executeReplacers(cell, string, placeholder, substitution);\n if (customResult !== undefined) {\n if (placeholder.full) {\n return this.insertCellValue(cell, customResult);\n } else {\n cell.attrib.t = \"s\";\n return this.insertCellValue(cell, customResult);\n }\n }\n // 默认行为\n if (placeholder.full) {\n return this.insertCellValue(cell, substitution);\n } else {\n const newString = string.replace(placeholder.placeholder, this.stringify(substitution, placeholder));\n cell.attrib.t = \"s\";\n return this.insertCellValue(cell, newString);\n }\n }\n\n private substituteArray(cells: any[], cell: any, substitution: any[]): number {\n let newCellsInserted = -1;\n let currentCell = cell.attrib.r;\n substitution.forEach((element) => {\n ++newCellsInserted;\n if (newCellsInserted > 0) {\n currentCell = this.nextCol(currentCell);\n }\n const newCell = this.cloneElement(cell);\n this.insertCellValue(newCell, element);\n newCell.attrib.r = currentCell;\n cells.push(newCell);\n });\n return newCellsInserted;\n }\n\n private async substituteTable(\n row: any,\n newTableRows: any[],\n cells: any[],\n cell: any,\n namedTables: TableInfo[],\n substitution: any[],\n placeholder: Placeholder,\n drawing: DrawingInfo | null\n ): Promise<number> {\n let newCellsInserted = 0;\n if (substitution.length === 0) {\n delete cell.attrib.t;\n this.replaceChildren(cell, []);\n } else {\n const parentTables = namedTables.filter((namedTable) => {\n const range = this.splitRange(namedTable.root.attrib.ref);\n return this.isWithin(cell.attrib.r, range.start, range.end);\n });\n for (const [idx, element] of substitution.entries()) {\n let newRow: any;\n let newCell: any;\n let newCellsInsertedOnNewRow = 0;\n const newCells: any[] = [];\n const value = this.valueGet(element, placeholder);\n if (idx === 0) {\n if (value instanceof Array) {\n newCellsInserted = this.substituteArray(cells, cell, value);\n } else if (placeholder.subType == 'image' && value != \"\") {\n this.substituteImage(cell, placeholder.placeholder, placeholder, value, drawing);\n } else if (placeholder.subType === \"imageincell\" && value != \"\") {\n await this.substituteImageInCell(cell, value);\n } else {\n // 尝试自定义替换器\n const customResult = this.executeReplacers(cell, '', placeholder, value);\n if (customResult !== undefined) {\n this.insertCellValue(cell, customResult);\n } else {\n this.insertCellValue(cell, value);\n }\n }\n } else {\n if ((idx - 1) < newTableRows.length) {\n newRow = newTableRows[idx - 1];\n } else {\n newRow = this.cloneElement(row, false);\n newRow.attrib.r = this.getCurrentRow(row, newTableRows.length + 1);\n newTableRows.push(newRow);\n }\n newCell = this.cloneElement(cell);\n newCell.attrib.r = this.joinRef({\n row: newRow.attrib.r,\n col: this.splitRef(newCell.attrib.r).col\n });\n if (value instanceof Array) {\n newCellsInsertedOnNewRow = this.substituteArray(newCells, newCell, value);\n newCells.forEach((nc: any) => {\n newRow.append(nc)\n });\n this.updateRowSpan(newRow, newCellsInsertedOnNewRow);\n } else if (placeholder.subType == 'image' && value != '') {\n this.substituteImage(newCell, placeholder.placeholder, placeholder, value, drawing);\n } else if (placeholder.subType === \"imageincell\" && value != \"\") {\n await this.substituteImageInCell(newCell, value);\n newRow.append(newCell);\n } else {\n // 尝试自定义替换器\n const customResult = this.executeReplacers(newCell, '', placeholder, value);\n if (customResult !== undefined) {\n this.insertCellValue(newCell, customResult);\n } else {\n this.insertCellValue(newCell, value);\n }\n newRow.append(newCell);\n }\n // 检查合并单元格\n const mergeCell = this.sheet!.root.findall(\"mergeCells/mergeCell\")\n .find((c: any) => this.splitRange(c.attrib.ref).start === cell.attrib.r);\n const isMergeCell = mergeCell != null;\n if (isMergeCell) {\n const originalMergeRange = this.splitRange(mergeCell.attrib.ref);\n const originalMergeStart = this.splitRef(originalMergeRange.start);\n const originalMergeEnd = this.splitRef(originalMergeRange.end);\n for (let column = this.charToNum(originalMergeStart.col) + 1; column <= this.charToNum(originalMergeEnd.col); column++) {\n const data = this.sheet!.root.find('sheetData');\n const children = data.getchildren();\n const originalRow = children.find((f: any) => f.attrib.r == originalMergeStart.row);\n const col = this.numToChar(column);\n const originalCell = originalRow.getchildren().find((f: any) => f.attrib.r.startsWith(col));\n const additionalCell = this.cloneElement(originalCell);\n additionalCell.attrib.r = this.joinRef({\n row: newRow.attrib.r,\n col: this.numToChar(column)\n });\n newRow.append(additionalCell);\n }\n }\n // 扩展命名表范围\n parentTables.forEach((namedTable) => {\n const tableRoot = namedTable.root;\n const autoFilter = tableRoot.find(\"autoFilter\");\n const range = this.splitRange(tableRoot.attrib.ref);\n if (!this.isWithin(newCell.attrib.r, range.start, range.end)) {\n range.end = this.nextRow(range.end);\n tableRoot.attrib.ref = this.joinRange(range);\n if (autoFilter !== null) {\n autoFilter.attrib.ref = tableRoot.attrib.ref;\n }\n }\n });\n }\n }\n }\n return newCellsInserted;\n }\n\n private async initRichData(): Promise<void> {\n if (!this.richDataIsInit) {\n const _relsrichValueRel = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n\t <Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\n\t </Relationships>`;\n const rdrichvalue = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n\t <rvData xmlns=\"http://schemas.microsoft.com/office/spreadsheetml/2017/richdata\" count=\"0\">\n\t </rvData>`;\n const rdrichvaluestructure = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n\t <rvStructures xmlns=\"http://schemas.microsoft.com/office/spreadsheetml/2017/richdata\" count=\"1\">\n\t <s t=\"_localImage\">\n\t <k n=\"_rvRel:LocalImageIdentifier\" t=\"i\"/>\n\t <k n=\"CalcOrigin\" t=\"i\"/>\n\t </s>\n\t </rvStructures>`;\n const rdRichValueTypes = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n\t <rvTypesInfo xmlns=\"http://schemas.microsoft.com/office/spreadsheetml/2017/richdata2\"\n\t xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" mc:Ignorable=\"x\"\n\t xmlns:x=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\">\n\t <global>\n\t <keyFlags>\n\t <key name=\"_Self\">\n\t <flag name=\"ExcludeFromFile\" value=\"1\"/>\n\t <flag name=\"ExcludeFromCalcComparison\" value=\"1\"/>\n\t </key>\n\t <key name=\"_DisplayString\">\n\t <flag name=\"ExcludeFromCalcComparison\" value=\"1\"/>\n\t </key>\n\t <key name=\"_Flags\">\n\t <flag name=\"ExcludeFromCalcComparison\" value=\"1\"/>\n\t </key>\n\t <key name=\"_Format\">\n\t <flag name=\"ExcludeFromCalcComparison\" value=\"1\"/>\n\t </key>\n\t <key name=\"_SubLabel\">\n\t <flag name=\"ExcludeFromCalcComparison\" value=\"1\"/>\n\t </key>\n\t <key name=\"_Attribution\">\n\t <flag name=\"ExcludeFromCalcComparison\" value=\"1\"/>\n\t </key>\n\t <key name=\"_Icon\">\n\t <flag name=\"ExcludeFromCalcComparison\" value=\"1\"/>\n\t </key>\n\t <key name=\"_Display\">\n\t <flag name=\"ExcludeFromCalcComparison\" value=\"1\"/>\n\t </key>\n\t <key name=\"_CanonicalPropertyNames\">\n\t <flag name=\"ExcludeFromCalcComparison\" value=\"1\"/>\n\t </key>\n\t <key name=\"_ClassificationId\">\n\t <flag name=\"ExcludeFromCalcComparison\" value=\"1\"/>\n\t </key>\n\t </keyFlags>\n\t </global>\n\t </rvTypesInfo>`;\n const richValueRel = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n\t <richValueRels xmlns=\"http://schemas.microsoft.com/office/spreadsheetml/2022/richvaluerel\"\n\t xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">\n\t </richValueRels>`;\n const metadata = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n\t <metadata xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"\n\t xmlns:xlrd=\"http://schemas.microsoft.com/office/spreadsheetml/2017/richdata\">\n\t <metadataTypes count=\"1\">\n\t <metadataType name=\"XLRICHVALUE\" minSupportedVersion=\"120000\" copy=\"1\" pasteAll=\"1\" pasteValues=\"1\" merge=\"1\" splitFirst=\"1\" rowColShift=\"1\" clearFormats=\"1\" clearComments=\"1\" assign=\"1\" coerce=\"1\"/>\n\t </metadataTypes>\n\t <futureMetadata name=\"XLRICHVALUE\" count=\"0\">\n\t </futureMetadata>\n\t <valueMetadata count=\"0\">\n\t </valueMetadata>\n\t </metadata>`;\n const _relsrichValueRelFileName = 'xl/richData/_rels/richValueRel.xml.rels';\n const rdrichvalueFileName = 'xl/richData/rdrichvalue.xml';\n const rdrichvaluestructureFileName = 'xl/richData/rdrichvaluestructure.xml';\n const rdRichValueTypesFileName = 'xl/richData/rdRichValueTypes.xml';\n const richValueRelFileName = 'xl/richData/richValueRel.xml';\n const metadataFileName = 'xl/metadata.xml';\n this._relsrichValueRel = etree.parse(_relsrichValueRel).getroot();\n this.rdrichvalue = etree.parse(rdrichvalue).getroot();\n this.rdrichvaluestructure = etree.parse(rdrichvaluestructure).getroot();\n this.rdRichValueTypes = etree.parse(rdRichValueTypes).getroot();\n this.richValueRel = etree.parse(richValueRel).getroot();\n this.metadata = etree.parse(metadata).getroot();\n if (this.archive.file(_relsrichValueRelFileName)) {\n const content = await this.archive.file(_relsrichValueRelFileName).async(\"string\");\n this._relsrichValueRel = etree.parse(content).getroot();\n }\n if (this.archive.file(rdrichvalueFileName)) {\n const content = await this.archive.file(rdrichvalueFileName).async(\"string\");\n this.rdrichvalue = etree.parse(content).getroot();\n }\n if (this.archive.file(rdrichvaluestructureFileName)) {\n const content = await this.archive.file(rdrichvaluestructureFileName).async(\"string\");\n this.rdrichvaluestructure = etree.parse(content).getroot();\n }\n if (this.archive.file(rdRichValueTypesFileName)) {\n const content = await this.archive.file(rdRichValueTypesFileName).async(\"string\");\n this.rdRichValueTypes = etree.parse(content).getroot();\n }\n if (this.archive.file(richValueRelFileName)) {\n const content = await this.archive.file(richValueRelFileName).async(\"string\");\n this.richValueRel = etree.parse(content).getroot();\n }\n if (this.archive.file(metadataFileName)) {\n const content = await this.archive.file(metadataFileName).async(\"string\");\n this.metadata = etree.parse(content).getroot();\n }\n this.richDataIsInit = true;\n }\n }\n\n private writeRichDataAlreadyExist(element: any, elementSearchName: string, attributeName: string, attributeValue: string): boolean {\n for (const e of element.findall(elementSearchName)) {\n if (e.attrib[attributeName] == attributeValue) {\n return true;\n }\n }\n return false;\n }\n\n private writeRichData(): void {\n if (this.richDataIsInit) {\n const _relsrichValueRelFileName = 'xl/richData/_rels/richValueRel.xml.rels';\n const rdrichvalueFileName = 'xl/richData/rdrichvalue.xml';\n const rdrichvaluestructureFileName = 'xl/richData/rdrichvaluestructure.xml';\n const rdRichValueTypesFileName = 'xl/richData/rdRichValueTypes.xml';\n const richValueRelFileName = 'xl/richData/richValueRel.xml';\n const metadataFileName = 'xl/metadata.xml';\n const options = {encoding: \"utf-8\"};\n this.archive.file(_relsrichValueRelFileName, etree.tostring(this._relsrichValueRel, options));\n this.archive.file(rdrichvalueFileName, etree.tostring(this.rdrichvalue, options));\n this.archive.file(rdrichvaluestructureFileName, etree.tostring(this.rdrichvaluestructure, options));\n this.archive.file(rdRichValueTypesFileName, etree.tostring(this.rdRichValueTypes, options));\n this.archive.file(richValueRelFileName, etree.tostring(this.richValueRel, options));\n this.archive.file(metadataFileName, etree.tostring(this.metadata, options));\n const broadsideMax = this.findMaxId(this.workbookRels, 'Relationship', 'Id', /rId(\\d*)/);\n let _rel: any;\n if (!this.writeRichDataAlreadyExist(this.workbookRels, 'Relationship', 'Target', \"richData/rdrichvaluestructure.xml\")) {\n _rel = etree.SubElement(this.workbookRels, 'Relationship');\n _rel.set('Id', 'rId' + broadsideMax);\n _rel.set('Type', \"http://schemas.microsoft.com/office/2017/06/relationships/rdRichValueStructure\");\n _rel.set('Target', \"richData/rdrichvaluestructure.xml\");\n }\n if (!this.writeRichDataAlreadyExist(this.workbookRels, 'Relationship', 'Target', \"richData/rdrichvalue.xml\")) {\n _rel = etree.SubElement(this.workbookRels, 'Relationship');\n _rel.set('Id', \"rId\" + (broadsideMax + 1));\n _rel.set('Type', \"http://schemas.microsoft.com/office/2017/06/relationships/rdRichValue\");\n _rel.set('Target', \"richData/rdrichvalue.xml\");\n }\n if (!this.writeRichDataAlreadyExist(this.workbookRels, 'Relationship', 'Target', \"richData/richValueRel.xml\")) {\n _rel = etree.SubElement(this.workbookRels, 'Relationship');\n _rel.set('Id', \"rId\" + (broadsideMax + 2));\n _rel.set('Type', \"http://schemas.microsoft.com/office/2022/10/relationships/richValueRel\");\n _rel.set('Target', \"richData/richValueRel.xml\");\n }\n if (!this.writeRichDataAlreadyExist(this.workbookRels, 'Relationship', 'Target', \"metadata.xml\")) {\n _rel = etree.SubElement(this.workbookRels, 'Relationship');\n _rel.set('Id', \"rId\" + (broadsideMax + 3));\n _rel.set('Type', \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/sheetMetadata\");\n _rel.set('Target', \"metadata.xml\");\n }\n if (!this.writeRichDataAlreadyExist(this.workbookRels, 'Relationship', 'Target', \"richData/rdRichValueTypes.xml\")) {\n _rel = etree.SubElement(this.workbookRels, 'Relationship');\n _rel.set('Id', \"rId\" + (broadsideMax + 4));\n _rel.set('Type', \"http://schemas.microsoft.com/office/2017/06/relationships/rdRichValueTypes\");\n _rel.set('Target', \"richData/rdRichValueTypes.xml\");\n }\n if (!this.writeRichDataAlreadyExist(this.contentTypes, 'Override', 'PartName', \"/xl/metadata.xml\")) {\n let ctOverride = etree.SubElement(this.contentTypes, 'Override');\n ctOverride.set('PartName', \"/xl/metadata.xml\");\n ctOverride.set('ContentType', \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheetMetadata+xml\");\n }\n if (!this.writeRichDataAlreadyExist(this.contentTypes, 'Override', 'PartName', \"/xl/richData/richValueRel.xml\")) {\n let ctOverride = etree.SubElement(this.contentTypes, 'Override');\n ctOverride.set('PartName', \"/xl/richData/richValueRel.xml\");\n ctOverride.set('ContentType', \"application/vnd.ms-excel.richvaluerel+xml\");\n }\n if (!this.writeRichDataAlreadyExist(this.contentTypes, 'Override', 'PartName', \"/xl/richData/rdrichvalue.xml\")) {\n let ctOverride = etree.SubElement(this.contentTypes, 'Override');\n ctOverride.set('PartName', \"/xl/richData/rdrichvalue.xml\");\n ctOverride.set('ContentType', \"application/vnd.ms-excel.rdrichvalue+xml\");\n }\n if (!this.writeRichDataAlreadyExist(this.contentTypes, 'Override', 'PartName', \"/xl/richData/rdrichvaluestructure.xml\")) {\n let ctOverride = etree.SubElement(this.contentTypes, 'Override');\n ctOverride.set('PartName', \"/xl/richData/rdrichvaluestructure.xml\");\n ctOverride.set('ContentType', \"application/vnd.ms-excel.rdrichvaluestructure+xml\");\n }\n if (!this.writeRichDataAlreadyExist(this.contentTypes, 'Override', 'PartName', \"/xl/richData/rdRichValueTypes.xml\")) {\n let ctOverride = etree.SubElement(this.contentTypes, 'Override');\n ctOverride.set('PartName', \"/xl/richData/rdRichValueTypes.xml\");\n ctOverride.set('ContentType', \"application/vnd.ms-excel.rdrichvaluetypes+xml\");\n }\n this._rebuild();\n }\n }\n\n private async substituteImageInCell(cell: any, substitution: any): Promise<boolean> {\n if (substitution == null || substitution == \"\") {\n this.insertCellValue(cell, \"\");\n return true;\n }\n await this.initRichData();\n const maxFildId = this.findMaxFileId(/xl\\/media\\/image\\d*\\..*/, /image(\\d*)\\./);\n const fileExtension = \"jpg\";\n try {\n substitution = this.imageToBuffer(substitution);\n } catch (error) {\n if (this.option && this.option.handleImageError && typeof this.option.handleImageError === \"function\") {\n this.option.handleImageError(substitution, error as Error);\n } else {\n throw error;\n }\n }\n this.archive.file('xl/media/image' + maxFildId + '.' + fileExtension, toArrayBuffer(substitution), {\n binary: true,\n base64: false\n });\n const maxIdRichData = this.findMaxId(this._relsrichValueRel, 'Relationship', 'Id', /rId(\\d*)/);\n const _rel = etree.SubElement(this._relsrichValueRel, 'Relationship');\n _rel.set('Id', 'rId' + maxIdRichData);\n _rel.set('Type', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image');\n _rel.set('Target', '../media/image' + maxFildId + '.' + fileExtension);\n const currentCountedRichValue = this.rdrichvalue.get('count');\n this.rdrichvalue.set('count', parseInt(currentCountedRichValue) + 1);\n const rv = etree.SubElement(this.rdrichvalue, 'rv');\n rv.set('s', \"0\");\n const firstV = etree.SubElement(rv, 'v');\n const secondV = etree.SubElement(rv, 'v');\n firstV.text = currentCountedRichValue;\n secondV.text = \"5\";\n const rel = etree.SubElement(this.richValueRel, 'rel');\n rel.set(\"r:id\", 'rId' + maxIdRichData);\n const futureMetadata = this.metadata.findall('futureMetadata').find((fm: any) => {\n return fm.attrib.name === 'XLRICHVALUE';\n });\n const futureMetadataCount = futureMetadata.get('count');\n futureMetadata.set('count', parseInt(futureMetadataCount) + 1);\n const bk = etree.SubElement(futureMetadata, 'bk');\n const extLst = etree.SubElement(bk, 'extLst');\n const ext = etree.SubElement(extLst, 'ext');\n ext.set(\"uri\", \"{3e2802c4-a4d2-4d8b-9148-e3be6c30e623}\");\n const xlrd_rvb = etree.SubElement(ext, 'xlrd:rvb');\n xlrd_rvb.set(\"i\", futureMetadataCount);\n const valueMetadataCount = this.metadata.find('valueMetadata').get('count');\n this.metadata.find('valueMetadata').set('count', parseInt(valueMetadataCount) + 1);\n const bk_VM = etree.SubElement(this.metadata.find('valueMetadata'), 'bk');\n const rc = etree.SubElement(bk_VM, 'rc');\n const XLRICHVALUEMetaDataTypeIndex = this.metadata.find('metadataTypes').findall('metadataType').findIndex((el: any) => {\n return el.attrib.name === \"XLRICHVALUE\";\n });\n rc.set(\"t\", \"\" + (XLRICHVALUEMetaDataTypeIndex + 1));\n rc.set(\"v\", valueMetadataCount);\n cell.set(\"t\", \"e\");\n cell.set(\"vm\", parseInt(currentCountedRichValue) + 1);\n this.insertCellValue(cell, \"#VALUE!\");\n return true;\n }\n\n private substituteImage(cell: any, string: string, placeholder: Placeholder, substitution: any, drawing: DrawingInfo | null): boolean {\n this.substituteScalar(cell, string, placeholder, '');\n if (substitution == null || substitution == \"\") {\n return true;\n }\n const maxId = this.findMaxId(drawing!.relRoot, 'Relationship', 'Id', /rId(\\d*)/);\n const maxFildId = this.findMaxFileId(/xl\\/media\\/image\\d*.jpg/, /image(\\d*)\\.jpg/);\n const rel = etree.SubElement(drawing!.relRoot, 'Relationship');\n rel.set('Id', 'rId' + maxId);\n rel.set('Type', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image');\n rel.set('Target', '../media/image' + maxFildId + '.jpg');\n try {\n substitution = this.imageToBuffer(substitution);\n } catch (error) {\n if (this.option && this.option.handleImageError && typeof this.option.handleImageError === \"function\") {\n this.option.handleImageError(substitution, error as Error);\n } else {\n throw error;\n }\n }\n this.archive.file('xl/media/image' + maxFildId + '.jpg', toArrayBuffer(substitution), {\n binary: true,\n base64: false\n });\n const dimension = sizeOf(substitution);\n let imageWidth = this.pixelsToEMUs(dimension.width);\n let imageHeight = this.pixelsToEMUs(dimension.height);\n let imageInMergeCell = false;\n for (let mergeCell of this.sheet!.root.findall(\"mergeCells/mergeCell\")) {\n if (this.cellInMergeCells(cell, mergeCell)) {\n const mergeCellWidth = this.getWidthMergeCell(mergeCell, this.sheet! as SheetInfoMust);\n const mergeCellHeight = this.getHeightMergeCell(mergeCell, this.sheet! as SheetInfoMust);\n const mergeWidthEmus = this.columnWidthToEMUs(mergeCellWidth);\n const mergeHeightEmus = this.rowHeightToEMUs(mergeCellHeight);\n const widthRate = imageWidth / mergeWidthEmus;\n const heightRate = imageHeight / mergeHeightEmus;\n if (widthRate > heightRate) {\n imageWidth = Math.floor(imageWidth / widthRate);\n imageHeight = Math.floor(imageHeight / widthRate);\n } else {\n imageWidth = Math.floor(imageWidth / heightRate);\n imageHeight = Math.floor(imageHeight / heightRate);\n }\n imageInMergeCell = true;\n }\n }\n if (!imageInMergeCell) {\n let ratio = 100;\n if (this.option && this.option.imageRatio) {\n ratio = this.option.imageRatio;\n }\n if (ratio <= 0) {\n ratio = 100;\n }\n imageWidth = Math.floor(imageWidth * ratio / 100);\n imageHeight = Math.floor(imageHeight * ratio / 100);\n }\n const imagePart = etree.SubElement(drawing!.root, 'xdr:oneCellAnchor');\n const fromPart = etree.SubElement(imagePart, 'xdr:from');\n const fromCol = etree.SubElement(fromPart, 'xdr:col');\n fromCol.text = (this.charToNum(this.splitRef(cell.attrib.r).col) - 1).toString();\n const fromColOff = etree.SubElement(fromPart, 'xdr:colOff');\n fromColOff.text = '0';\n const fromRow = etree.SubElement(fromPart, 'xdr:row');\n fromRow.text = (this.splitRef(cell.attrib.r).row - 1).toString();\n const fromRowOff = etree.SubElement(fromPart, 'xdr:rowOff');\n fromRowOff.text = '0';\n const extImagePart = etree.SubElement(imagePart, 'xdr:ext', {cx: `${imageWidth}`, cy: `${imageHeight}`});\n const picNode = etree.SubElement(imagePart, 'xdr:pic');\n const nvPicPr = etree.SubElement(picNode, 'xdr:nvPicPr');\n const cNvPr = etree.SubElement(nvPicPr, 'xdr:cNvPr', {id: `${maxId}`, name: 'image_' + maxId, descr: ''});\n const cNvPicPr = etree.SubElement(nvPicPr, 'xdr:cNvPicPr');\n const picLocks = etree.SubElement(cNvPicPr, 'a:picLocks', {noChangeAspect: '1'});\n const blipFill = etree.SubElement(picNode, 'xdr:blipFill');\n const blip = etree.SubElement(blipFill, 'a:blip', {\n \"xmlns:r\": \"http://schemas.openxmlformats.org/officeDocument/2006/relationships\",\n \"r:embed\": \"rId\" + maxId\n });\n const stretch = etree.SubElement(blipFill, 'a:stretch');\n const fillRect = etree.SubElement(stretch, 'a:fillRect');\n const spPr = etree.SubElement(picNode, 'xdr:spPr');\n const xfrm = etree.SubElement(spPr, 'a:xfrm');\n const off = etree.SubElement(xfrm, 'a:off', {x: \"0\", y: \"0\"});\n const ext = etree.SubElement(xfrm, 'a:ext', {cx: `${imageWidth}`, cy: `${imageHeight}`});\n const prstGeom = etree.SubElement(spPr, 'a:prstGeom', {'prst': 'rect'});\n const avLst = etree.SubElement(prstGeom, 'a:avLst');\n const clientData = etree.SubElement(imagePart, 'xdr:clientData');\n return true;\n }\n\n private cloneElement(element: any, deep?: boolean): any {\n const newElement = etree.Element(element.tag, element.attrib);\n newElement.text = element.text;\n newElement.tail = element.tail;\n if (deep !== false) {\n element.getchildren().forEach((child: any) => {\n newElement.append(this.cloneElement(child, deep));\n });\n }\n return newElement;\n }\n\n private replaceChildren(parent: any, children: any[]): void {\n parent.delSlice(0, parent.len());\n children.forEach((child) => {\n parent.append(child);\n });\n }\n\n private getCurrentRow(row: any, rowsInserted: number): number {\n return parseInt(row.attrib.r, 10) + rowsInserted;\n }\n\n private getCurrentCell(cell: any, currentRow: number, cellsInserted: number): string {\n const colRef = this.splitRef(cell.attrib.r).col;\n const colNum = this.charToNum(colRef);\n return this.joinRef({\n row: currentRow,\n col: this.numToChar(colNum + cellsInserted)\n });\n }\n\n private updateRowSpan(row: any, cellsInserted: number): void {\n if (cellsInserted !== 0 && row.attrib.spans) {\n const rowSpan = row.attrib.spans.split(':').map((f: string) => parseInt(f, 10));\n rowSpan[1] += cellsInserted;\n row.attrib.spans = rowSpan.join(\":\");\n }\n }\n\n private splitRange(range: string): Range {\n const split = range.split(\":\");\n return {\n start: split[0],\n end: split[1]\n };\n }\n\n private joinRange(range: Range): string {\n return range.start + \":\" + range.end;\n }\n\n private pushRight(workbook: any, sheet: any, currentCell: string, numCols: number): void {\n const cellRef = this.splitRef(currentCell);\n const currentRow = cellRef.row;\n const currentCol = this.charToNum(cellRef.col);\n sheet.findall(\"mergeCells/mergeCell\").forEach((mergeCell: any) => {\n const mergeRange = this.splitRange(mergeCell.attrib.ref);\n const mergeStart = this.splitRef(mergeRange.start);\n const mergeStartCol = this.charToNum(mergeStart.col);\n const mergeEnd = this.splitRef(mergeRange.end);\n const mergeEndCol = this.charToNum(mergeEnd.col);\n if (mergeStart.row === currentRow && currentCol < mergeStartCol) {\n mergeStart.col = this.numToChar(mergeStartCol + numCols);\n mergeEnd.col = this.numToChar(mergeEndCol + numCols);\n mergeCell.attrib.ref = this.joinRange({\n start: this.joinRef(mergeStart),\n end: this.joinRef(mergeEnd),\n });\n }\n });\n workbook.findall(\"definedNames/definedName\").forEach((name: any) => {\n const ref = name.text;\n if (this.isRange(ref)) {\n const namedRange = this.splitRange(ref);\n const namedStart = this.splitRef(namedRange.start);\n const namedStartCol = this.charToNum(namedStart.col);\n const namedEnd = this.splitRef(namedRange.end);\n const namedEndCol = this.charToNum(namedEnd.col);\n if (namedStart.row === currentRow && currentCol < namedStartCol) {\n namedStart.col = this.numToChar(namedStartCol + numCols);\n namedEnd.col = this.numToChar(namedEndCol + numCols);\n name.text = this.joinRange({\n start: this.joinRef(namedStart),\n end: this.joinRef(namedEnd),\n });\n }\n } else {\n const namedRef = this.splitRef(ref);\n const namedCol = this.charToNum(namedRef.col);\n if (namedRef.row === currentRow && currentCol < namedCol) {\n namedRef.col = this.numToChar(namedCol + numCols);\n name.text = this.joinRef(namedRef);\n }\n }\n });\n sheet.findall(\"hyperlinks/hyperlink\").forEach((hyperlink: any) => {\n const ref = this.splitRef(hyperlink.attrib.ref);\n const colNumber = this.charToNum(ref.col);\n if (colNumber > currentCol) {\n ref.col = this.numToChar(colNumber + numCols);\n hyperlink.attrib.ref = this.joinRef(ref);\n }\n });\n }\n\n private pushDown(workbook: any, sheet: any, tables: TableInfo[], currentRow: number, numRows: number): void {\n const mergeCells = sheet.find(\"mergeCells\");\n sheet.findall(\"mergeCells/mergeCell\").forEach((mergeCell: any) => {\n const mergeRange = this.splitRange(mergeCell.attrib.ref);\n const mergeStart = this.splitRef(mergeRange.start);\n const mergeEnd = this.splitRef(mergeRange.end);\n if (mergeStart.row > currentRow) {\n mergeStart.row += numRows;\n mergeEnd.row += numRows;\n mergeCell.attrib.ref = this.joinRange({\n start: this.joinRef(mergeStart),\n end: this.joinRef(mergeEnd),\n });\n }\n if (mergeStart.row == currentRow) {\n for (let i = 1; i <= numRows; i++) {\n const newMergeCell = this.cloneElement(mergeCell);\n mergeStart.row += 1;\n mergeEnd.row += 1;\n newMergeCell.attrib.ref = this.joinRange({\n start: this.joinRef(mergeStart),\n end: this.joinRef(mergeEnd)\n });\n mergeCells.attrib.count += 1;\n mergeCells._children.push(newMergeCell);\n }\n }\n });\n tables.forEach((table) => {\n const tableRoot = table.root;\n const tableRange = this.splitRange(tableRoot.attrib.ref);\n const tableStart = this.splitRef(tableRange.start);\n const tableEnd = this.splitRef(tableRange.end);\n if (tableStart.row > currentRow) {\n tableStart.row += numRows;\n tableEnd.row += numRows;\n tableRoot.attrib.ref = this.joinRange({\n start: this.joinRef(tableStart),\n end: this.joinRef(tableEnd),\n });\n const autoFilter = tableRoot.find(\"autoFilter\");\n if (autoFilter !== null) {\n autoFilter.attrib.ref = tableRoot.attrib.ref;\n }\n }\n });\n workbook.findall(\"definedNames/definedName\").forEach((name: any) => {\n const ref = name.text;\n if (this.isRange(ref)) {\n const namedRange = this.splitRange(ref);\n const namedStart = this.splitRef(namedRange.start);\n const namedEnd = this.splitRef(namedRange.end);\n if (namedStart) {\n if (namedStart.row > currentRow) {\n namedStart.row += numRows;\n namedEnd.row += numRows;\n name.text = this.joinRange({\n start: this.joinRef(namedStart),\n end: this.joinRef(namedEnd),\n });\n }\n }\n if (this.option && this.option.pushDownPageBreakOnTableSubstitution) {\n if (this.sheet!.name == name.text.split(\"!\")[0].replace(/'/gi, \"\") && namedEnd) {\n if (namedEnd.row > currentRow) {\n namedEnd.row += numRows;\n name.text = this.joinRange({\n start: this.joinRef(namedStart),\n end: this.joinRef(namedEnd),\n });\n }\n }\n }\n } else {\n const namedRef = this.splitRef(ref);\n if (namedRef.row > currentRow) {\n namedRef.row += numRows;\n name.text = this.joinRef(namedRef);\n }\n }\n });\n sheet.findall(\"hyperlinks/hyperlink\").forEach((hyperlink: any) => {\n const ref = this.splitRef(hyperlink.attrib.ref);\n if (ref.row > currentRow) {\n ref.row += numRows;\n hyperlink.attrib.ref = this.joinRef(ref);\n }\n });\n }\n\n async hideCols(sheetName: string | number, hideItemIndexes: number[]): Promise<this> {\n const sheet = await this.loadSheet(sheetName);\n this.sheet = sheet;\n if (Array.isArray(hideItemIndexes) && hideItemIndexes.length) {\n const cols = sheet.root.find(\"cols\");\n if (cols) {\n hideItemIndexes.forEach((hideIndex) => {\n const colIndex = hideIndex + 1;\n const col = cols.findall(\"col\").find((c: any) => {\n const min = parseInt(c.attrib.min, 10);\n const max = parseInt(c.attrib.max, 10);\n return colIndex >= min && colIndex <= max;\n });\n if (col) {\n col.attrib.hidden = \"1\";\n }\n });\n }\n }\n this.archive.file(sheet.filename, etree.tostring(sheet.root, {encoding: 'utf-8'}));\n this._rebuild();\n return this;\n }\n\n private getWidthCell(numCol: number, sheet: SheetInfo | SheetInfoMust): number {\n let defaultWidth = sheet.root.find(\"sheetFormatPr\").attrib[\"defaultColWidth\"];\n if (!defaultWidth) {\n defaultWidth = \"11.42578125\";\n }\n let finalWidth = defaultWidth;\n sheet.root.findall(\"cols/col\").forEach((col: any) => {\n if (numCol >= col.attrib[\"min\"] && numCol <= col.attrib[\"max\"]) {\n if (col.attrib[\"width\"] != undefined) {\n finalWidth = col.attrib[\"width\"];\n }\n }\n });\n return Number.parseFloat(finalWidth);\n }\n\n private getWidthMergeCell(mergeCell: any, sheet: SheetInfoMust): number {\n let mergeWidth = 0;\n const mergeRange = this.splitRange(mergeCell.attrib.ref);\n const mergeStartCol = this.charToNum(this.splitRef(mergeRange.start).col);\n const mergeEndCol = this.charToNum(this.splitRef(mergeRange.end).col);\n for (let i = mergeStartCol; i < mergeEndCol + 1; i++) {\n mergeWidth += this.getWidthCell(i, sheet);\n }\n return mergeWidth;\n }\n\n private getHeightCell(numRow: number, sheet: SheetInfoMust): number {\n let finalHeight = sheet.root.find(\"sheetFormatPr\").attrib[\"defaultRowHeight\"];\n sheet.root.findall(\"sheetData/row\").forEach((row: any) => {\n if (numRow == row.attrib[\"r\"]) {\n if (row.attrib[\"ht\"] != undefined) {\n finalHeight = row.attrib[\"ht\"];\n }\n }\n });\n return Number.parseFloat(finalHeight);\n }\n\n private getHeightMergeCell(mergeCell: any, sheet: SheetInfoMust): number {\n let mergeHeight = 0;\n const mergeRange = this.splitRange(mergeCell.attrib.ref);\n const mergeStartRow = this.splitRef(mergeRange.start).row;\n const mergeEndRow = this.splitRef(mergeRange.end).row;\n for (let i = mergeStartRow; i < mergeEndRow + 1; i++) {\n mergeHeight += this.getHeightCell(i, sheet);\n }\n return mergeHeight;\n }\n\n private getNbRowOfMergeCell(mergeCell: any): number {\n const mergeRange = this.splitRange(mergeCell.attrib.ref);\n const mergeStartRow = this.splitRef(mergeRange.start).row;\n const mergeEndRow = this.splitRef(mergeRange.end).row;\n return mergeEndRow - mergeStartRow + 1;\n }\n\n private pixelsToEMUs(pixels: number): number {\n return Math.round(pixels * 914400 / 96);\n }\n\n private columnWidthToEMUs(width: number): number {\n return this.pixelsToEMUs(width * 7.625579987895905);\n }\n\n private rowHeightToEMUs(height: number): number {\n return Math.round(height / 72 * 914400);\n }\n\n private findMaxFileId(fileNameRegex: RegExp, idRegex: RegExp): number {\n const files = this.archive.file(fileNameRegex);\n const maxId = files.reduce((p: number, c: any) => {\n const num = parseInt(idRegex.exec(c.name)![1]);\n if (p == null) {\n return num;\n }\n return p > num ? p : num;\n }, 0);\n return maxId + 1;\n }\n\n private cellInMergeCells(cell: any, mergeCell: any): boolean {\n const cellCol = this.charToNum(this.splitRef(cell.attrib.r).col);\n const cellRow = this.splitRef(cell.attrib.r).row;\n const mergeRange = this.splitRange(mergeCell.attrib.ref);\n const mergeStartCol = this.charToNum(this.splitRef(mergeRange.start).col);\n const mergeEndCol = this.charToNum(this.splitRef(mergeRange.end).col);\n const mergeStartRow = this.splitRef(mergeRange.start).row;\n const mergeEndRow = this.splitRef(mergeRange.end).row;\n if (cellCol >= mergeStartCol && cellCol <= mergeEndCol) {\n if (cellRow >= mergeStartRow && cellRow <= mergeEndRow) {\n return true;\n }\n }\n return false;\n }\n\n private imageToBuffer(imageObj: any): Buffer {\n function checkImage(buffer: Buffer): Buffer {\n try {\n sizeOf(buffer);\n return buffer;\n } catch (error) {\n throw new TypeError('imageObj cannot be parse as a buffer image');\n }\n }\n\n if (!imageObj) {\n throw new TypeError('imageObj cannot be null');\n }\n if (imageObj instanceof Buffer) {\n return checkImage(imageObj);\n }\n if (typeof (imageObj) === 'string' || imageObj instanceof String) {\n imageObj = imageObj.toString();\n const imagePath = this.option && this.option.imageRootPath\n ? this.option.imageRootPath + \"/\" + imageObj\n : imageObj;\n if (fs.existsSync(imagePath)) {\n return checkImage(Buffer.from(fs.readFileSync(imagePath, {encoding: 'base64'}), 'base64'));\n }\n try {\n return checkImage(Buffer.from(imageObj, 'base64'));\n } catch (error) {\n throw new TypeError('imageObj cannot be parse as a buffer');\n }\n }\n throw new TypeError(\"imageObj type is not supported : \" + typeof (imageObj));\n }\n\n private findMaxId(element: any, tag: string, attr: string, idRegex: RegExp): number {\n let maxId = 0;\n element.findall(tag).forEach((el: any) => {\n const match = idRegex.exec(el.attrib[attr]);\n if (match == null) {\n throw new Error(\"Can not find the id!\");\n }\n const cid = parseInt(match[1]);\n if (cid > maxId) {\n maxId = cid;\n }\n });\n return ++maxId;\n }\n}\n\n// xlsx 模板 生成 - 函数一键调用\nconst generateXlsxTemplate = async function <T extends JsZip.OutputType>(data: Buffer, values: Object, options?: JsZip.JSZipGeneratorOptions<T> & FullOptions): Promise<OutputByType[T]> {\n const w = await Workbook.parse(data,options);\n await w.substituteAll(values);\n return w.generate(options);\n}\n\nexport {\n Workbook,\n Placeholder,\n Ref,\n Range,\n SheetInfo,\n DrawingInfo,\n TableInfo,\n RelsInfo,\n WorkbookOptions,\n ExtensionOptions,\n FullOptions,\n CustomReplacer,\n CustomPlaceholderExtractor,\n BeforeReplaceHook,\n AfterReplaceHook,\n CustomFormatter,\n OutputByType,\n BufferType,\n defaultFormatters,\n QueryFunction,\n toArrayBuffer,\n isUrl,\n valueDotGet,\n defaultValueDotGet,\n defaultExtractPlaceholders,\n generateXlsxTemplate,\n}","import exceljs from \"exceljs\";\nimport {Stream} from \"stream\";\n\ntype CellPosition = {\n Row: string;\n Column: number;\n Sheet?: string | number;\n};\n\ntype MergeCellRange = {\n top: number;\n left: number;\n bottom: number;\n right: number\n}\n\ntype CellPoint = {\n Row: number,\n Column: number,\n}\n\ninterface PlaceholderCellValue {\n toString(): string;\n\n mergeCell(values: string[]): string;\n}\n\ntype ScanTokenData = {\n value: string;\n token: string;\n}\n\ntype MacroArgs = {\n type: string\n columnParam: number\n rowParam: number[] | number\n formatter?: string\n}\n\ntype ExtractMacroArgs = {\n argToken: string\n startToken: string\n endToken: string\n}\n\nconst isPureNumber = /^[0-9]+$/;\nconst isPureUppercase = /^[A-Z]+$/;\nconst exprSingle = `expr`;\nconst exprArr = `exprArr`;\nconst exprIndex = `index`;\nconst defaultKey = `!!`;\nconst numberKey = `!!number`;\nconst codeKey = `!!codeKey`;\nconst funcCommand = \"fn:\";\n\nenum RuleToken {\n AliasToken = 'alias',\n CellToken = 'cell',\n MergeCellToken = 'mergeCell',\n RowCellToken = 'rowCell',\n UseAliasToken = '@',\n RangeToken = '-',\n PosToken = ':',\n FunctionPatternToken = '<?>',\n AnyToken = '?',\n VarPatternToken = '${?}',\n UndefinedToken = '',\n EqualToken = '=',\n ArgPosToken = ',',\n LparenToken = '(',\n RparenToken = ')',\n DotGetToken = '.',\n CompileGenToken = 'compile:GenCell',\n CompileMacroToken = 'compile:Macro',\n\n}\n\ntype RuleValue = {\n express: string;\n tokens: RuleToken[]; // express tokens\n cells?: CellPoint[];\n key?: string; // alias key\n ref?: string[]; // alias refs\n func?: string; // express ref function name\n compileExpress?: string[];// compileExpress\n posExpr?: RuleValue; // pos Expr\n funcExpr?: RuleValue; // function funcExpr\n value: string | number[] | number | CellPoint | RangeCell | any[]; // alias value\n // extends\n [key: string]: any;\n}\n\ntype RuleResult = {\n rules: Map<RuleToken, RuleValue[]>;\n}\n\ntype FilterMacroResult = {\n tokens: RuleToken[];\n express: string[];\n}\n\ntype CompileChecker = (iv: RuleResult, ctx: RuleMapOptions) => Error[] | undefined\n\ninterface RuleOptions {\n startLine?: number;\n endLine?: number;\n endColumn?: number;\n startColumn?: number;\n // rule token alias settings\n ruleKeyMap?: Map<RuleToken, string>;\n // compile settings\n compileCheckers?: CompileChecker[];\n compileSheets?: string[];\n\n // extends for custom\n [key: string]: any;\n\n setEndRow(end: number): RuleOptions;\n\n parseToken(value: string): RuleToken;\n\n setEndColumn(end: number): RuleOptions;\n\n setStartRow(start: number): RuleOptions;\n\n setStartColumn(start: number): RuleOptions;\n\n getContextMap(): Map<RuleToken, RuleValue[]>;\n\n addRuleMap(key: RuleToken, value: string): RuleOptions;\n\n parseDefault(worksheet: exceljs.Worksheet): RuleOptions;\n\n getCompileCheckHandlers(): CompileChecker[] | undefined;\n}\n\ninterface RangeCell {\n minRow: number;\n maxRow: number;\n stepRow: number;\n minColumn: number;\n maxColumn: number;\n stepColumn: number;\n\n getCells(): CellPoint[];\n}\n\nclass RuleMapOptions implements RuleOptions {\n // rule configure area\n startLine?: number = 1;\n endLine?: number;\n endColumn?: number;\n startColumn?: number = 1;\n // rule token alias settings\n ruleKeyMap?: Map<RuleToken, string>;\n // compile settings\n compileCheckers?: CompileChecker[];\n compileSheets?: string[];\n\n // extends for custom\n [key: string]: any;\n\n constructor(m?: Map<RuleToken, string>) {\n if (m === undefined) {\n this.ruleKeyMap = defaultRuleTokenMap;\n } else {\n this.ruleKeyMap = m;\n }\n }\n\n static withAllSheets(w: exceljs.Workbook, excludes?: string[]): RuleOptions {\n const compileSheets = [];\n const options = new RuleMapOptions();\n if (excludes === undefined) {\n excludes = [];\n }\n if (w.worksheets.length > 0 && excludes.length > 0) {\n for (const [index, sheet] of w.worksheets.entries()) {\n if (excludes.includes(index.toString()) || excludes.includes(sheet.name)) {\n continue;\n }\n if (sheet.name.endsWith(\".json\")) {\n continue;\n }\n compileSheets.push(sheet.name);\n }\n }\n options.compileSheets = compileSheets;\n return options;\n }\n\n parseDefault(worksheet: exceljs.Worksheet): RuleOptions {\n this.ruleKeyMap = mergeOption(this.ruleKeyMap, defaultRuleTokenMap);\n if (this.startLine === undefined) {\n this.startLine = 1;\n }\n if (this.endLine === undefined) {\n this.endLine = worksheet.rowCount;\n }\n if (this.startColumn === undefined) {\n this.startColumn = 1;\n }\n if (this.endColumn === undefined) {\n this.endColumn = worksheet.columnCount;\n }\n return this;\n }\n\n addRuleMap(key: RuleToken, value: string): RuleOptions {\n this.ruleKeyMap.set(key, value);\n return this;\n }\n\n setStartRow(start: number): RuleOptions {\n this.startLine = start;\n return this;\n }\n\n setStartColumn(start: number): RuleOptions {\n this.startColumn = start;\n return this;\n }\n\n setEndRow(end: number): RuleOptions {\n this.endLine = end;\n return this;\n }\n\n setEndColumn(end: number): RuleOptions {\n this.endColumn = end;\n return this;\n }\n\n parseToken(value: string): RuleToken {\n if (value === \"\") {\n return RuleToken.UndefinedToken;\n }\n for (const [token, alias] of this.ruleKeyMap.entries()) {\n if (alias === value) {\n return token;\n }\n }\n return RuleToken.UndefinedToken;\n }\n\n getContextMap(): Map<RuleToken, RuleValue[]> {\n const ctx = new Map<RuleToken, RuleValue[]>();\n for (const [token, expr] of this.ruleKeyMap.entries()) {\n if (!isRuleToken(token)) {\n const value: RuleValue[] = [{\n express: expr,\n key: expr,\n tokens: [token],\n value: token.toString(),\n }];\n ctx.set(token, value);\n }\n }\n return ctx;\n }\n\n getCompileCheckHandlers(): CompileChecker[] | undefined {\n if (this.compileCheckers !== undefined && this.compileCheckers.length > 0) {\n return this.compileCheckers;\n }\n return undefined;\n }\n\n}\n\nclass CompileContext extends RuleMapOptions {\n private aliasMap: Map<string, string> = new Map<string, string>();\n\n sheet?: exceljs.Worksheet;\n\n constructor(m?: Map<RuleToken, string>) {\n super(m);\n }\n\n static create(r: RuleMapOptions): CompileContext {\n const ctx = new CompileContext(r.ruleKeyMap);\n Object.assign(ctx, {...r})\n return ctx.init();\n }\n\n private init(): this {\n if (this.ruleKeyMap === undefined) {\n this.ruleKeyMap = defaultRuleTokenMap;\n }\n return this;\n }\n\n loadAlias(m: Map<RuleToken, RuleValue[]>): this {\n if (m.size <= 0 || !m.has(RuleToken.AliasToken)) {\n return this;\n }\n const values = m.get(RuleToken.AliasToken);\n for (const vs of values) {\n if (typeof vs.value === \"string\") {\n this.aliasMap.set(vs.key, vs.value as string);\n }\n }\n return this;\n }\n\n /**\n * 设置别名缓存\n */\n public setAlias(key: string, value: string): void {\n this.aliasMap.set(key, value);\n }\n\n /**\n * 获取别名缓存值\n */\n public getAlias(key: string): string | undefined {\n return this.aliasMap.get(key);\n }\n\n /**\n * 检查别名是否存在\n */\n public hasAlias(key: string): boolean {\n return this.aliasMap.has(key);\n }\n\n public filterSheet(sheetName: string): boolean {\n if (sheetName !== \"\" && this.compileSheets !== undefined && this.compileSheets.length > 0) {\n return this.compileSheets.includes(sheetName)\n }\n return false;\n }\n\n}\n\ntype TokenParserReply = {\n ok: boolean\n values?: any,\n expr?: RuleValue,\n [key: string]: any;\n}\n\ntype TokenParser = (ctx: Map<RuleToken, RuleValue[]>, t: RuleToken, value: string) => TokenParserReply;\n\ntype TokenParseResolver = { exists: boolean, handler?: TokenParser }\n\ntype RangeValueParserOptions = {\n rowRange: number;\n columnRange: number;\n row: string;\n column: string;\n express: string;\n token: RuleToken;\n};\n\nconst defaultRuleTokenMap = new Map<RuleToken, string>([\n [RuleToken.AliasToken, RuleToken.AliasToken.toString()],\n [RuleToken.AnyToken, RuleToken.AnyToken.toString()],\n [RuleToken.CellToken, RuleToken.CellToken.toString()],\n [RuleToken.RowCellToken, RuleToken.RowCellToken.toString()],\n [RuleToken.MergeCellToken, RuleToken.MergeCellToken.toString()],\n [RuleToken.UseAliasToken, RuleToken.UseAliasToken.toString()],\n [RuleToken.PosToken, RuleToken.PosToken.toString()],\n [RuleToken.RangeToken, RuleToken.RangeToken.toString()],\n [RuleToken.FunctionPatternToken, RuleToken.FunctionPatternToken.toString()],\n [RuleToken.VarPatternToken, RuleToken.VarPatternToken.toString()],\n [RuleToken.EqualToken, RuleToken.EqualToken.toString()],\n [RuleToken.ArgPosToken, RuleToken.ArgPosToken.toString()],\n [RuleToken.LparenToken, RuleToken.LparenToken.toString()],\n [RuleToken.RparenToken, RuleToken.RparenToken.toString()],\n [RuleToken.DotGetToken, RuleToken.DotGetToken.toString()],\n [RuleToken.CompileMacroToken, RuleToken.CompileMacroToken.toString()],\n [RuleToken.CompileGenToken, RuleToken.CompileGenToken.toString()],\n]);\n\nclass DefaultPlaceholderCellValue implements PlaceholderCellValue {\n private readonly placeholder: string;\n private readonly mergeCellPlaceholder?: string;\n\n constructor(p: string, merge?: string) {\n this.placeholder = p;\n this.mergeCellPlaceholder = merge === undefined ? \"\" : merge;\n }\n\n mergeCell(values: string[]): string {\n if (this.mergeCellPlaceholder !== undefined) {\n return this.mergeCellPlaceholder.replace(\"?\", values.join(\",\"));\n }\n return \"\";\n }\n\n toString(): string {\n return this.placeholder;\n }\n}\n\nconst _getCells = (thisArg: RangeCell): CellPoint[] => {\n let cells: CellPoint[] = [];\n for (let j = thisArg.minColumn; j <= thisArg.maxColumn; j += thisArg.stepColumn) {\n for (let i = thisArg.minRow; i <= thisArg.maxRow; i += thisArg.stepRow) {\n cells.push({\n Row: i,\n Column: j,\n });\n }\n }\n return cells;\n}\n\nclass TokenParserManger {\n\n // T=xxx\n static aliasParse(ctx: Map<RuleToken, RuleValue[]>, token: RuleToken, value: string): TokenParserReply {\n if (token !== RuleToken.AliasToken) {\n return {\n ok: false\n }\n }\n // value eg: T=xxx.xxx.Tell\n const parser = getTokenParser(RuleToken.EqualToken);\n const {values, expr, ok} = parser.handler(ctx, RuleToken.EqualToken, value);\n if (!ok) {\n return {\n ok: false,\n }\n }\n if (typeof expr.value !== \"string\" || expr.value === \"\") {\n return {\n ok: false,\n error: new Error(`alias express right value cannot be a empty value.`),\n }\n }\n return {\n ok: true,\n expr: {\n express: value,\n key: expr.key, // alias key\n value: expr.value, // alias value\n tokens: [token, RuleToken.EqualToken], // express tokens\n },\n values: values,\n }\n }\n\n // x=xx\n static equalParse(ctx: Map<RuleToken, RuleValue[]>, token: RuleToken, value: string): TokenParserReply {\n if (token !== RuleToken.EqualToken) {\n return {\n ok: false,\n }\n }\n const equalToken = TokenParserManger.getTokenByCtx(ctx, RuleToken.EqualToken);\n const offset = equalToken.length;\n const index = value.indexOf(equalToken);\n if (index < 0) {\n return {\n ok: false,\n }\n }\n const len = value.length;\n const key = value.substring(0, index);\n const rightValue = value.substring(index + offset, len);\n if (rightValue === \"\") {\n return {\n ok: false,\n error: new Error(`equal express right value cannot be a empty value.`),\n }\n }\n const expr: RuleValue = {\n key: key,\n value: rightValue,\n express: value,\n tokens: [token],\n }\n return {\n ok: true,\n values: [key, rightValue],\n expr,\n }\n }\n\n //cell| X:Y=${?}\n static cellParse(ctx: Map<RuleToken, RuleValue[]>, token: RuleToken, value: string): TokenParserReply {\n if (token !== RuleToken.CellToken) {\n return {\n ok: false\n }\n }\n const equalToken = TokenParserManger.getTokenByCtx(ctx, RuleToken.EqualToken);\n const eqOffset = equalToken.length;\n const posToken = TokenParserManger.getTokenByCtx(ctx, RuleToken.PosToken);\n const eqIndex = value.indexOf(equalToken);\n const posIndex = value.indexOf(posToken);\n if (eqIndex < 0 || posIndex < 0) {\n return {\n ok: false,\n }\n }\n const parser = getTokenParser(RuleToken.PosToken);\n const varParser = getTokenParser(RuleToken.VarPatternToken);\n const posValue = value.substring(0, eqIndex);\n const varValue = value.substring(eqIndex + eqOffset);\n const posReply = parser.handler(ctx, RuleToken.PosToken, posValue);\n if (!posReply.ok) {\n return {\n ok: false,\n ...posReply,\n }\n }\n const varReply = varParser.handler(ctx, RuleToken.VarPatternToken, varValue);\n if (!varReply.ok) {\n return {\n ok: false,\n ...varReply,\n }\n }\n const expr: RuleValue = {\n ...varReply.expr,\n };\n expr.express = value\n expr.cells = posReply.expr.cells\n expr.value = varReply.expr.value // var expr value\n expr.ref = varReply.expr.ref // alias refs\n expr.tokens = [token, RuleToken.EqualToken, ...posReply.expr.tokens, ...varReply.expr.tokens]// token\n return {\n ok: true,\n expr: expr,\n values: [posReply.values, varReply.values],\n }\n }\n\n static useAliasParse(ctx: Map<RuleToken, RuleValue[]>, token: RuleToken, value: string): TokenParserReply {\n if (token !== RuleToken.UseAliasToken) {\n return {\n ok: false,\n }\n }\n // @X.test or @X.@T or @U@T\n const useAliasToken = TokenParserManger.getTokenByCtx(ctx, RuleToken.UseAliasToken);\n const offset = useAliasToken.length;\n const has = offset !== 0 && value.indexOf(useAliasToken) >= 0;\n if (!has) {\n return {\n ok: false,\n }\n }\n const endTokens = [RuleToken.UseAliasToken, RuleToken.LparenToken, RuleToken.ArgPosToken, RuleToken.DotGetToken];\n const values = TokenParserManger.scanToken(value, useAliasToken, TokenParserManger.toList(ctx, endTokens));\n if (values === undefined || values.length <= 0) {\n return {\n ok: false,\n }\n }\n const keys: string[] = [];\n const tokens: RuleToken[] = [];\n const expr: RuleValue = {\n express: value,\n tokens: tokens,\n value: keys,\n ref: [],\n }\n for (const v of values) {\n tokens.push(token);\n keys.push(v.token);\n expr.ref.push(v.value);\n }\n expr.value = keys\n expr.tokens = tokens\n return {\n expr,\n ok: true,\n values: values,\n }\n }\n\n static rangeParse(ctx: Map<RuleToken, RuleValue[]>, token: RuleToken, value: string): TokenParserReply {\n // A-AA or A-AZ or 1-7 or 1-7,2 [step] or A-Z,2 [step]\n if (token !== RuleToken.RangeToken) {\n return {\n ok: false,\n }\n }\n const rangeToken = TokenParserManger.getTokenByCtx(ctx, RuleToken.RangeToken);\n const offset = rangeToken.length;\n const index = value.indexOf(rangeToken);\n if (index < 0 || offset <= 0) {\n return {\n ok: false,\n }\n }\n let setup = 1;\n let startNumber: number = NaN;\n let endNumber: number = NaN;\n let startPos = value.substring(0, index).trim();\n let endPos = value.substring(index + offset).trim();\n const argPosToken = TokenParserManger.getTokenByCtx(ctx, RuleToken.ArgPosToken);\n const endSetupIndex = endPos.indexOf(argPosToken);\n if (endSetupIndex > 0) {\n setup = Number.parseInt(endPos.substring(endSetupIndex).trim(), 10);\n endPos = endPos.substring(0, endSetupIndex).trim()\n }\n if (isNaN(setup)) {\n return {\n ok: false,\n error: new Error(`rangeToken parse setup NaN, ${value}`),\n }\n }\n endNumber = TokenParserManger.parsePosNumber(endPos);\n startNumber = TokenParserManger.parsePosNumber(startPos);\n if (isNaN(startNumber) || isNaN(endNumber)) {\n return {\n ok: false,\n error: new Error(`rangeToken parse start,end has NaN, ${value}`),\n }\n }\n const expr: RuleValue = {\n express: value,\n tokens: [token],\n value: [startNumber, endNumber, setup],\n };\n return {\n expr,\n ok: true,\n values: [startNumber, endNumber, setup],\n }\n }\n\n static posParse(ctx: Map<RuleToken, RuleValue[]>, token: RuleToken, value: string): TokenParserReply {\n if (token !== RuleToken.PosToken) {\n return {\n ok: false\n }\n }\n // A:1 or A-Z:1 or A:1-10 or A-AA:2-10\n const posToken = TokenParserManger.getTokenByCtx(ctx, RuleToken.PosToken);\n const offset = posToken.length;\n const index = value.indexOf(posToken);\n const len = value.length;\n const column = value.substring(0, index).trim(); // column\n const row = value.substring(index + offset, len).trim(); // row\n const rangeToken = TokenParserManger.getTokenByCtx(ctx, RuleToken.RangeToken);\n const columnRange = column.indexOf(rangeToken);\n const rowRange = row.indexOf(rangeToken);\n if (rowRange > 0 || columnRange > 0) {\n return TokenParserManger.parseRangeValue(ctx, {rowRange, columnRange, row, column, token, express: value})\n }\n const cell: CellPoint = {\n Row: Number.parseInt(row, 10),\n Column: columnLetterToNumber(column),\n };\n const expr: RuleValue = {\n value: cell,\n cells: [cell],\n express: value,\n tokens: [token],\n }\n return {\n ok: true,\n values: [row, column],\n expr,\n }\n }\n\n // value input: A-AQ:13-15=<sum(#,[compile:Macro(exprArr,[F],[13,15],!codeKey)],compile:Marco(index),0)>\n // output: {\n // A:13 => sum(#,[ codeKey(F:13.value),codeKey(F:14.value),codeKey(F:15.value)],1,0),\n // B:13 => sum(#,[ codeKey(F:13.value),codeKey(F:14.value),codeKey(F:15.value)],2,0),\n // C:13 => sum(#,[ codeKey(F:13.value),codeKey(F:14.value),codeKey(F:15.value)],3,0),\n // ....,\n // A:14 => sum(#,[ codeKey(F:13.value),codeKey(F:14.value),codeKey(F:15.value)],1,0),\n // B:14 => sum(#,[ codeKey(F:13.value),codeKey(F:14.value),codeKey(F:15.value)],2,0),\n // C:14 => sum(#,[ codeKey(F:13.value),codeKey(F:14.value),codeKey(F:15.value)],3,0),\n // }\n static mergeCellParse(ctx: Map<RuleToken, RuleValue[]>, token: RuleToken, value: string): TokenParserReply {\n // Logic: Range=Expression. Eg: A-AQ:13-15=<sum(...)>\n if (token !== RuleToken.MergeCellToken && token !== RuleToken.RowCellToken) {\n return {ok: false};\n }\n const equalToken = TokenParserManger.getTokenByCtx(ctx, RuleToken.EqualToken);\n const index = value.indexOf(equalToken);\n const offset = equalToken.length;\n if (index <= 0) return {ok: false, error: new Error(`merge cell config syntax error: ${value}`)};\n const rangeStr = value.substring(0, index).trim();\n const exprStr = value.substring(index + offset)\n // Parse Range (PosToken logic usually handles X:Y, here we wrap it)\n // We reuse PosToken parsing logic which handles ranges via RangeToken\n const posParser = getTokenParser(RuleToken.PosToken);\n const posReply = posParser.handler(ctx, RuleToken.PosToken, rangeStr);\n const functionToken = getTokenParser(RuleToken.FunctionPatternToken);\n if (!posReply.ok) return {ok: false, ...posReply};\n const macroGenToken = TokenParserManger.getTokenByCtx(ctx, RuleToken.CompileGenToken);\n // Parse Expression (could be function, var, or raw string)\n // We treat the right side as a raw string or simple token for the generator to handle\n const expr: RuleValue = {\n express: value,\n value: exprStr, // The template expression\n posExpr: posReply.expr,\n tokens: [token, ...posReply.expr.tokens],\n };\n if (exprStr.startsWith(macroGenToken)) {\n const argsSplitToken = TokenParserManger.getTokenByCtx(ctx, RuleToken.ArgPosToken);\n const args = TokenParserManger.split(exprStr, argsSplitToken, [`(`, `)`]);\n const macro = TokenParserManger.filterMacro(args);\n const aliasTokens = TokenParserManger.extractUseAliasTokens(ctx, args);\n if (aliasTokens !== undefined && aliasTokens.length > 0) {\n expr.tokens.push(...aliasTokens);\n }\n if (macro !== undefined && macro.tokens.length > 0) {\n expr.macro = macro;\n expr.tokens.push(...macro.tokens);\n }\n } else {\n const exprReply = functionToken.handler(ctx, RuleToken.FunctionPatternToken, exprStr);\n if (exprReply.error !== undefined && exprReply.error instanceof Error) {\n return {\n ok: false,\n ...exprReply,\n }\n }\n if (exprReply.ok && exprReply.expr !== undefined) {\n expr.funcExpr = exprReply.expr\n expr.tokens.push(...exprReply.expr.tokens);\n }\n }\n return {\n ok: true,\n expr,\n values: [rangeStr, exprStr],\n };\n }\n\n // G-AQ:12=compile:GenCell(compile:Macro(expr,F,12),'.',compile:Marco(index))\n static rowCellParse(ctx: Map<RuleToken, RuleValue[]>, token: RuleToken, value: string): TokenParserReply {\n // Logic: G-AQ:12=compile:GenCell(...)\n if (token !== RuleToken.RowCellToken) {\n return {ok: false};\n }\n // Reuse logic similar to mergeCellParse for range/expression split\n return TokenParserManger.mergeCellParse(ctx, token, value);\n }\n\n // $functionName($arg0:string,$arg1:string[],$arg2:string|number,$arg3:string|number)\n // eg: func(A,[xx1,xx2],xxx3), sum(#,[F,12,13],1,0)\n // $functionName not in compile:Macro,compile:GenCell\n // extract => {func:$functionName, arguments:[$arg0,$arg1,$arg2,$argN...]}\n // output: {func:\"sum\",arguments:[\"A\",[\"F\",\"12\",\"13\"],\"1\",\"0\"]}\n static functionPatternParse(ctx: Map<RuleToken, RuleValue[]>, token: RuleToken, value: string): TokenParserReply {\n // <?> or <functionName(args)>\n if (token !== RuleToken.FunctionPatternToken) {\n return {ok: false};\n }\n const wordToken = TokenParserManger.getTokenByCtx(ctx, RuleToken.AnyToken);\n const funcToken = TokenParserManger.getTokenByCtx(ctx, RuleToken.FunctionPatternToken);\n const splitIndex = funcToken.indexOf(wordToken);\n const splitOffset = wordToken.length;\n const funcStartToken = funcToken.substring(0, splitIndex);\n const funcEndToken = funcToken.substring(splitIndex + splitOffset);\n const rparenToken = TokenParserManger.getTokenByCtx(ctx, RuleToken.RparenToken);\n const lparenToken = TokenParserManger.getTokenByCtx(ctx, RuleToken.LparenToken);\n const argsSplitToken = TokenParserManger.getTokenByCtx(ctx, RuleToken.ArgPosToken);\n // Check structure <?>\n if (value.startsWith(funcStartToken) && value.endsWith(funcEndToken)) {\n const content = value.substring(1, value.length - 1);\n // Simple parse: functionName(arg1,arg2)\n const lparen = content.indexOf(lparenToken);\n const rparen = content.lastIndexOf(rparenToken);\n if (lparen > 0 && rparen > lparen) {\n const funcName = content.substring(0, lparen);\n const argsStr = content.substring(lparen + lparenToken.length, rparen);\n // Basic argument splitting, does not handle nested commas deeply here\n const args = TokenParserManger.split(argsStr, argsSplitToken, [`[`, `]`]);\n const macro = TokenParserManger.filterMacro(args);\n const tokens: RuleToken[] = [token];\n const expr: RuleValue = {\n express: value,\n func: funcName,\n value: args, // arguments array\n tokens: tokens,\n };\n const alias = TokenParserManger.extractUseAliasTokens(ctx, args);\n if (alias !== undefined && alias.length > 0) {\n expr.tokens.push(...alias);\n }\n if (macro !== undefined && macro.tokens.length > 0) {\n expr.macro = macro;\n expr.tokens.push(...macro.tokens)\n }\n return {\n ok: true,\n expr: expr,\n values: [funcName, args],\n };\n }\n }\n return {\n ok: false,\n error: new Error(`function express systax error`),\n };\n }\n\n static varPatternParse(ctx: Map<RuleToken, RuleValue[]>, token: RuleToken, value: string): TokenParserReply {\n // ${?} or ${xxx}\n if (token !== RuleToken.VarPatternToken) {\n return {ok: false};\n }\n // Check if value matches the pattern like ${...}\n const wordToken = TokenParserManger.getTokenByCtx(ctx, RuleToken.AnyToken);\n const varToken = TokenParserManger.getTokenByCtx(ctx, RuleToken.VarPatternToken);\n const index = varToken.indexOf(wordToken);\n const workTokenOffset = wordToken.length;\n const startToken = varToken.substring(0, index);\n const endToken = varToken.substring(workTokenOffset + index);\n if (!value.startsWith(startToken) || !value.endsWith(endToken)) {\n return {\n ok: false,\n error: new Error(`variable expression syntax error,\\$\\{ or \\} flag is miss`),\n };\n }\n const innerContent = value.substring(startToken.length, value.length - endToken.length);\n if (innerContent === \"\") {\n return {\n ok: false,\n error: new Error(\"variable expression syntax error, variable name is empty\"),\n }\n }\n const expr: RuleValue = {\n express: value,\n value: innerContent,\n tokens: [token],\n };\n const aliasToken = TokenParserManger.getTokenByCtx(ctx, RuleToken.UseAliasToken);\n if (innerContent.indexOf(aliasToken) >= 0) {\n const parser = getTokenParser(RuleToken.UseAliasToken);\n const aliasReply = parser.handler(ctx, RuleToken.UseAliasToken, innerContent);\n if (aliasReply.ok) {\n expr.ref = aliasReply.expr.ref\n expr.alias = aliasReply.values\n expr.tokens.push(...aliasReply.expr.tokens);\n }\n }\n return {\n expr,\n ok: true,\n values: [innerContent],\n };\n }\n\n // compile:GenCell(expr1,expr2,...,) => {G:13=>`${expr1}${expr2}..`,G:14=>`${expr1}${expr2}..`,G:15=>`${expr1}${expr2}..`,...}\n // compile:Macro($exprType,$X,$Y,$formater)\n // $exprType: enums [ expr:(single value), exprArr:(array value) ]\n // $X: column index value, number|string or number[]|string[]\n // $Y: row index value, number or number[]\n // $formater: enums [ codeKey(a function for format string),number(a function for string to number) ]\n // compile:Macro(exprArr,[X1,X2],[Y1,Y2],!codeKey) =>\n // codeKey(X1:Y1.value),codeKey(X1:Y2.value),codeKey(X2:Y1.value),codeKey(X2:Y2.value)\n // compile:Macro(exprArr,[X1],[Y1,Y2],!codeKey) => codeKey(X1:Y1.value),codeKey(X1:Y2.value)\n // compile:Marco(index,!number) => number(i),number(i+1),number(i+2) ,i=1\n static compileExprExtract(value: string): RuleToken[] {\n const results: RuleToken[] = [];\n const lp = RuleToken.LparenToken.toString();\n const args = RuleToken.ArgPosToken.toString();\n const values = value.split(lp);\n for (const v of values) {\n let items: string[] = [];\n if (v.indexOf(args) >= 0) {\n items = v.split(args);\n } else {\n items.push(v);\n }\n for (const it of items) {\n if (it === RuleToken.CompileMacroToken.toString() ||\n it.startsWith(RuleToken.CompileMacroToken) ||\n it.endsWith(RuleToken.CompileMacroToken)) {\n results.push(RuleToken.CompileMacroToken);\n } else if (it === RuleToken.CompileGenToken.toString() ||\n it.startsWith(RuleToken.CompileGenToken) ||\n it.endsWith(RuleToken.CompileGenToken)) {\n results.push(RuleToken.CompileGenToken);\n }\n }\n }\n return results;\n }\n\n static getTokenByCtx(ctx: Map<RuleToken, RuleValue[]>, token: RuleToken): string {\n if (ctx.size <= 0 || !ctx.has(token)) {\n return token.toString()\n }\n const values = ctx.get(token)\n if (values.length <= 0 || values[0].key === \"\") {\n return token.toString()\n }\n return values[0].key\n }\n\n static scanToken(value: string, startToken: string, endTokens: string[]): ScanTokenData[] {\n let token: string = \"\";\n let data: string = \"\";\n let end: boolean = false;\n let start: boolean = false;\n const items: ScanTokenData[] = [];\n const offset = [startToken, ...endTokens].sort((a, b) => a.length - b.length)[0].length;\n const size = value.length;\n for (let i = 0; i < size; i += offset) {\n let leftToken: string;\n if (value[i] === startToken) {\n start = true;\n if (token !== \"\") {\n items.push({\n token,\n value: \"\",\n })\n }\n token = startToken;\n } else {\n start = token === startToken;\n leftToken = `${token}${value[i]}`\n }\n let subfix = endTokens.filter(s => s === leftToken);\n end = endTokens.includes(value[i]) || subfix.length > 0;\n if (subfix.length > 0) {\n token = leftToken;\n data = \"\";\n }\n if (start && end) {\n continue;\n }\n if (!end) {\n token = `${token}${value[i]}`;\n data = `${data}${value[i]}`;\n }\n if (end || i + offset >= size) {\n if (data !== \"\") {\n items.push({\n token,\n value: data,\n });\n }\n token = \"\";\n data = \"\";\n end = false;\n }\n }\n return items;\n }\n\n static split(argsStr: string, argsSplitToken: string, ignoreTokenRange: string[]): string[] {\n let value: string = \"\";\n // 使用 depth 处理嵌套情况(如括号嵌套)或简单的开关状态(如引号)\n // depth > 0 表示当前处于“不分割”的区域内\n let depth = 0;\n const items: string[] = [];\n // 预计算 Token 长度,避免循环中重复计算\n const splitLen = argsSplitToken.length;\n const startLen = ignoreTokenRange[0].length;\n const endLen = ignoreTokenRange[1].length;\n const startToken = ignoreTokenRange[0];\n const endToken = ignoreTokenRange[1];\n // 判断是否为同一种符号(如单引号、双引号)\n const isToggleMode = startToken === endToken;\n for (let i = 0; i < argsStr.length;) {\n // 截取当前位置开始的子串用于匹配\n const substr = argsStr.substring(i);\n // 1. 检测是否遇到“结束忽略”标记 (必须在检测“开始标记”之前,否则同符号模式会瞬间开关)\n if (depth > 0 && substr.startsWith(endToken)) {\n value += endToken;\n i += endLen;\n // 如果是同符号模式(如引号),直接关闭;否则减少嵌套深度\n depth = isToggleMode ? 0 : depth - 1;\n continue;\n }\n // 2. 检测是否遇到“开始忽略”标记\n if (substr.startsWith(startToken)) {\n // 如果是同符号模式,只有当前处于关闭状态(depth=0)才打开\n // 如果是不同符号模式(如括号),则增加深度\n if (!isToggleMode || depth === 0) {\n value += startToken;\n i += startLen;\n depth++;\n continue;\n }\n }\n // 3. 检测分隔符 (仅当不在忽略区域内时生效)\n if (depth === 0 && substr.startsWith(argsSplitToken)) {\n items.push(value);\n value = \"\";\n i += splitLen; // 跳过分隔符\n continue;\n }\n // 4. 默认情况:追加当前字符,索引+1\n value += argsStr[i];\n i++;\n }\n // 将最后一段内容推入结果\n // 如果字符串以分隔符结尾,此时 value 为空,应 push 空字符串以保持 split 行为一致性\n if (value !== \"\") {\n items.push(value);\n }\n return items;\n }\n\n static filterMacro(values: string[]): FilterMacroResult | undefined {\n const filter: FilterMacroResult = {\n tokens: [],\n express: [],\n };\n for (const expr of values) {\n let items = TokenParserManger.compileExprExtract(expr);\n if (items === undefined || items.length <= 0) {\n continue;\n }\n filter.express.push(expr);\n filter.tokens.push(...items);\n }\n return filter.tokens.push() <= 0 ? undefined : filter;\n }\n\n static extractUseAliasTokens(ctx: Map<RuleToken, RuleValue[]>, args: string[]): RuleToken[] {\n const tokens: RuleToken[] = [];\n const useAliasToken = TokenParserManger.getTokenByCtx(ctx, RuleToken.UseAliasToken);\n args.forEach(v => v.startsWith(useAliasToken) && tokens.push(RuleToken.UseAliasToken))\n return tokens;\n }\n\n static toList(ctx: Map<RuleToken, RuleValue[]>, endTokens: RuleToken[]): string[] {\n const items: string[] = [];\n for (const token of endTokens) {\n items.push(TokenParserManger.getTokenByCtx(ctx, token));\n }\n return items;\n }\n\n private static parseRangeValue(ctx: Map<RuleToken, RuleValue[]>, options: RangeValueParserOptions): TokenParserReply {\n let rowReply: TokenParserReply;\n let columnReply: TokenParserReply;\n const rangeCell: RangeCell = {\n stepRow: 1,\n stepColumn: 1,\n minColumn: 0,\n minRow: 0,\n maxRow: 0,\n maxColumn: 0,\n getCells: function (): CellPoint[] {\n return _getCells(this);\n }\n };\n const {rowRange, row, column, columnRange, express, token} = options;\n const rangeParse = getTokenParser(RuleToken.RangeToken);\n if (rowRange > 0) {\n columnReply = rangeParse.handler(ctx, RuleToken.RangeToken, row);\n } else {\n const rowValue = Number.parseInt(row, 10);\n rangeCell.maxRow = rowValue;\n rangeCell.minRow = rowValue;\n }\n if (columnRange > 0) {\n rowReply = rangeParse.handler(ctx, RuleToken.RangeToken, column)\n } else {\n const columnValue = columnLetterToNumber(column);\n rangeCell.maxColumn = columnValue;\n rangeCell.minColumn = columnValue;\n }\n if (columnReply !== undefined) {\n if (!columnReply.ok || columnReply.values === undefined) {\n return columnReply\n }\n const values = columnReply.values as number[];\n let min = values[0];\n let max = values[1];\n let setup = values[2] ?? 1;\n rangeCell.minRow = min;\n rangeCell.maxRow = max;\n rangeCell.stepRow = setup;\n }\n if (rowReply !== undefined) {\n if (!rowReply.ok || rowReply.values === undefined) {\n return rowReply\n }\n const values = rowReply.values as number[];\n let min = values[0];\n let max = values[1];\n let setup = values[2] ?? 1;\n rangeCell.minColumn = min;\n rangeCell.maxColumn = max;\n rangeCell.stepColumn = setup;\n }\n const expr: RuleValue = {\n express: express,\n tokens: [token], // express tokens\n value: rangeCell, // alias value\n }\n return {\n ok: true,\n expr,\n values: rangeCell,\n };\n }\n\n private static parsePosNumber(value: string): number {\n let num: number = NaN;\n if (isPureNumber.test(value)) {\n num = Number.parseInt(value, 10)\n } else if (isPureUppercase.test(value)) {\n num = columnLetterToNumber(value);\n }\n return !isNaN(num) && num <= 0 ? NaN : num;\n }\n\n}\n\nconst defaultRuleTokenParserMap = new Map<RuleToken, TokenParser>([\n [RuleToken.AliasToken, TokenParserManger.aliasParse],\n [RuleToken.CellToken, TokenParserManger.cellParse],\n [RuleToken.EqualToken, TokenParserManger.equalParse],\n [RuleToken.MergeCellToken, TokenParserManger.mergeCellParse],\n [RuleToken.RowCellToken, TokenParserManger.rowCellParse],\n [RuleToken.UseAliasToken, TokenParserManger.useAliasParse],\n [RuleToken.RangeToken, TokenParserManger.rangeParse],\n [RuleToken.PosToken, TokenParserManger.posParse],\n [RuleToken.VarPatternToken, TokenParserManger.varPatternParse],\n [RuleToken.FunctionPatternToken, TokenParserManger.functionPatternParse],\n]);\n\nconst macroTokens: RuleToken[] = [RuleToken.CompileGenToken, RuleToken.CompileMacroToken,];\n\nfunction columnLetterToNumber(letter: string): number {\n let num = 0;\n for (let i = 0; i < letter.length; i++) {\n num = num * 26 + (letter.charCodeAt(i) - 64);\n }\n return num;\n}\n\nfunction columnNumberToLetter(num: number): string {\n // 处理非正整数情况\n if (num <= 0) {\n return \"\";\n }\n let letter = \"\";\n while (num > 0) {\n // 核心逻辑:Excel 列标是从1开始的26进制数\n // 1 -> A, 26 -> Z, 27 -> AA\n // 计算当前位的字符:先减1以映射到 0-25 的区间\n let remainder = (num - 1) % 26;\n // A 的 ASCII 码是 65\n letter = String.fromCharCode(65 + remainder) + letter;\n // 移动到下一位:由于是整数除法,需减去当前位再除以26\n // 或者更简单的写法:num = Math.floor((num - 1) / 26);\n num = Math.floor((num - 1) / 26);\n }\n return letter;\n}\n\nfunction isBase64(str: string): boolean {\n if (str.length < 20) return false;\n if (str.includes(\"\\\\\") || str.includes(\" \")) return false;\n if (str.indexOf(\"./\") >= 0 ||\n str.startsWith(\"file://\") ||\n str.startsWith(\"/\") ||\n str.startsWith(\".\")) {\n return false;\n }\n // 剔除可能存在的换行符后再进行纯字符集校验\n const data = str.replace(/^data:.*?;base64,/, \"\");\n const cleanedStr = data.replace(/[\\r\\n]/g, \"\");\n try {\n return Buffer.from(cleanedStr, 'base64').toString('utf-8') !== \"\";\n } catch (e) {\n return false;\n }\n}\n\nfunction base64ToArrayBuffer(base64: string): ArrayBuffer {\n const data = base64.replace(/^data:.*?;base64,/, \"\");\n const binaryString = atob(data);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n return bytes.buffer;\n}\n\nfunction getMergeRange(ws: exceljs.Worksheet, row: number, col: number): MergeCellRange | null {\n const merges = ws.model.merges as string[];\n for (const mergeStr of merges) {\n const parts = mergeStr.split(\":\");\n const tl = ws.getCell(parts[0]);\n const br = ws.getCell(parts[1]);\n const tlRow = Number(tl.row)\n const tlCol = Number(tl.col)\n const brRow = Number(br.row)\n const brCol = Number(br.col)\n if (row >= tlRow && row <= brRow && col >= tlCol && col <= brCol) {\n return {\n top: tlRow,\n left: tlCol,\n bottom: brRow,\n right: brCol,\n };\n }\n }\n return null;\n}\n\nconst resolveCompileMacroGen = (ctx: CompileContext, expr: string, currentCellIndex: number): string => {\n let parts: string[] = [];\n let join = \".\";\n const m = ctx.getContextMap()\n const aliasToken = TokenParserManger.getTokenByCtx(m, RuleToken.UseAliasToken);\n const genToken = TokenParserManger.getTokenByCtx(m, RuleToken.CompileGenToken);\n const endTokens = [RuleToken.CompileGenToken, RuleToken.LparenToken, RuleToken.ArgPosToken, RuleToken.RparenToken];\n const values = TokenParserManger.scanToken(expr, genToken, TokenParserManger.toList(m, endTokens));\n for (const [_, item] of values.entries()) {\n if (item.value === undefined && item.value !== \"\") {\n continue\n }\n if (!item.token.startsWith(aliasToken) && item.value !== exprIndex) {\n parts.push(item.value);\n } else {\n parts.push(resolveAliasExpr(ctx, item.value, currentCellIndex));\n }\n }\n return parts.join(join);\n}\n\nconst getExprEnd = function (macroExpr: string, matchIndex: number, rparenToken: string): number {\n return macroExpr.indexOf(rparenToken, matchIndex);\n}\n\nconst macroFormatters: string[] = [numberKey, codeKey];\ntype MacroUnitHelper = (v: string) => string;\n\n// compile:Macro(type, X_arr, Y_arr, formatter)\nconst extractMacro = function (expr: string, options: ExtractMacroArgs): MacroArgs {\n let end = NaN;\n const offset = options.startToken.length;\n const startIndex = expr.indexOf(options.startToken);\n const endIndex = expr.indexOf(options.endToken);\n const argValues = expr.substring(startIndex + offset, endIndex);\n const values = argValues.split(options.argToken);\n const extracResult: MacroArgs = {type: values[0], rowParam: [], columnParam: undefined};\n if (values.length > 1) {\n extracResult.columnParam = columnLetterToNumber(values[1])\n }\n if (macroFormatters.includes(values[values.length - 1])) {\n end = values.length - 1;\n extracResult.formatter = values[end]\n }\n if (!isNaN(end) && values.length > 2) {\n extracResult.rowParam = values.slice(2, end).map(x => Number.parseInt(x, 10));\n } else if (values.length > 2) {\n extracResult.rowParam = values.slice(2, values.length).map(x => Number.parseInt(x, 10));\n }\n if (extracResult.rowParam !== undefined && extracResult.rowParam instanceof Array && extracResult.rowParam.length === 1) {\n extracResult.rowParam = extracResult.rowParam[0];\n }\n return extracResult;\n}\n\nconst __codeKey = (str: string): string => {\n let vs = str.trim().replace(\"-\", \"_\").replace(\"/\", \"_\").trim();\n for (; vs.indexOf(\"__\") >= 0;) {\n vs = vs.replace(\"__\", \"_\")\n }\n for (; vs.indexOf(\" \") >= 0;) {\n vs = vs.replace(\" \", \"\")\n }\n return vs.trim().toUpperCase();\n}\n\nconst __numberKey = (str: string): string => {\n return Number.parseInt(str, 10).toString()\n}\n\nconst macroFormatter: Map<string, MacroUnitHelper> = new Map<string, MacroUnitHelper>([\n [codeKey, __codeKey],\n [numberKey, __numberKey],\n [defaultKey, (v: string): string => v],\n]);\n\nconst execMacroFormat = function (value: string, formatter: string): string {\n if (!macroFormatter.has(formatter)) {\n return value;\n }\n return macroFormatter.get(formatter)(value)\n}\n\nconst toCellRow = (rowVals: number[], setup?: number): number[] => {\n if (setup === undefined) {\n setup = 1;\n }\n if (rowVals.length == 2) {\n const values: number[] = [];\n for (let start = rowVals[0]; start <= rowVals[1]; start += setup) {\n values.push(start);\n }\n return values;\n }\n return rowVals;\n}\n\nconst toCellColumn = (columnVals: number[], setup?: number): number[] => {\n return toCellRow(columnVals, setup);\n}\n\n/**\n * 核心宏解析函数\n * 支持:\n * 1. compile:Macro(expr/exprArr, [X], [Y], !formatter)\n * 2. compile:Gen(expr, expr1, ...)\n */\nconst resolveCompileMacroExpr = (ctx: CompileContext, macroExpr: string, macroTokens: RuleToken[], currentCellIndex: number, totalCells: number): string => {\n if (macroTokens === undefined || macroTokens.length <= 0) {\n return macroExpr;\n }\n\n const sheet = ctx.sheet;\n if (sheet === undefined) {\n throw new Error(`miss context worksheet`);\n }\n const m = ctx.getContextMap();\n const argToken = TokenParserManger.getTokenByCtx(m, RuleToken.ArgPosToken);\n const rparenToken = TokenParserManger.getTokenByCtx(m, RuleToken.RparenToken);\n const lparenToken = TokenParserManger.getTokenByCtx(m, RuleToken.LparenToken);\n const genToken = TokenParserManger.getTokenByCtx(m, RuleToken.CompileGenToken);\n const maroToken = TokenParserManger.getTokenByCtx(m, RuleToken.CompileMacroToken);\n const tokenMap: Map<RuleToken, number[]> = new Map<RuleToken, number[]>();\n for (const [index, token] of macroTokens.entries()) {\n let items: number[] = [];\n if (tokenMap.has(token)) {\n items = tokenMap.get(token);\n }\n items.push(index);\n tokenMap.set(token, items);\n }\n const resolveArray = (param: number | number[]): number[] => {\n if (param instanceof Array) {\n return param;\n }\n return [param];\n };\n // 1. 处理 compile:Macro -> gen.expr | gen.exprArr\n // 语法: compile:Macro(type, X_arr, Y_arr, formatter)\n if (tokenMap.has(RuleToken.CompileMacroToken)) {\n let offset: number = 0;\n let exprValue: string = macroExpr;\n const times = tokenMap.get(RuleToken.CompileMacroToken).length;\n for (let i = times; i > 0; i--) {\n const matchIndex: number = exprValue.indexOf(maroToken, offset);\n if (matchIndex < 0) {\n break;\n }\n offset = getExprEnd(exprValue, matchIndex, rparenToken);\n const macroCurrent = exprValue.substring(matchIndex, offset + rparenToken.length);\n const opts: ExtractMacroArgs = {startToken: lparenToken, endToken: rparenToken, argToken};\n // compile:Macro(type, X_arr, Y_arr, formatter)\n let {type, columnParam, rowParam, formatter} = extractMacro(macroCurrent, opts);\n let rowVals: number[];\n let columnVals: number[];\n const parts: string[] = [];\n // 辅助函数:解析参数数组\n if (columnParam !== undefined && rowParam !== undefined) {\n rowVals = resolveArray(rowParam);\n columnVals = resolveArray(columnParam);\n const rowItems = toCellRow(rowVals);\n const columnItems = toCellColumn(columnVals);\n rowItems.forEach(r => {\n columnItems.forEach(c => {\n // 构建坐标引用,如 F:13\n //const cellRef = `${columnNumberToLetter(r)}:${c}`;\n const cellValue = sheet.findCell(r, c);\n if (cellValue === undefined || cellValue.value === null) {\n return;\n }\n const value = cellValue.value;\n parts.push(execMacroFormat(value.toString(), formatter));\n });\n });\n }\n // 处理 exprArr (笛卡尔积展开)\n if (type === exprArr) {\n macroExpr = macroExpr.replace(macroCurrent, parts.join(','))\n } else if (type === exprSingle) {\n // 处理 expr (单一值或索引)\n // 如果是 expr 类型,通常用于取特定值\n macroExpr = macroExpr.replace(macroCurrent, parts[0])\n } else if (type === exprIndex) {\n // 处理 exprIndex == index\n const indexValue = currentCellIndex + 1;\n macroExpr = macroExpr.replace(macroCurrent, indexValue.toString())\n }\n }\n }\n\n // 2. 处理 compile:Gen -> expr,expr1,expr2...\n // 逻辑: 递归解析参数并拼接\n // 语法: compile:Gen(expr1, expr2, ...)\n if (tokenMap.has(RuleToken.CompileGenToken)) {\n let exprValue: string = macroExpr;\n const times = tokenMap.get(RuleToken.CompileGenToken).length;\n for (let i = times; i > 0; i--) {\n const matchIndex: number = exprValue.indexOf(genToken);\n if (matchIndex < 0) {\n break;\n }\n // compile:Gen(expr1, expr2, ...)\n const offset = getExprEnd(exprValue, matchIndex, rparenToken);\n const macroCurrent = exprValue.substring(matchIndex, offset + rparenToken.length);\n // args.join('.')\n exprValue = resolveCompileMacroGen(ctx, macroCurrent, currentCellIndex);\n }\n macroExpr = exprValue;\n }\n\n return macroExpr;\n};\n\nconst loadWorkbook = async function <T extends ArrayBuffer | Buffer | string>(data: T): Promise<exceljs.Workbook> {\n const w = new exceljs.Workbook();\n if (typeof data === \"string\") {\n if (!isBase64(data)) {\n await w.xlsx.readFile(data);\n } else {\n await w.xlsx.load(base64ToArrayBuffer(data));\n }\n } else if (data instanceof Stream) {\n await w.xlsx.read(data);\n } else if (data instanceof ArrayBuffer) {\n await w.xlsx.load(data);\n } else if (data instanceof Buffer) {\n await w.xlsx.load(data as any);\n } else {\n throw new Error(`unSupport buffer type ${typeof data}`);\n }\n return w;\n}\n\nconst scanCellSetPlaceholder = async function <T extends ArrayBuffer | Buffer | string>(\n excelBuffer: T,\n cell: CellPosition & { Sheet: string | number },\n placeholder: PlaceholderCellValue\n): Promise<ArrayBuffer | undefined> {\n const workbook = await loadWorkbook(excelBuffer);\n const worksheet = workbook.getWorksheet(cell.Sheet);\n if (!worksheet) return undefined;\n workSheetSetPlaceholder(worksheet, cell, placeholder)\n return workbook.xlsx.writeBuffer()\n}\n\nconst workSheetSetPlaceholder = function (worksheet: exceljs.Worksheet, cell: CellPosition, placeholder: PlaceholderCellValue): exceljs.Worksheet {\n const colNum = columnLetterToNumber(cell.Row);\n const rowNum = cell.Column;\n const targetCell = worksheet.getCell(rowNum, colNum);\n if (targetCell.isMerged) {\n const range = getMergeRange(worksheet, rowNum, colNum);\n if (range) {\n const leftCol = colNum - 1;\n const values: string[] = [];\n if (leftCol > 0) {\n for (let r = range.top; r <= range.bottom; r++) {\n const val = worksheet.getCell(r, leftCol).value;\n if (val !== null && val !== undefined && val !== \"\") {\n values.push(String(val));\n }\n }\n }\n if (values.length === 0) {\n targetCell.value = placeholder.toString();\n } else {\n targetCell.value = placeholder.mergeCell(values);\n }\n return worksheet;\n }\n }\n const currentValue = targetCell.value;\n if (currentValue === null || currentValue === undefined || currentValue === \"\") {\n targetCell.value = placeholder.toString();\n }\n return worksheet;\n}\n\nconst compileCellTokens: RuleToken[] = [RuleToken.CellToken, RuleToken.MergeCellToken, RuleToken.RowCellToken];\nconst ruleTokens: RuleToken[] = [RuleToken.AliasToken, RuleToken.CellToken, RuleToken.MergeCellToken, RuleToken.RowCellToken];\n\nconst isRuleToken = function (t: RuleToken): boolean {\n return ruleTokens.includes(t)\n}\n\nconst mergeOption = function (ruleKeyMap: Map<RuleToken, string>, defaultRuleTokenMap: Map<RuleToken, string>): Map<RuleToken, string> {\n for (const [key, value] of defaultRuleTokenMap.entries()) {\n if (!ruleKeyMap.has(key)) {\n ruleKeyMap.set(key, value)\n }\n }\n return ruleKeyMap;\n}\n\nconst getTokenParser = function (token: RuleToken): TokenParseResolver {\n if (!defaultRuleTokenParserMap.has(token)) {\n return {\n exists: false,\n }\n }\n return {\n exists: true,\n handler: defaultRuleTokenParserMap.get(token),\n }\n}\n\nconst registerTokenParser = function (token: RuleToken, h: TokenParser): boolean {\n if (defaultRuleTokenParserMap.has(token)) {\n return false;\n }\n defaultRuleTokenParserMap.set(token, h)\n return true;\n}\n\nconst registerTokenParserMust = function (token: RuleToken, h: TokenParser): void {\n defaultRuleTokenParserMap.set(token, h)\n}\n\nconst scanWorkSheetRules = function (worksheet: exceljs.Worksheet, options: RuleOptions): RuleResult {\n const result = {rules: options.getContextMap()};\n // row\n for (let r = options.startLine; r <= options.endLine; r++) {\n let emptyValue = false;\n let ruleToken = RuleToken.UndefinedToken;\n // column\n for (let c = options.startColumn; c <= options.endColumn; c++) {\n const cell = worksheet.findCell(r, c);\n if (cell === undefined || cell.value === undefined || cell.value === null) {\n continue;\n }\n const cellValue = cell.value;\n const value = cellValue.toString();\n let isStartCell = c === options.startColumn;\n if (emptyValue && ruleToken === RuleToken.UndefinedToken) {\n isStartCell = true;\n }\n if (value === \"\" && isStartCell) {\n emptyValue = true;\n continue;\n }\n if (isStartCell) {\n ruleToken = options.parseToken(value);\n continue;\n } else {\n if (!isRuleToken(ruleToken)) {\n break;\n }\n emptyValue = false;\n }\n const {handler, exists} = getTokenParser(ruleToken);\n if (!exists) {\n continue;\n }\n let values: RuleValue[] = [];\n if (result.rules.has(ruleToken)) {\n values = result.rules.get(ruleToken);\n }\n const {expr, ok} = handler(result.rules, ruleToken, value);\n if (ok && expr !== undefined) {\n values.push(expr);\n }\n result.rules.set(ruleToken, values);\n }\n }\n return result;\n}\n\nconst parseWorkSheetRules = function (worksheet: exceljs.Worksheet, options?: RuleOptions): RuleResult {\n const result: RuleResult = {rules: new Map<RuleToken, RuleValue[]>()};\n if (worksheet === undefined || worksheet === null) {\n return result;\n }\n if (options === undefined) {\n options = new RuleMapOptions();\n }\n return scanWorkSheetRules(worksheet, options.parseDefault(worksheet));\n}\n\nconst compileCheck = function (iv: RuleResult, ctx: RuleOptions): Error[] | undefined {\n if (iv.rules.size <= 0) {\n return undefined;\n }\n const errs: Error[] = [];\n // alias configuration check\n const values = iv.rules.get(RuleToken.AliasToken);\n if (values !== undefined && values.length > 0) {\n const set = new Set<string>();\n for (const [idx, value] of values.entries()) {\n if (idx === 0) {\n set.add(value.key);\n continue\n }\n if (set.has(value.key)) {\n errs.push(Error(`Duplicate alias(${value.key},${value.express}) configuration`));\n }\n }\n }\n // custom compile checker\n const handlers = ctx.getCompileCheckHandlers();\n if (handlers !== undefined && handlers.length > 0) {\n for (const h of handlers) {\n let err = h(iv, ctx);\n if (err !== undefined && err.length > 0) {\n errs.push(...err);\n }\n }\n }\n if (errs.length > 0) {\n return errs;\n }\n return undefined;\n}\n\nconst getMacroTokens = function (expr: RuleValue): RuleToken[] {\n const tokens: RuleToken[] = [];\n for (const token of expr.tokens) {\n if (macroTokens.includes(token)) {\n tokens.push(token);\n }\n }\n return tokens;\n}\n\nconst toRowCells = function (cells: CellPoint[]): CellPoint[][] {\n const indexes: number[] = [];\n const rows: CellPoint[][] = [];\n const rowMap: Map<number, CellPoint[]> = new Map<number, CellPoint[]>();\n for (const cell of cells) {\n let cells: CellPoint[] = [];\n if (rowMap.has(cell.Row)) {\n cells = rowMap.get(cell.Row);\n } else {\n indexes.push(cell.Row);\n }\n cells.push(cell);\n rowMap.set(cell.Row, cells);\n }\n indexes.sort((a, b) => a - b);\n for (const row of indexes) {\n const values = rowMap.get(row);\n rows.push(values);\n }\n return rows;\n}\n\nconst resolveFunctionExpr = (ctx: CompileContext, templateValue: string, expr: RuleValue): string => {\n const anyToken = defaultRuleTokenMap.get(RuleToken.AnyToken);\n const funToken = defaultRuleTokenMap.get(RuleToken.FunctionPatternToken);\n const functionTokens = expr.tokens.filter(s => s === RuleToken.FunctionPatternToken);\n if (functionTokens === undefined || functionTokens.length <= 0) {\n return templateValue;\n }\n const [start, end] = funToken.split(anyToken);\n for (let times = functionTokens.length; times > 0; times--) {\n const index = templateValue.indexOf(start);\n const offset = templateValue.indexOf(end);\n if (offset > 0 && index >= 0) {\n templateValue = templateValue.replace(start, funcCommand).replace(end, \"\");\n }\n }\n return templateValue;\n}\n\nconst searchIndexOf = (str: string, substr: string[], position?: number): number => {\n let index: number = NaN;\n for (let sub of substr) {\n if (position === undefined || position === null) {\n index = str.indexOf(sub);\n } else {\n index = str.indexOf(sub, position);\n }\n if (!isNaN(index) && index >= 0) {\n return index;\n }\n }\n return -1;\n}\n\nconst resolveAliasExpr = (ctx: CompileContext, templateValue: string, index: number): string => {\n const expr = ctx.currentExpr as RuleValue;\n if (expr === undefined) {\n throw new Error(`miss context expr value`);\n }\n let compileValue = templateValue;\n const aliasToken = defaultRuleTokenMap.get(RuleToken.UseAliasToken);\n let aliasTokens = expr.tokens.filter(s => s === RuleToken.UseAliasToken);\n if (aliasTokens.length <= 0) {\n const num = templateValue.split(aliasToken).length - 1;\n if (num > 0) {\n aliasTokens = new Array(num).fill(aliasToken);\n }\n }\n if ((aliasTokens !== undefined && aliasTokens.length > 0)) {\n for (let i = 0; i < aliasTokens.length; ++i) {\n const token = aliasToken;\n const start = compileValue.indexOf(token);\n if (start < 0) {\n break;\n }\n const offset = aliasTokens[i].length;\n let end = searchIndexOf(compileValue, [',', '.', ')', ']'], start);\n if (end < 0) {\n end = compileValue.length\n }\n const sv = compileValue.substring(start + offset, end);\n const pl = `${token}${sv}`;\n const value = ctx.getAlias(sv);\n if (value !== undefined) {\n if (compileValue === pl) {\n compileValue = value;\n } else {\n compileValue = compileValue.replace(`${pl}`, value);\n }\n }\n }\n }\n return compileValue;\n}\n\nconst resolveValueExpr = (ctx: CompileContext, templateValue: string): string | null => {\n const expr: RuleValue = ctx.currentExpr;\n if (expr === undefined || expr.tokens.length <= 0) {\n return templateValue;\n }\n const m = ctx.getContextMap();\n const token = TokenParserManger.getTokenByCtx(m, RuleToken.VarPatternToken);\n const anyToken = TokenParserManger.getTokenByCtx(m, RuleToken.AnyToken);\n const [start, end] = token.split(anyToken);\n if (!templateValue.startsWith(start)) {\n templateValue = `${start}${templateValue}`\n }\n if (!templateValue.endsWith(end)) {\n templateValue = `${templateValue}${end}`\n }\n return templateValue;\n}\n\nconst compileRowCells = function (ctx: CompileContext, expr: RuleValue, cellPoints: CellPoint[], rowIndex: number, errs: Error[]) {\n if (ctx.sheet === undefined) {\n errs.push(new Error(`ctx miss worksheet`));\n return;\n }\n ctx.currentExpr = expr;\n cellPoints.forEach((cellPoint, index) => {\n const r = cellPoint.Row;\n const sheet = ctx.sheet;\n const c = cellPoint.Column;\n // 我们的解析逻辑中 X 已经转换为数字索引\n const cell = sheet.findCell(r, c);\n if (cell === undefined ||\n (cell.value !== undefined && cell.value !== null && cell.value !== \"\")) {\n return;\n }\n // 获取表达式模板\n let templateValue = String(expr.value);\n // 步骤 1: 解析宏指令\n // 提取所有 compile: 开头的指令\n const macroTokens = getMacroTokens(expr);\n // 递归替换宏\n templateValue = resolveFunctionExpr(ctx, templateValue, expr); // <?>\n templateValue = resolveCompileMacroExpr(ctx, templateValue, macroTokens, index, cellPoints.length); // compile:Macro,compile:Gen\n templateValue = resolveAliasExpr(ctx, templateValue, index); // @\n // 写入单元格\n cell.value = resolveValueExpr(ctx, templateValue);\n })\n\n}\n\nconst generateWorkSheetCellsPlaceholder = function (ctx: CompileContext, expr: RuleValue, sheet: exceljs.Worksheet): Error[] | undefined {\n const errs: Error[] = [];\n const posExpr: RuleValue = expr.posExpr;\n let cellsItems = expr.cells;\n if ((cellsItems === undefined || cellsItems.length <= 0) &&\n posExpr !== undefined &&\n posExpr.value !== undefined) {\n const r = posExpr.value as RangeCell;\n if (r !== undefined) {\n cellsItems = r.getCells();\n }\n }\n if (!cellsItems || cellsItems.length === 0) {\n return undefined;\n }\n ctx.sheet = sheet;\n const cells = cellsItems;\n // 遍历目标单元格\n toRowCells(cells).forEach((cellPoints, index) => compileRowCells(ctx, expr, cellPoints, index, errs));\n return errs.length > 0 ? errs : undefined;\n};\n\nconst hasGeneratorToken = function (tokens: RuleToken[]): boolean {\n for (const t of tokens) {\n if (compileCellTokens.includes(t)) {\n return true;\n }\n }\n return false;\n}\n\nconst compileWorkSheetPlaceholder = function (ctx: CompileContext, sheet: exceljs.Worksheet, result: RuleResult): Error[] | undefined {\n // check need compile sheet setting\n if (ctx.compileSheets !== undefined && ctx.compileSheets.length > 0 && !ctx.compileSheets.includes(sheet.name)) {\n return undefined;\n }\n const errs: Error[] = [];\n for (const [token, express] of result.rules.entries()) {\n if (!isRuleToken(token)) {\n continue\n }\n // expr generat worksheet cells\n for (const expr of express) {\n if (expr.tokens.length <= 0 || !hasGeneratorToken(expr.tokens)) {\n continue;\n }\n let err = generateWorkSheetCellsPlaceholder(ctx, expr, sheet);\n if (err !== undefined && err.length > 0) {\n errs.push(...err);\n }\n }\n }\n if (errs.length > 0) {\n return errs;\n }\n return undefined;\n}\n\ntype CompileResult = {\n workbook: exceljs.Workbook\n configure?: RuleResult\n errs?: Error[]\n}\n\nconst compile = async function <T extends ArrayBuffer | Buffer | string>(\n data: T,\n ruleSheetName: string | number,\n options?: RuleOptions): Promise<CompileResult> {\n const workbook = await loadWorkbook(data);\n const sheet = workbook.getWorksheet(ruleSheetName);\n if (sheet === undefined) {\n return {\n workbook,\n };\n }\n if (workbook.worksheets === undefined) {\n return {\n workbook,\n errs: [new Error(`worksheet, ${ruleSheetName} not exists!`)],\n };\n }\n if (options === undefined) {\n const excludes = [ruleSheetName as string];\n options = RuleMapOptions.withAllSheets(workbook, excludes);\n }\n // parse rules\n const result = parseWorkSheetRules(sheet, options);\n const errs = compileCheck(result, options);\n if (errs !== undefined) {\n return {\n errs,\n workbook,\n configure: result,\n };\n }\n // compile\n const compileErrs: Error[] = [];\n const ctx = CompileContext.create(options).loadAlias(result.rules);\n for (const [i, w] of workbook.worksheets.entries()) {\n if (w.name === ruleSheetName ||\n i === ruleSheetName ||\n !ctx.filterSheet(w.name)) {\n continue;\n }\n\n let err = compileWorkSheetPlaceholder(ctx, w, result);\n if (err !== undefined && err.length > 0) {\n compileErrs.push(...err);\n }\n }\n if (compileErrs.length > 0) {\n return {\n workbook,\n configure: result,\n errs: compileErrs,\n };\n }\n return {\n workbook,\n configure: result,\n };\n}\n\nconst compileWorkSheet = async function <T extends ArrayBuffer | Buffer | string>(\n data: T,\n sheetName: string | number,\n options?: RuleOptions): Promise<exceljs.Xlsx | Error[]> {\n const reply = await compile(data, sheetName, options);\n if (reply.errs !== undefined && reply.errs.length > 0) {\n return reply.errs;\n }\n return reply.workbook.xlsx;\n}\n\nconst fetchAlias = (m: Map<RuleToken, RuleValue[]> | RuleResult): Map<string, string> => {\n let sv: Map<RuleToken, RuleValue[]>;\n const alias = new Map<string, string>();\n if (!(m instanceof Map) && m.rules !== undefined) {\n sv = m.rules;\n } else if (m instanceof Map) {\n if (m.size <= 0 || !m.has(RuleToken.AliasToken)) {\n return alias;\n }\n sv = m;\n } else {\n return alias;\n }\n const values = sv.get(RuleToken.AliasToken);\n for (const vs of values) {\n if (typeof vs.value === \"string\") {\n alias.set(vs.key, vs.value as string);\n }\n }\n return alias;\n}\n\nconst removeUnExportSheets = (w: exceljs.Workbook, options: RuleOptions): exceljs.Workbook => {\n const removes: string[] = [];\n if (options.compileSheets === undefined || options.compileSheets.length <= 0) {\n for (const [i, v] of w.worksheets.entries()) {\n const sheetName = v.name;\n if (sheetName.endsWith(\".config\") ||\n sheetName.endsWith(\".json\")) {\n removes.push(sheetName);\n }\n }\n } else {\n for (const [i, v] of w.worksheets.entries()) {\n if (!options.compileSheets.includes(v.name)) {\n removes.push(v.name);\n }\n }\n }\n for (const [_,name] of removes.entries()) {\n w.removeWorksheet(name)\n }\n return w;\n}\n\nconst toBuffer = async (w: exceljs.Workbook): Promise<Buffer> => {\n const arrayBuffer = await w.xlsx.writeBuffer()\n return Buffer.from(arrayBuffer);\n}\n\nclass ExprResolver {\n static toBuffer = toBuffer;\n static compile = compile;\n static toRowCells = toRowCells;\n static fetchAlias = fetchAlias;\n static getExprEnd = getExprEnd;\n static compileCheck = compileCheck;\n static extractMacro = extractMacro;\n static compileRowCells = compileRowCells;\n static searchIndexOf = searchIndexOf;\n static resolveAliasExpr = resolveAliasExpr;\n static resolveValueExpr = resolveValueExpr;\n static resolveFunctionExpr = resolveFunctionExpr;\n static removeUnExportSheets = removeUnExportSheets;\n static resolveCompileMacroGen = resolveCompileMacroGen;\n static resolveCompileMacroExpr = resolveCompileMacroExpr;\n}\n\nexport {\n CellPosition,\n CompileResult,\n DefaultPlaceholderCellValue,\n PlaceholderCellValue,\n exceljs,\n RuleToken,\n RuleMapOptions,\n TokenParserManger,\n RuleResult,\n RuleOptions,\n CompileContext,\n FilterMacroResult,\n MacroUnitHelper,\n MacroArgs,\n ExtractMacroArgs,\n ExprResolver,\n scanCellSetPlaceholder,\n workSheetSetPlaceholder,\n parseWorkSheetRules,\n columnLetterToNumber,\n columnNumberToLetter,\n isRuleToken,\n hasGeneratorToken,\n getTokenParser,\n registerTokenParser,\n registerTokenParserMust,\n compileWorkSheet,\n compileWorkSheetPlaceholder,\n loadWorkbook,\n};","import JsZip, {OutputType} from \"jszip\";\nimport {\n Placeholder,\n Workbook,\n FullOptions,\n OutputByType,\n defaultValueDotGet,\n valueDotGet,\n QueryFunction,\n} from \"./core\";\nimport {ExprResolver, RuleOptions, RuleResult} from \"./helper\";\n\ntype Argument = {\n root: string;\n alias?: string;\n groups?: string[];\n suffix?: string;\n default: number | string | any;\n func: string;\n p: Placeholder;\n}\n\ntype CmdFunction = (\n obj: Object | Record<string, any>,\n argument: Argument,\n) => any | undefined;\n\ninterface HasToString {\n toString(): string;\n}\n\nfunction hasToString(obj: any): obj is HasToString {\n return obj != null && typeof obj.toString === 'function';\n}\n\nconst tokenNextIter = [`root`, `groups`, `suffix`, `default`];\n\nconst aliasKey = `__alias`;\n\nclass ArgumentData {\n root: string;\n p: Placeholder;\n default: number | string | any = '';\n alias?: string;\n suffix?: string;\n groups?: string[] = [];\n tokenIterIndex: number = 0;\n private readonly func: string;\n\n constructor(fn: string, p: Placeholder) {\n this.p = p;\n this.func = fn;\n this.groups = [];\n }\n\n To(): Argument {\n return {\n p: this.p,\n root: this.root,\n alias: this.alias,\n groups: this.groups,\n suffix: this.suffix,\n default: this.default,\n func: this.func,\n };\n }\n\n Add(startToken: string, value: string | undefined) {\n if (value === undefined) {\n this.tokenIterIndex++;\n return;\n }\n switch (startToken) {\n case `(`:\n if (tokenNextIter[this.tokenIterIndex] === \"root\") {\n this.root = value;\n this.tokenIterIndex++;\n }\n break;\n case `[`:\n if (tokenNextIter[this.tokenIterIndex] === \"groups\") {\n this.groups.push(value)\n }\n break;\n case `]`:\n if (tokenNextIter[this.tokenIterIndex] === \"groups\") {\n this.groups.push(value);\n }\n break;\n case `,`:\n const token = tokenNextIter[this.tokenIterIndex];\n if (token === \"root\") {\n this.root = value;\n this.tokenIterIndex++;\n } else if (token === \"groups\") {\n this.groups.push(value);\n } else if (token === \"suffix\") {\n this.suffix = value;\n this.tokenIterIndex++;\n } else if (token === \"default\") {\n this.default = value;\n this.tokenIterIndex++;\n }\n break;\n case `)`:\n this.tokenIterIndex++;\n break;\n }\n }\n\n ParseAlias(alias: any | object | Record<string, string>) {\n if (alias === undefined || this.root === undefined || this.root === \"\") {\n return;\n }\n const value = valueDotGet(alias, this.root);\n if (value === undefined || typeof value !== \"string\" || !hasToString(value)) {\n return;\n }\n this.alias = this.root;\n this.root = value as string;\n }\n}\n\nclass ArgumentValue {\n private readonly value: any;\n private readonly defaultValue: any;\n\n constructor(value: any, defValue: any) {\n this.value = value;\n this.defaultValue = defValue;\n }\n\n isUndefined(): boolean {\n return this.value === undefined;\n }\n\n getDefault(): any {\n return this.defaultValue;\n }\n\n getNumber(): number {\n return Number(this.value);\n }\n\n toString(): string {\n if (this.isUndefined()) {\n return \"\";\n }\n if (typeof this.value === \"string\") {\n return this.value as string;\n }\n if (hasToString(this.value)) {\n return this.value.toString();\n }\n return \"\";\n }\n}\n\nconst ArgumentValueLoader = (values: Object | Record<string, any>, args: Argument): ArgumentValue[] => {\n let all: string[] = [];\n for (let v of args.groups) {\n let key = `${args.root}.${v}`;\n if (args.suffix !== undefined && args.suffix !== \"\") {\n key = `${key}.${args.suffix}`\n }\n all.push(key);\n }\n if (all.length <= 0) {\n return args.default || '';\n }\n const items: ArgumentValue[] = [];\n for (let k of all) {\n let vs = valueDotGet(values, k);\n items.push(new ArgumentValue(vs, args.default));\n }\n return items;\n}\n\n// ${fn:sum(#,[C308,C342,C321,C3016,C309_C409],1,0)}\nconst sum_all: CmdFunction = (values: Object | Record<string, any>, argument: Argument,): any | undefined => {\n let sum: number = NaN;\n let emptyTimes = 0;\n let argc = argument.groups.length;\n let items = ArgumentValueLoader(values, argument);\n for (let value of items) {\n let num = value.getNumber();\n if (value.isUndefined()) {\n emptyTimes++;\n num = Number(argument.default);\n }\n if (isNaN(sum)) {\n sum = num;\n } else {\n sum = sum + Number(num);\n }\n }\n if (emptyTimes === argc) {\n return undefined;\n }\n if (isNaN(sum)) {\n throw new Error(`parse ${argument.p.name} NaN error`);\n }\n return sum;\n}\n\n// ${fn:sub(#,[C308,C342,C321,C3016,C309_C409],1,0)}\nconst sub_value: CmdFunction = (values: Object | Record<string, any>, argument: Argument,): any | undefined => {\n let sub: number = NaN;\n let emptyTimes = 0;\n let argc = argument.groups.length;\n let items = ArgumentValueLoader(values, argument);\n for (let value of items) {\n let num = value.getNumber();\n if (value.isUndefined()) {\n emptyTimes++;\n num = Number(argument.default);\n }\n if (isNaN(num)) {\n continue;\n }\n if (isNaN(sub)) {\n sub = num;\n } else {\n sub = sub - Number(num);\n }\n }\n if (emptyTimes === argc) {\n return undefined;\n }\n if (isNaN(sub)) {\n throw new Error(`parse ${argument.p.name} NaN error`);\n }\n return sub;\n}\n\nconst defaultCommands = new Map<string, CmdFunction>([\n [\"sum\", sum_all],\n [\"sub\", sub_value],\n]);\n\nconst resolveFunc = function (value: string): string {\n if (value.indexOf(\"(\") > 0 && value.endsWith(\")\")) {\n const names = value.split(\"(\")\n return names[0]\n }\n return \"\"\n}\n\nconst resolveArgument = function (p: Placeholder, data: object | Record<string, any>): Argument {\n const value = p.name;\n const fn = resolveFunc(value);\n const args = new ArgumentData(fn, p);\n if (fn !== \"\") {\n let key: string = \"\";\n let startT: string = \"\";\n const endToken = [`)`, `,`, `]`];\n const startToken = [`(`, `,`, `[`];\n const tokenRow = value.split(`${fn}`)[1]\n const len = tokenRow.length;\n for (let i = 0; i < len; i++) {\n let start = startToken.includes(tokenRow[i]);\n let end = endToken.includes(tokenRow[i]);\n if (start) {\n startT = tokenRow[i];\n }\n if (startT !== \"\" && tokenRow[i] !== startT && !end) {\n key = `${key}${tokenRow[i]}`;\n }\n if (end) {\n if (key === \"\") {\n args.Add(startT, undefined);\n } else {\n args.Add(startT, key);\n key = \"\";\n }\n }\n }\n }\n const alias = valueDotGet(data, aliasKey);\n if (alias !== undefined) {\n args.ParseAlias(alias)\n }\n return args.To();\n}\n\nconst commandExtendQuery: QueryFunction = function (values: object | Record<string, any>, p: Placeholder): any | undefined {\n if (p.type !== \"fn\") {\n return defaultValueDotGet(values, p)\n }\n const argument = resolveArgument(p, values);\n if (argument.func !== \"\" && defaultCommands.has(argument.func)) {\n return defaultCommands.get(argument.func)(values, argument)\n }\n return defaultValueDotGet(values, p)\n}\n\n/**\n * 安全添加扩展函数支持\n * @param key\n * @param h\n * @constructor\n */\nconst AddCommand = (key: string, h: CmdFunction): boolean => {\n if (defaultCommands.has(key)) {\n return false;\n }\n defaultCommands.set(key, h);\n return true;\n}\n\n/**\n * 强制添加扩展函数支持\n * @param key\n * @param h\n * @constructor\n */\nconst AddCommandMust = (key: string, h: CmdFunction): void => {\n defaultCommands.set(key, h);\n}\n\n// xlsx 模板 生成 - 函数一键调用\nconst generateCommandsXlsxTemplate = async function <T extends JsZip.OutputType>(data: Buffer, values: Object, options?: JsZip.JSZipGeneratorOptions<T> & FullOptions): Promise<OutputByType[T]> {\n const w = await Workbook.parse(data, options);\n w.setQueryFunctionHandler(commandExtendQuery);\n await w.substituteAll(values);\n return w.generate(options);\n}\n\nconst getCommands = (): Map<string, CmdFunction> => {\n return defaultCommands;\n}\n\ntype AutoOptions = RuleOptions & {sheetName?:string};\n\nconst compileRuleSheetName = \"export_metadata.config\";\n\nconst mergeMap = function (source: Map<string, string>, dest: Map<string, string>): Map<string, string> {\n for (const [key, value] of dest.entries()) {\n source.set(key, value)\n }\n return source;\n}\n\nconst autoRegisterAlias = function (values: Object,configure: RuleResult): Object {\n let alias = ExprResolver.fetchAlias(configure);\n if (values[aliasKey] !== undefined && values[aliasKey] instanceof Map) {\n alias = mergeMap(alias, values[aliasKey] as Map<string, string>);\n }\n values[aliasKey] = alias;\n return values;\n}\n\n// xlsx 模板 编译生成 - 函数一键调用\nconst generateCommandsXlsxTemplateWithCompile = async function <T extends JsZip.OutputType>(data: Buffer, values: Object, compileOptions: AutoOptions, options?: JsZip.JSZipGeneratorOptions<T> & FullOptions): Promise<OutputByType[T]> {\n if (compileOptions.sheetName === undefined || compileOptions.sheetName === \"\") {\n compileOptions.sheetName = compileRuleSheetName;\n }\n const result = await ExprResolver.compile(data, compileOptions.sheetName,compileOptions);\n if (result.errs !== undefined && result.errs.length > 0) {\n throw result.errs[0];\n }\n values = autoRegisterAlias(values,result.configure);\n result.workbook = ExprResolver.removeUnExportSheets(result.workbook, compileOptions);\n const wb = await ExprResolver.toBuffer(result.workbook);\n const w = await Workbook.parse(wb, options);\n w.setQueryFunctionHandler(commandExtendQuery);\n await w.substituteAll(values);\n return w.generate(options);\n}\n\nexport {\n mergeMap,\n autoRegisterAlias,\n commandExtendQuery,\n getCommands,\n resolveArgument,\n ArgumentValue,\n CmdFunction,\n Argument,\n ArgumentData,\n AutoOptions,\n compileRuleSheetName,\n AddCommand,\n AddCommandMust,\n ArgumentValueLoader,\n generateCommandsXlsxTemplate,\n generateCommandsXlsxTemplateWithCompile,\n}"],"mappings":"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","names":["BufferType","path","match","ElementTree","drawingElement","fromRow","nbRow","RuleToken","join","macroTokens","defaultRuleTokenMap","cells"]}