xlsx-template-browser 0.2.1 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -1
- package/dist/index.cjs +2331 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +11 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +2293 -0
- package/dist/index.js.map +1 -0
- package/package.json +27 -4
- package/lib/excelHelpers.js +0 -149
- package/lib/helpers.js +0 -63
- package/lib/index.js +0 -31
- package/lib/main.js +0 -294
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/functions/file-helpers.ts","../src/functions/data-helpers.ts","../src/functions/constants.ts","../src/functions/excel-helpers.ts","../src/functions/get-offsets.ts","../src/functions/xml-helpers.ts","../src/functions/get-replacements.ts","../src/functions/process-worksheets.ts","../src/functions/global-helpers.ts","../src/functions/get-styles.ts","../src/functions/get-shared-strings.ts","../src/functions/cells-helpers.ts","../src/functions/get-cells.ts","../src/functions/get-merged-cells.ts","../src/functions/get-hyperlinks.ts","../src/functions/get-comments.ts","../src/functions/get-conditional-formatting.ts","../src/functions/get-tables.ts","../src/functions/get-drawings.ts","../src/functions/get-old-comments.ts","../src/functions/get-sheets.ts","../src/functions/get-relations.ts","../src/functions/get-pivot-tables.ts","../src/functions/get-formulas.ts","../src/functions/get-data-validations.ts","../src/functions/get-extension-lists.ts","../src/functions/get-persons.ts","../src/functions/get-workbook.ts","../src/functions/generate-file.ts"],"sourcesContent":["import { downloadFile, fetchFile } from './functions/file-helpers'\r\nimport { generateTemplate } from './functions/generate-file'\r\n\r\nexport const generateXlsx = async (template: string | ArrayBuffer, data: Record<string, unknown>): Promise<Blob> => {\r\n if (template === undefined || data === undefined) throw Error('No template or data provided')\r\n if (typeof template === 'string') {\r\n if (!/^https|ftp?:/.test(template)) throw new Error('Template URL is invalid')\r\n const response = await fetchFile(template)\r\n const fileContent = await generateTemplate(response, data)\r\n return fileContent\r\n }\r\n return await generateTemplate(template, data)\r\n}\r\n\r\n/**\r\n * Downloads an XLSX file by replacing data in a template file and initiates the download in the browser.\r\n * @param {string} templateURL - The URL of the template XLSX file.\r\n * @param {Object} data - The data object containing values to replace in the template.\r\n * @param {string} [fileName] - The name of the file to be downloaded. If not provided, a default name based on the current date will be used.\r\n * @returns {Promise<void>} A promise that resolves once the download is initiated.\r\n */\r\n\r\nexport const downloadXlsx = async (\r\n template: string | ArrayBuffer,\r\n data: Record<string, unknown>,\r\n fileName?: string,\r\n mimeType?: string\r\n): Promise<void> => {\r\n if (fileName === undefined) fileName = new Date().toLocaleDateString('sv') + ' - Report.xlsx'\r\n const fileContent = await generateXlsx(template, data)\r\n downloadFile(fileContent, fileName, mimeType)\r\n}\r\n","/**\n * Fetches a remote file and returns its contents as an ArrayBuffer.\n *\n * @param url - File URL\n * @returns Raw binary data as ArrayBuffer\n * @throws Error if the response is not OK\n */\n\nexport const fetchFile = async (url: string): Promise<ArrayBuffer> => {\n const response = await fetch(url)\n\n if (!response.ok) {\n throw new Error(\n `Failed to download file: ${response.status} ${response.statusText}`\n )\n }\n\n return await response.arrayBuffer()\n}\n\n/**\n * Downloads a file using the provided data and file name.\n * @param {string} data - The file BASE64 data\n * @param {string} fileName - The desired name for the downloaded file\n */\n\nconst downloadURL = (data: string, fileName: string): void => {\n const a = document.createElement('a')\n a.href = data\n a.download = fileName\n a.style = 'display: none'\n document.body.append(a)\n a.click()\n a.remove()\n}\n\n/**\n * Converts an array to a Blob and initiates the download with the specified file name and MIME type.\n * @param {Array} data - The array data to be converted to a Blob.\n * @param {string} fileName - The desired name for the downloaded file.\n * @param {string} mimeType - The MIME type of the file.\n */\n\nexport const downloadFile = (\n data: Blob,\n fileName: string,\n mimeType = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'\n): void => {\n const blob = new Blob([data], { type: mimeType })\n const url = window.URL.createObjectURL(blob)\n downloadURL(url, fileName)\n setTimeout(() => { return window.URL.revokeObjectURL(url) }, 100)\n}\n","import { type DataStore } from '../types/data-store'\r\n\r\nconst isNumeric = (v: string): boolean => {\r\n return /^\\d+$/.test(v)\r\n}\r\n\r\ntype Accessor = string | number\r\n\r\nexport const parseNotation = (input: string): Accessor[] => {\r\n const result: Accessor[] = []\r\n let i = 0\r\n\r\n while (i < input.length) {\r\n const char = input[i]\r\n\r\n // skip dots\r\n if (char === '.') {\r\n i++\r\n continue\r\n }\r\n\r\n // bracket notation\r\n if (char === '[') {\r\n i++\r\n\r\n const quote = input[i] === '\"' || input[i] === '\\'' ? input[i++] : null\r\n\r\n let value = ''\r\n\r\n while (i < input.length) {\r\n if (quote !== null) {\r\n if (input[i] === quote && input[i + 1] === ']') break\r\n } else {\r\n if (input[i] === ']') break\r\n }\r\n value += input[i++]\r\n }\r\n\r\n // skip closing quote + bracket OR just bracket\r\n i += quote !== null ? 2 : 1\r\n\r\n result.push(isNumeric(value) ? Number(value) : value)\r\n continue\r\n }\r\n\r\n // dot notation\r\n let value = ''\r\n while (i < input.length) {\r\n const c = input[i]\r\n if (c === '.' || c === '[') break\r\n value += c\r\n i++\r\n }\r\n\r\n result.push(value)\r\n }\r\n return result\r\n}\r\n\r\n/**\r\n * Retrieves nested properties from an object using an array of accessors.\r\n * @param {*} obj - The object from which to retrieve the nested properties.\r\n * @param {Array} accessors - An array of accessors representing the path to the desired properties.\r\n * @returns {*} - The value of the nested properties, or undefined if any accessor along the path is undefined.\r\n */\r\n\r\nconst getDeep = (obj: unknown, accessors: Array<string | number>): unknown => {\r\n for (let i = 0; i < accessors.length; i++) {\r\n if (obj === undefined) { return undefined }\r\n if (obj === null) { return obj }\r\n if (Array.isArray(obj) && typeof accessors[i] === 'string') {\r\n return obj.map(el => getDeep(el, accessors.slice(i)))\r\n }\r\n const accessor = accessors[i]\r\n if (accessor === undefined) { continue }\r\n obj = (obj as Record<string | number, unknown>)[accessor]\r\n }\r\n return obj\r\n}\r\n\r\n/**\r\n * Retrieves nested properties from an object using dot and bracket notation.\r\n * @param {*} obj - The object from which to retrieve the nested properties.\r\n * @param {string} props - The notation representing the path to the desired properties.\r\n * @returns {*} - The value of the nested properties, or the original object if the notation is empty.\r\n */\r\n\r\nexport const getByNotation = (obj: Record<string, unknown>, props: string): unknown => {\r\n const parsed = parseNotation(props)\r\n const value = getDeep(obj, parsed)\r\n return value ?? ''\r\n}\r\n\r\n/**\r\n * Creates a simple accessor for nested data using string paths (notation).\r\n *\r\n * - Resolves values via `getByNotation` (e.g. \"user.address.city\")\r\n * - Caches resolved values to avoid repeated lookups\r\n * - Accessor strings are trimmed before lookup\r\n *\r\n * @param data - Source object\r\n * @returns DataStore with cached `get` accessor\r\n */\r\n\r\nexport const createDataStore = (data: Record<string, unknown>): DataStore => {\r\n const accessors = new Map<string, unknown>()\r\n const get = (accessor: string): unknown => {\r\n accessor = accessor.trim()\r\n if (accessors.has(accessor)) { return accessors.get(accessor) }\r\n const value = getByNotation(data, accessor)\r\n accessors.set(accessor, value)\r\n return value\r\n }\r\n return { get }\r\n}\r\n\r\nexport const isElement = (value: unknown): value is Element => {\r\n return (\r\n value instanceof Element ||\r\n (value instanceof Node && value.nodeType === Node.ELEMENT_NODE)\r\n )\r\n}\r\n","export const NS = 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'\r\nexport const NS_PREFIX = 'http://schemas.openxmlformats.org/officeDocument/2006'\r\nexport const NS_TC = 'http://schemas.microsoft.com/office/spreadsheetml/2018/threadedcomments'\r\nexport const GLOBAL_RELS = '_rels/.rels'\r\nexport const OFFICE_DOCUMENT_TYPE = `${NS_PREFIX}/relationships`\r\nexport const RELS_FILE = 'xl/_rels/workbook.xml.rels'\r\nexport const CALC_CHAIN_FILE = 'xl/calcChain.xml'\r\nexport const CALC_CHAIT_ATTR = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/calcChain'\r\nexport const NS_REL = 'http://schemas.openxmlformats.org/package/2006/relationships'\r\nexport const TAGS_ORDER = [\r\n 'sheetData',\r\n 'mergeCells',\r\n 'conditionalFormatting',\r\n 'dataValidations',\r\n 'pageMargins',\r\n 'tableParts',\r\n 'extLst',\r\n 'legacyDrawing'\r\n]\r\n","import type { CellType, CellRef, RangeRef, Cell } from '../types/cells'\n\nexport const toCellRef = (ref: CellRef): string => {\n let col = ref.column\n\n if (col <= 0) throw new Error(`Invalid column: ${col}`)\n\n let column = ''\n while (col > 0) {\n const rem = (col - 1) % 26\n column = String.fromCharCode(65 + rem) + column\n col = Math.floor((col - 1) / 26)\n }\n\n const colPart = `${(ref.columnAbsolute === true ? '$' : '')}${column}`\n const rowPart = `${(ref.rowAbsolute === true ? '$' : '')}${ref.row}`\n\n if (ref.row <= 0) throw new Error(`Invalid row: ${ref.row}`)\n\n return colPart + rowPart\n}\n\nexport const parseCellRef = (ref: string): CellRef => {\n const normalized = ref.trim().toUpperCase()\n\n let column = 0\n let i = 0\n\n let columnAbsolute = false\n let rowAbsolute = false\n\n // Check column $\n if (normalized[i] === '$') {\n columnAbsolute = true\n i++\n }\n\n // Parse column letters\n for (; i < normalized.length; i++) {\n const code = normalized.charCodeAt(i)\n if (code < 65 || code > 90) break\n column = column * 26 + (code - 64)\n }\n\n // Check row $\n if (normalized[i] === '$') {\n rowAbsolute = true\n i++\n }\n\n // Parse row digits\n const rowStr = normalized.slice(i)\n const row = Number(rowStr)\n\n if (column === 0 || rowStr === '' || Number.isNaN(row)) {\n throw new Error(`Invalid cell reference: ${ref}`)\n }\n\n return { row, column, rowAbsolute, columnAbsolute }\n}\n\nexport const parseCellRange = (ref: string): RangeRef => {\n const parts = ref.split(':')\n if (parts.length === 0 || parts.length > 2) {\n throw new Error(`Invalid cell range: ${ref}`)\n }\n if (parts.length === 1) parts.push(parts[0])\n const [start, end] = parts\n if (start === undefined || end === undefined) throw new Error(`Cell ${ref} is broken`)\n const startRef = parseCellRef(start)\n const endRef = parseCellRef(end)\n return {\n rowStart: startRef.row,\n columnStart: startRef.column,\n rowAbsoluteStart: startRef.rowAbsolute,\n columnAbsoluteStart: startRef.columnAbsolute,\n rowEnd: endRef.row,\n columnEnd: endRef.column,\n rowAbsoluteEnd: endRef.rowAbsolute,\n columnAbsoluteEnd: endRef.columnAbsolute\n }\n}\n\nexport const toCellRange = (range: Partial<RangeRef>): string => {\n if (range.rowStart === undefined && range.rowEnd === undefined) {\n if (range.columnStart === undefined || range.columnEnd === undefined) {\n throw new Error('Range is not defined')\n }\n return [\n range.columnAbsoluteStart === true ? '$' : '',\n String(range.columnStart),\n ':',\n range.columnAbsoluteEnd === true ? '$' : '',\n String(range.columnEnd)\n ].join('')\n }\n\n if (range.columnStart === undefined && range.columnEnd === undefined) {\n if (range.rowStart === undefined || range.rowEnd === undefined) {\n throw new Error('Range is not defined')\n }\n return [\n range.rowAbsoluteStart === true ? '$' : '',\n getExcelColumnName(range.rowStart),\n ':',\n range.rowAbsoluteEnd === true ? '$' : '',\n getExcelColumnName(range.rowEnd)\n ].join('')\n }\n\n if (\n range.rowStart === undefined ||\n range.columnStart === undefined ||\n range.rowEnd === undefined ||\n range.columnEnd === undefined\n ) {\n throw new Error('Range is not defined')\n }\n const start = toCellRef({\n row: range.rowStart,\n column: range.columnStart,\n rowAbsolute: range.rowAbsoluteStart,\n columnAbsolute: range.columnAbsoluteStart\n })\n if (range.rowEnd === 0 && range.columnEnd === 0) return start\n\n const end = toCellRef({\n row: range.rowEnd,\n column: range.columnEnd,\n rowAbsolute: range.rowAbsoluteEnd,\n columnAbsolute: range.columnAbsoluteEnd\n })\n\n return `${start}:${end}`\n}\n\nexport const getExcelColumnIndex = (cellRef: string): number => {\n let index = 0\n\n for (let i = 0; i < cellRef.length; i++) {\n const code = cellRef.charCodeAt(i)\n\n // Stop when we hit a digit\n if (code < 65 || code > 90) { break }\n\n index = index * 26 + (code - 64)\n }\n\n return index\n}\n\nexport const getExcelColumnName = (index: number): string => {\n let result = ''\n while (index > 0) {\n index--\n result = String.fromCharCode(65 + (index % 26)) + result\n index = Math.floor(index / 26)\n }\n return result\n}\n\nexport const dateToExcel = (value: string | Date): string => {\n const date = new Date(value)\n const dateValue = 25_569 + ((date.getTime() - (date.getTimezoneOffset() * 60 * 1000)) / (1000 * 60 * 60 * 24))\n return String(dateValue)\n}\n\n/**\n * Converts a JavaScript value into an Excel-compatible cell value\n * based on the specified cell type.\n *\n * Notes:\n * - Performs loose coercion for objects via String() / JSON.stringify()\n * - Falls back to String(value) if no branch matches\n *\n * @param value - Input value of any type\n * @param cellType - Target Excel cell type\n * @returns Excel-compatible string value or null\n */\n\ninterface ConvertValueToExcel {\n value: unknown\n cellType: CellType | null\n}\n\nexport const convertValueToExcel = ({ value, cellType }: ConvertValueToExcel): string | null => {\n if (cellType === null) { return null }\n switch (cellType) {\n case 'formula': {\n if (typeof value === 'object') { value = String(value) }\n if (typeof value === 'string') {\n return value.startsWith('=') ? value.slice(1) : value\n }\n\n break\n }\n case 'date': {\n if (value instanceof Date || typeof value === 'string') {\n return dateToExcel(value)\n }\n if (typeof value === 'object') {\n return dateToExcel(String(value))\n }\n\n break\n }\n case 'boolean': {\n if (typeof value === 'boolean') { return String(Number(value)) }\n if (typeof value === 'object') { return String(Number(/true/i.test(String(value)))) }\n\n break\n }\n case 'number': {\n if (typeof value === 'object') { return String(value) }\n if (typeof value === 'number') { return value.toString() }\n\n break\n }\n default: { if (typeof value === 'object') {\n return JSON.stringify(value)\n }\n }\n }\n return String(value)\n}\n\n/**\n * Guesses the most appropriate Excel data type for a given value.\n *\n * Notes:\n * - Invalid Date objects are treated as 'null'\n * - URL detection uses a permissive regex\n * - Objects default to string unless explicitly typed\n *\n * @param value - Any input value\n * @returns Inferred data type for Excel cell handling\n */\n\nconst urlPatten = String.raw`^(?!mailto:)(?:(?:http|https|ftp)://)(?:\\S+(?::\\S*)?@)?(?:(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[0-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})))|localhost)(?::\\d{2,5})?(?:(/|\\?|#)[^\\s]*)?$`\nconst urlRegex = new RegExp(urlPatten, 'i')\n\nexport const guessDataType = (value: unknown): CellType | null => {\n if (value === undefined || value === null || value === '') { return null }\n if (typeof value === 'number') { return 'number' }\n if (typeof value === 'boolean') { return 'boolean' }\n\n if (value instanceof Date) {\n return isNaN(value.getTime()) ? null : 'date'\n }\n\n if (typeof value === 'string') {\n if (value.startsWith('=')) return 'formula' // cheaper than regex\n if (urlRegex.test(value)) return 'url'\n return 'string'\n }\n\n if (typeof value === 'object') {\n if ('$cellType' in value) { return value.$cellType as CellType }\n return 'string'\n }\n\n return null\n}\n\nexport const getRelationsPath = (partPath: string): string => {\n const slash = partPath.lastIndexOf('/')\n const file = partPath.slice(slash + 1)\n return `_rels/${file}.rels`\n}\n\nexport const isInRange = (c: Cell, r: RangeRef): boolean =>\n c.column >= r.columnStart &&\n c.column <= r.columnEnd &&\n c.row >= r.rowStart &&\n c.row <= r.rowEnd\n\ninterface CompleteLocation {\n row: number\n column: number\n ref: string\n}\n\nexport const completeLocation = (\n input: Partial<CompleteLocation>\n): CompleteLocation => {\n let { row, column, ref } = input\n\n if (ref !== undefined) {\n const parsed = parseCellRef(ref)\n row ??= parsed.row\n column ??= parsed.column\n }\n\n if (row !== undefined && column !== undefined) {\n ref ??= toCellRef({ row, column })\n }\n\n if (row === undefined || column === undefined || ref === undefined) {\n throw new Error('Location is not defined')\n }\n\n return { row, column, ref }\n}\n","import type { Cell } from '../types/cells'\r\nimport type { MergedCells } from '../types/merged-cells'\r\nimport type { Tables } from '../types/tables'\r\nimport type { Offset } from '../types/offsets'\r\n\r\nexport function getOffsets ({\r\n cells,\r\n mergedCells,\r\n tables\r\n}: {\r\n cells: Cell[]\r\n mergedCells: MergedCells\r\n tables: Tables\r\n}): Offset {\r\n let rowOffset = 0\r\n let initialRowOffset = 0\r\n let columnOffset = 0\r\n let currentRow = -1\r\n\r\n const offsets: Offset = {\r\n row: {},\r\n col: {}\r\n }\r\n\r\n for (const cell of cells) {\r\n if (cell.inTable !== undefined) {\r\n const table = tables.get(cell.inTable)\r\n if (table === undefined) continue\r\n // Extend layout on the end of the header\r\n if (cell.column === table.range.columnEnd && cell.row === table.range.rowStart) {\r\n const tableHeight = table.range.rowEnd - table.range.rowStart + 1\r\n for (let i = 0; i < tableHeight; i++) {\r\n const row = cell.row + i\r\n offsets.col[row] ??= {}\r\n offsets.col[row][table.range.columnEnd] = table.extension.cols\r\n }\r\n table.finalize()\r\n continue\r\n }\r\n }\r\n\r\n if (!Array.isArray(cell.newValue)) continue\r\n if (currentRow !== cell.row) {\r\n initialRowOffset = rowOffset\r\n currentRow = cell.row\r\n columnOffset = 0\r\n }\r\n if (offsets.col[currentRow] !== undefined) {\r\n for (const column of Object.keys(offsets.col[currentRow])) {\r\n const index = parseInt(column)\r\n if (index < cell.column) columnOffset = columnOffset = Math.max(columnOffset, offsets.col[currentRow][index])\r\n }\r\n }\r\n let unit = 1\r\n let rows = 1\r\n\r\n if (cell.inMergedCell !== undefined) {\r\n const merge = mergedCells.get(cell.inMergedCell)\r\n if (merge !== undefined) {\r\n unit = '$isTable' in cell.newValue ? merge.height : merge.width\r\n rows = merge.height\r\n }\r\n }\r\n if ('$isTable' in cell.newValue) {\r\n const existingOffset = offsets.row[cell.row] ?? 0\r\n const newOffset = initialRowOffset + cell.newValue.length * unit - unit\r\n rowOffset = Math.max(newOffset, existingOffset ?? 0)\r\n offsets.row[cell.row] = rowOffset\r\n continue\r\n }\r\n const delta = cell.newValue.length * unit - unit\r\n columnOffset = columnOffset + delta\r\n for (let i = 0; i < rows; i++) {\r\n const row = cell.row + i\r\n offsets.col[row] ??= {}\r\n offsets.col[row][cell.column] = columnOffset\r\n }\r\n }\r\n return offsets\r\n}\r\n\r\nexport const getRowShift = (cell: { row: number }, offsets: Offset): number => {\r\n let shift = 0\r\n for (const r in offsets.row) {\r\n const ri = Number(r)\r\n if (ri < cell.row) shift = offsets.row[ri]\r\n }\r\n return shift\r\n}\r\n\r\nexport const getColumnShift = (cell: Cell, offsets: Offset): number => {\r\n const rowOffsets = offsets.col\r\n const colOffsets = rowOffsets[cell.row]\r\n if (colOffsets === undefined) return 0\r\n let shift = 0\r\n for (const c in colOffsets) {\r\n const ci = Number(c)\r\n if (ci < cell.column) shift = colOffsets[ci]\r\n }\r\n return shift\r\n}\r\n","import JSZip from 'jszip'\r\nimport { type Cell } from '../types/cells'\r\nimport { NS } from './constants'\r\nimport { toCellRef } from './excel-helpers'\r\n\r\nexport const readXlsx = async (buffer: ArrayBuffer): Promise<JSZip> => {\r\n const zip = new JSZip()\r\n const content = await zip.loadAsync(buffer)\r\n return content\r\n}\r\n\r\nexport const createXml = ({\r\n coreSchema,\r\n specificSchema,\r\n tagName\r\n}: {\r\n coreSchema?: string\r\n specificSchema: string\r\n tagName: string\r\n}): XMLDocument => {\r\n const doc = document.implementation.createDocument(specificSchema, tagName, null)\r\n const root = doc.documentElement\r\n root.setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns', specificSchema)\r\n if (coreSchema !== undefined) {\r\n root.setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:x', coreSchema)\r\n }\r\n return doc\r\n}\r\n\r\nconst serializer = new XMLSerializer()\r\nexport const serializeXml = (doc: Document): string => {\r\n let serialized = serializer.serializeToString(doc)\r\n if (!serialized.startsWith('<?xml')) {\r\n serialized = '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' + serialized\r\n }\r\n return serialized\r\n}\r\n\r\nexport const valueToString = (value: unknown): string => {\r\n if (value === undefined || value === null) { return '' }\r\n if (Array.isArray(value)) { return value.map(valueToString).toString() }\r\n if (typeof value === 'object') {\r\n if ('$cellType' in value) { return String(value) }\r\n return JSON.stringify(value)\r\n }\r\n if (typeof value === 'number') { return value.toString() }\r\n return String(value)\r\n}\r\n\r\n/**\r\n * Creates an Excel shared string (`<si>`) element for a given text value.\r\n *\r\n * - Wraps the text in `<si><t>...</t></si>` using the provided XML document\r\n * - Adds `xml:space=\"preserve\"` when leading/trailing whitespace is present\r\n * (required by Excel to avoid trimming)\r\n * - Uses the sharedStrings namespace (NS)\r\n *\r\n * @param text - Text content of the shared string\r\n * @param doc - XML document used to create elements\r\n * @returns `<si>` element ready to be inserted into sharedStrings.xml\r\n */\r\n\r\nexport const createSharedString = (\r\n text: string,\r\n doc: Document = document\r\n): Element => {\r\n const si = doc.createElementNS(NS, 'si')\r\n const t = doc.createElementNS(NS, 't')\r\n\r\n // Excel requires xml:space=\"preserve\" when whitespace matters\r\n if (/^\\s|\\s$/.test(text)) {\r\n t.setAttributeNS(\r\n 'http://www.w3.org/XML/1998/namespace',\r\n 'xml:space',\r\n 'preserve'\r\n )\r\n }\r\n\r\n t.textContent = text\r\n si.append(t)\r\n return si\r\n}\r\n\r\n/**\r\n * Creates an Excel `<c>` (cell) XML element.\r\n *\r\n * @param params - Cell definition + XML document\r\n * @returns `<c>` element ready to append to worksheet\r\n */\r\n\r\nconst toType = {\r\n null: 's',\r\n error: 'e',\r\n number: null,\r\n boolean: 'b',\r\n string: 's',\r\n date: null,\r\n formula: null,\r\n url: 's'\r\n}\r\n\r\nexport const createCell = ({\r\n value,\r\n type,\r\n style,\r\n row,\r\n column,\r\n formula,\r\n xml\r\n}: Cell & { xml: Document }): Element => {\r\n const c = xml.createElementNS(NS, 'c')\r\n if (style !== null) c.setAttribute('s', style)\r\n const ref = toCellRef({ row, column })\r\n c.setAttribute('r', ref)\r\n if (type !== null) {\r\n const excelType = toType[type]\r\n if (excelType !== undefined && excelType !== null) c.setAttribute('t', excelType)\r\n }\r\n\r\n if (formula !== null && formula !== undefined) {\r\n const f = xml.createElementNS(NS, 'f')\r\n f.textContent = formula\r\n c.append(f)\r\n }\r\n\r\n if (value !== null && value !== undefined) {\r\n const v = xml.createElementNS(NS, 'v')\r\n v.textContent = String(value)\r\n c.append(v)\r\n }\r\n\r\n return c\r\n}\r\n","import type { DataStore } from '../types/data-store'\nimport { valueToString } from './xml-helpers'\n\n// Regular expression for parsing a property accessor enclosed in ${}\nconst accessorRegex = /(?<=^\\$\\{)(?<table>\\s*table:\\s*)?(?<accessor>[^}]+?)(?=\\s*}$)/\n\n// Global regular expression for extracting all property accessors enclosed in ${}\nconst globalAccessorRegex = /\\$\\{(?<accessor>[^}]+)}/g\n\nexport const replaceAccessors = (text: string, dataStore: DataStore): string => {\n return text.replace(globalAccessorRegex, (_match, accessor) => {\n return valueToString(dataStore.get(accessor))\n })\n}\n\nexport const getReplacements = (oldValues: Element[], dataStore: DataStore): Map<string, unknown> => {\n const replacements: Map<string, unknown> = new Map()\n\n let index = -1\n for (const si of oldValues) {\n index++\n if (si.children.length === 1 && si.children[0].tagName === 't') {\n const element = si.children[0]\n const text = element.textContent\n const match = text.match(accessorRegex)\n if (match === null) {\n const value = replaceAccessors(text, dataStore)\n replacements.set(String(index), value)\n continue\n }\n if (match.groups === undefined) {\n replacements.set(String(index), text)\n continue\n }\n const isTable = typeof match.groups.table === 'string'\n const value = dataStore.get(match.groups.accessor)\n if (typeof value !== 'object') {\n replacements.set(String(index), '')\n continue\n }\n const cloned = structuredClone(value)\n if (isTable) Object.defineProperty(cloned, '$isTable', { value: true, enumerable: false })\n replacements.set(String(index), cloned)\n continue\n }\n for (const t of Array.from(si.querySelectorAll('t'))) {\n const text = t.textContent ?? ''\n t.textContent = replaceAccessors(text, dataStore)\n replacements.set(String(index), si)\n }\n }\n return replacements\n}\n","import { type Cell } from '../types/cells'\r\nimport { type DataStore } from '../types/data-store'\r\nimport type { CreateDataValidation } from '../types/data-validation'\r\nimport { type Workbook } from '../types/workbook'\r\nimport { NS } from './constants'\r\nimport { isElement } from './data-helpers'\r\nimport { convertValueToExcel, guessDataType } from './excel-helpers'\r\nimport { getColumnShift, getOffsets, getRowShift } from './get-offsets'\r\nimport { getReplacements } from './get-replacements'\r\nimport { createCell } from './xml-helpers'\r\n\r\ninterface ProcessWorkSheets {\r\n workbook: Workbook\r\n dataStore: DataStore\r\n}\r\n\r\nexport const processWorksheets = async ({\r\n workbook,\r\n dataStore\r\n}: ProcessWorkSheets): Promise<void> => {\r\n const {\r\n styles,\r\n sharedStrings,\r\n dataValidations,\r\n pivotTables,\r\n extensionLists\r\n } = workbook\r\n\r\n const oldValues = sharedStrings.oldValues\r\n const replacements = getReplacements(oldValues, dataStore)\r\n\r\n for (const worksheet of workbook.sheets) {\r\n const {\r\n name,\r\n cells,\r\n mergedCells,\r\n hyperlinks,\r\n comments,\r\n conditionalFormattings,\r\n tables,\r\n xml,\r\n replaceCells\r\n } = worksheet\r\n comments.changeComments(dataStore)\r\n\r\n // Fill cells with new data\r\n const processedCells = cells\r\n .filter((cell: Cell) => {\r\n if (cell.inMergedCell !== undefined) {\r\n if ((cell.value === undefined || cell.value === null) &&\r\n (cell.formula === undefined || cell.formula === null)\r\n ) return false\r\n }\r\n return true\r\n })\r\n .map((cell: Cell) => {\r\n if (cell.type !== 'string') return cell\r\n if (cell.value === undefined) return cell\r\n if (cell.value === null) return cell\r\n cell.newValue = replacements.get(String(cell.value))\r\n if (cell.inTable !== undefined) {\r\n const table = tables.get(cell.inTable)\r\n table?.extend(cell)\r\n }\r\n\r\n if (cell.inConditionalFormatting !== undefined) {\r\n const formatting = conditionalFormattings.get(cell.inConditionalFormatting)\r\n formatting?.extend(cell)\r\n }\r\n if (cell.inDataValidation !== undefined) {\r\n const dataValidation = dataValidations.get(cell.inDataValidation)\r\n dataValidation?.extend(cell)\r\n }\r\n if (cell.inDataValidationList !== undefined) {\r\n const dataValidation = dataValidations.get(cell.inDataValidationList)\r\n dataValidation?.extendFormula(cell)\r\n }\r\n if (cell.inExtensionList !== undefined) {\r\n const extension = extensionLists.get(cell.inExtensionList)\r\n extension?.extend(cell)\r\n }\r\n if (cell.inExtensionListSource !== undefined) {\r\n const extension = extensionLists.get(cell.inExtensionListSource)\r\n extension?.extendFormula(cell)\r\n }\r\n if (cell.inPivotTableSource !== undefined) {\r\n const pivotTableSource = pivotTables.get(cell.inPivotTableSource)\r\n pivotTableSource?.extend(cell)\r\n }\r\n return cell\r\n })\r\n\r\n processedCells.sort((cell1: Cell, cell2: Cell) => {\r\n if (cell1.row !== cell2.row) return cell1.row - cell2.row\r\n return cell1.column - cell2.column\r\n })\r\n\r\n // Get offsets for new cells\r\n const offsets = getOffsets({\r\n cells: processedCells,\r\n mergedCells,\r\n tables\r\n })\r\n\r\n // Change cell location\r\n const movedCells = processedCells.map((cell: Cell) => {\r\n const colOffset = getColumnShift(cell, offsets)\r\n const rowOffset = getRowShift(cell, offsets)\r\n cell.column = cell.column + colOffset\r\n cell.row = cell.row + rowOffset\r\n return cell\r\n })\r\n\r\n // Extend cells\r\n const extendedCells: Cell[] = []\r\n for (const cell of movedCells) {\r\n if (cell.type !== 'string' || !Array.isArray(cell.newValue)) {\r\n extendedCells.push(cell)\r\n continue\r\n }\r\n if (Array.isArray(cell.newValue)) {\r\n const mergedCell = mergedCells.get(cell.inMergedCell ?? '')\r\n let width = 1\r\n let height = 1\r\n if (mergedCell !== undefined) {\r\n width = mergedCell.width\r\n height = mergedCell.height\r\n }\r\n for (let i = 0; i < cell.newValue.length; i++) {\r\n const newCell = { ...cell }\r\n newCell.newValue = cell.newValue[i]\r\n newCell.column = newCell.column + ('$isTable' in cell.newValue ? 0 : width) * i\r\n newCell.row = newCell.row + ('$isTable' in cell.newValue ? height : 0) * i\r\n if (mergedCell !== undefined) {\r\n mergedCells.add({\r\n columnStart: newCell.column,\r\n rowStart: newCell.row,\r\n columnEnd: newCell.column + width - 1,\r\n rowEnd: newCell.row + height - 1\r\n })\r\n }\r\n extendedCells.push(newCell)\r\n }\r\n }\r\n }\r\n\r\n const newCells = extendedCells.map((cell: Cell) => {\r\n if (isElement(cell.newValue)) {\r\n const sharedValue = sharedStrings.get(cell.newValue)\r\n cell.value = sharedValue\r\n return cell\r\n }\r\n if (cell.type !== 'string') {\r\n if (cell.type === 'formula') cell.value = null\r\n return cell\r\n }\r\n const newValue = cell.newValue === undefined ? cell.value : cell.newValue\r\n const cellType = cell.type === 'string' ? guessDataType(newValue) : cell.type\r\n const value = convertValueToExcel({ value: newValue, cellType })\r\n cell.type = cellType\r\n\r\n if ((cellType === 'formula' || cellType === 'error') && typeof value === 'string') {\r\n if (cell.formula === undefined) cell.formula = value\r\n cell.type = 'formula'\r\n cell.value = null\r\n return cell\r\n }\r\n if (cellType === 'string' && typeof value === 'string') {\r\n const sharedValue = sharedStrings.get(value)\r\n cell.value = sharedValue\r\n return cell\r\n }\r\n if (cellType === 'url' && typeof value === 'string') {\r\n cell.style = styles.getHyperlinkFormat()\r\n const sharedValue = sharedStrings.get(value)\r\n cell.value = sharedValue\r\n hyperlinks.add({ range: cell, url: value })\r\n return cell\r\n }\r\n if (cellType === 'date') {\r\n cell.style = styles.getDateFormat()\r\n }\r\n cell.value = value\r\n return cell\r\n })\r\n\r\n const rowsMap = new Map<number, Element>()\r\n for (const cell of newCells) {\r\n let row = rowsMap.get(cell.row)\r\n if (row === undefined) {\r\n row = xml.createElementNS(NS, 'row')\r\n row.setAttribute('r', String(cell.row))\r\n rowsMap.set(cell.row, row)\r\n row = rowsMap.get(cell.row)\r\n }\r\n row?.append(createCell({ ...cell, xml }))\r\n }\r\n const original = xml.querySelector('sheetData')\r\n\r\n if (original === null) throw new Error('Excel workbook is malformed')\r\n const newSheetData = original.cloneNode() as Element\r\n if (newSheetData === undefined) throw new Error('Excel workbook is mailformed')\r\n for (const row of rowsMap.values()) { newSheetData.append(row) }\r\n\r\n const validations = dataStore.get('$validations')\r\n if (Array.isArray(validations)) {\r\n for (const validation of (validations as CreateDataValidation[])) {\r\n if (validation.sheet !== name) continue\r\n dataValidations.add(xml, validation)\r\n }\r\n }\r\n replaceCells(newSheetData)\r\n comments.save()\r\n conditionalFormattings.save()\r\n tables.save()\r\n hyperlinks.save()\r\n }\r\n dataValidations.save()\r\n extensionLists.save()\r\n pivotTables.save()\r\n for (const worksheet of workbook.sheets) worksheet.save()\r\n}\r\n","// This one is for a strategy pattern in the future\r\nexport const parser = new DOMParser()\r\n\r\nexport const generateUUID = (): string => {\r\n return crypto.randomUUID()\r\n}\r\n","import type JSZip from 'jszip'\nimport { type Styles } from '../types/styles'\n\nimport { NS } from './constants'\nimport { parser } from './global-helpers'\n\nconst DATE_FORMAT = String.raw`yyyy\\-mm\\-dd;@`\nconst serializer = new XMLSerializer()\n\nconst hasAtLeastTwoDateParts = (s: string): boolean => {\n let count = 0\n const lower = s.toLowerCase()\n for (const p of ['y', 'm', 'd', 'h']) {\n if (lower.includes(p) && ++count >= 2) return true\n }\n return false\n}\n\nexport const createStyles = async (zip: JSZip, target: string): Promise<Styles> => {\n let numFmts: Element | null\n let numFmtId: number\n let cachedDateFormatId: string | null = null\n let cachedLinkFormatId: string | null = null\n let isDirty: boolean = false\n\n // Get styles file\n const xmlStyle = await zip.file(`xl/${target}`)?.async('string')\n if (xmlStyle === undefined) throw new Error('This Excel file is corrupted: styles.xml missing')\n\n // Parse data to parts\n const domStyle = parser.parseFromString(xmlStyle, 'application/xml')\n const styleSheet = domStyle.querySelector('styleSheet')\n const cellXfs = domStyle.querySelector('cellXfs')\n if (styleSheet === null || cellXfs === null) throw new Error('Invalid styles.xml structure')\n\n // Get custom formats\n numFmts = domStyle.querySelector('numFmts')\n if (numFmts === null) {\n numFmts = domStyle.createElementNS(NS, 'numFmts')\n styleSheet.prepend(numFmts)\n }\n\n const existingIds = Array.from(\n domStyle.querySelectorAll('numFmt'),\n el => Number(el.getAttribute('numFmtId'))\n ).filter(Number.isFinite)\n\n // Create an unique id for the new format\n numFmtId = Math.max(163, ...existingIds)\n\n const save = (): void => {\n if (!isDirty) return\n const newXfData = serializer.serializeToString(domStyle)\n zip.file(`xl/${target}`, newXfData)\n }\n\n const getDateFormat = (): string => {\n const existingDateFormat = Array.from(\n domStyle.querySelectorAll('cellXfs xf')\n ).findIndex(el => {\n return ['14', '15', '16', '17', '18', '22'].includes(el.getAttribute('numFmtId') ?? '') ||\n hasAtLeastTwoDateParts(el.getAttribute('formatCode') ?? '')\n })\n if (existingDateFormat !== -1) {\n cachedDateFormatId = String(existingDateFormat)\n return cachedDateFormatId\n }\n // Create custom date format\n\n numFmtId++\n const numFmt = domStyle.createElementNS(NS, 'numFmt')\n numFmt.setAttribute('numFmtId', String(numFmtId))\n numFmt.setAttribute('formatCode', DATE_FORMAT)\n if (numFmts === null || cellXfs === null) throw new Error('Number formats are mailformed')\n numFmts.append(numFmt)\n numFmts.setAttribute('count', String(numFmts.children.length))\n\n // Create number format\n const xf = domStyle.createElementNS(NS, 'xf')\n xf.setAttribute('numFmtId', String(numFmtId))\n xf.setAttribute('fontId', '0')\n xf.setAttribute('fillId', '0')\n xf.setAttribute('borderId', '0')\n xf.setAttribute('xfId', '0')\n xf.setAttribute('applyNumberFormat', '1')\n cellXfs.append(xf)\n cellXfs.setAttribute('count', String(cellXfs.children.length))\n isDirty = true\n cachedDateFormatId = String(cellXfs.children.length - 1)\n return cachedDateFormatId\n }\n\n const getHyperlinkFormat = (): string => {\n const fonts = domStyle.querySelector('fonts')\n if (fonts === null || cellXfs === null) {\n throw new Error('styles.xml malformed')\n }\n\n // Try to reuse existing hyperlink font (underline + theme color 10)\n let fontId = Array.from(fonts.children).findIndex(font => {\n return (\n font.querySelector('u') !== undefined &&\n font.querySelector('color')?.getAttribute('theme') === '10'\n )\n })\n\n if (fontId === -1) {\n const font = domStyle.createElementNS(NS, 'font')\n\n const color = domStyle.createElementNS(NS, 'color')\n color.setAttribute('theme', '10') // Excel hyperlink theme color\n\n const underline = domStyle.createElementNS(NS, 'u')\n\n font.append(color, underline)\n\n fonts.append(font)\n fonts.setAttribute('count', String(fonts.children.length))\n fontId = fonts.children.length - 1\n }\n\n // Reuse existing XF if present\n const xfIndex = Array.from(cellXfs.children).findIndex(\n xf => xf.getAttribute('fontId') === String(fontId)\n )\n\n if (xfIndex !== -1) return String(xfIndex)\n\n // Create new XF\n const xf = domStyle.createElementNS(NS, 'xf')\n xf.setAttribute('fontId', String(fontId))\n xf.setAttribute('fillId', '0')\n xf.setAttribute('borderId', '0')\n xf.setAttribute('xfId', '0')\n xf.setAttribute('applyFont', '1')\n\n cellXfs.append(xf)\n cellXfs.setAttribute('count', String(cellXfs.children.length))\n isDirty = true\n cachedLinkFormatId = String(cellXfs.children.length - 1)\n return cachedLinkFormatId\n }\n\n return { save, getDateFormat, getHyperlinkFormat }\n}\n","import type JSZip from 'jszip'\nimport type { SharedStrings } from '../types/shared-strings'\n\nimport { serializeXml, createSharedString } from './xml-helpers'\nimport { parser } from './global-helpers'\n\nexport const getSharedStrings = async (\n xlsx: JSZip,\n target: string\n): Promise<SharedStrings> => {\n let isDirty = false\n const filename = `xl/${target}`\n // Read all shared text values\n const xmlText = await xlsx.file(filename)?.async('string')\n if (xmlText === undefined) { throw new Error('This Excel template has no strings') }\n\n // Get the xml with shared shared strings\n const xml = parser.parseFromString(xmlText, 'application/xml')\n\n // Get shared strings element\n const sst = xml.querySelector('sst')\n if (sst === null) throw new Error('This Excel template has no strings')\n\n const oldValues = Array.from(sst.children)\n\n // Create new shared strings\n const strings = new Map<string, string>()\n const elements = new WeakMap<Element, string>()\n const list: Element[] = []\n\n // Create new shared strings\n const get = (el: string | Element): string => {\n if (typeof el === 'string') {\n const value = strings.get(el)\n if (value !== undefined) { return value }\n const newString = createSharedString(el, xml)\n const index = String(list.length)\n strings.set(el, index)\n list.push(newString)\n isDirty = true\n return index\n }\n const value = elements.get(el)\n if (value !== undefined) { return value }\n const index = String(list.length)\n elements.set(el, index)\n list.push(el)\n isDirty = true\n return index\n }\n\n const save = (): void => {\n if (!isDirty) return\n sst?.replaceChildren(...list)\n const text = serializeXml(xml)\n xlsx.file(filename, text)\n }\n\n return {\n oldValues,\n get,\n save\n }\n}\n","import type { Cell } from '../types/cells'\nimport { parseCellRef, getExcelColumnIndex, getExcelColumnName } from './excel-helpers'\n\ninterface ShiftMap {\n rows: Map<number, number>\n cols: Map<number, number>\n}\n\nconst typesDict: Record<string, Cell['type']> = {\n f: 'formula',\n e: 'error',\n b: 'boolean',\n s: 'string',\n n: 'number'\n}\n\nexport const cellToModel = (cell: Element): Cell => {\n const currentType = cell.getAttribute('t')\n const cellType = typesDict[currentType as keyof typeof typesDict ?? 'n']\n const cellRef = cell.getAttribute('r')\n const cellStyle = cell.getAttribute('s')\n let value: string | number | undefined = cell.querySelector('v')?.textContent\n if (cellType === 'number' && typeof value === 'string') value = parseFloat(value)\n const formula = cell.querySelector('f')?.textContent\n if (cellRef === null) { throw new Error('Excel template is mailformed') }\n const { row, column } = parseCellRef(cellRef)\n return {\n ref: cellRef,\n row,\n column,\n style: cellStyle,\n type: cellType,\n ...(formula !== undefined ? { formula } : {}),\n ...(value !== undefined ? { value } : {})\n }\n}\n\ninterface ShiftMap {\n rows: Map<number, number>\n cols: Map<number, number>\n}\n\nexport const shiftCellRef = (ref: string, shift: ShiftMap): string => {\n const match = ref.match(/^([A-Z]+)(\\d+)$/)\n if (match === null) return ref\n\n const [, colLetters, rowStr] = match\n const row = Number(rowStr)\n\n const column = getExcelColumnIndex(colLetters)\n\n const newRow = shift.rows.get(row)\n const newColumn = shift.cols.get(column)\n if (newRow === undefined || newColumn === undefined) throw new Error('Cell is not defined')\n\n return getExcelColumnName(newColumn) + String(newRow)\n}\n\nexport const shiftRange = (ref: string, shift: ShiftMap): string => {\n const parts = ref.split(':')\n\n if (parts.length === 1) {\n return shiftCellRef(parts[0], shift)\n }\n\n const [start, end] = parts\n return `${shiftCellRef(start, shift)}:${shiftCellRef(end, shift)}`\n}\n\nexport const updateTables = (tableXml: Document, shift: ShiftMap): void => {\n const table = tableXml.querySelector('table')\n if (table === null) return\n\n const ref = table.getAttribute('ref')\n if (typeof ref === 'string') {\n table.setAttribute('ref', shiftRange(ref, shift))\n }\n\n const autoFilter = table.querySelector('autoFilter')\n const afRef = autoFilter?.getAttribute('ref')\n\n if (typeof afRef === 'string') {\n autoFilter?.setAttribute('ref', shiftRange(afRef, shift))\n }\n}\n","import type { Cell } from '../types/cells'\nimport { NS } from './constants'\nimport { cellToModel } from './cells-helpers'\n\nexport const getCells = (xml: Document): Cell[] => {\n const sheetData = xml.querySelector('sheetData') ?? xml.createElementNS(NS, 'sheetData')\n const cellsXml = sheetData.querySelectorAll('c')\n const cells = cellsXml === undefined ? [] : Array.from(cellsXml).map(c => cellToModel(c))\n return cells\n}\n","import type { Cell, RangeRef } from '../types/cells'\nimport type { MergedCell, MergedCells } from '../types/merged-cells'\nimport { NS } from './constants'\nimport { isInRange, parseCellRange, toCellRange } from './excel-helpers'\n\nexport const getMergedCells = (xml: Document): MergedCells => {\n const mergedCells = new Map<string, MergedCell>()\n const mergeCellsParent = xml.querySelector('mergeCells') ?? xml.createElementNS(NS, 'mergeCells')\n const mergeCellsXml = mergeCellsParent.querySelectorAll('mergeCell')\n\n for (const mergedCell of Array.from(mergeCellsXml)) {\n const ref = mergedCell.getAttribute('ref')\n if (ref === null) continue\n const range = parseCellRange(ref)\n mergedCells.set(ref, {\n range,\n width: range.columnEnd - range.columnStart + 1,\n height: range.rowEnd - range.rowStart + 1,\n ref,\n xml: mergedCell\n })\n }\n\n mergeCellsParent.replaceChildren()\n const add = (ref: RangeRef): void => {\n const mergedCell = xml.createElementNS(NS, 'mergeCell')\n mergedCell.setAttribute('ref', toCellRange(ref))\n mergeCellsParent.appendChild(mergedCell)\n }\n\n const get = (ref: string): MergedCell | undefined => {\n return mergedCells.get(ref)\n }\n\n const findByCell = (cell: Cell): string | null => {\n for (const [name, value] of mergedCells) {\n if (isInRange(cell, value.range)) return name\n }\n return null\n }\n\n return {\n add,\n get,\n findByCell\n }\n}\n","import type { CellRef } from '../types/cells'\r\nimport type { Hyperlink, Hyperlinks } from '../types/hyperlinks'\r\nimport type { Relations } from '../types/relations'\r\n\r\nimport { NS } from './constants'\r\nimport { toCellRef } from './excel-helpers'\r\nimport { generateUUID } from './global-helpers'\r\n\r\nconst addHyperlink = (doc: Document, hyperlinks: Element, ref: string, rel: string): void => {\r\n const id = generateUUID()\r\n const el = doc.createElementNS(NS, 'hyperlink')\r\n el.setAttribute('ref', ref)\r\n el.setAttribute('r:id', rel)\r\n el.setAttribute('xr:uid', `{${id.toUpperCase()}}`)\r\n hyperlinks.appendChild(el)\r\n}\r\n\r\nexport const getHyperlinks = ({\r\n xml,\r\n relations\r\n}: {\r\n xml: Document\r\n relations: Relations\r\n}): Hyperlinks => {\r\n let exists = true\r\n let hyperLinksParent = xml.querySelector('hyperlinks')\r\n if (hyperLinksParent === null) {\r\n hyperLinksParent = xml.createElementNS(NS, 'hyperlinks')\r\n exists = false\r\n }\r\n const hyperLinksXml = hyperLinksParent.querySelectorAll('hyperlink')\r\n const existingLinks: Map<string, Hyperlink> = new Map()\r\n\r\n for (const hyperlink of hyperLinksXml) {\r\n const ref = hyperlink.getAttribute('ref')\r\n const rId = hyperlink.getAttribute('r:id')\r\n const xrUid = hyperlink.getAttribute('xr:uid')\r\n if (ref === null || rId === null || xrUid === null) continue\r\n existingLinks.set(ref, {\r\n ref,\r\n 'r:id': rId,\r\n 'xr:uid': xrUid,\r\n xml: hyperlink\r\n })\r\n }\r\n\r\n const save = (): void => {\r\n if (exists) return\r\n const pageMargins = xml.querySelector('pageMargins')\r\n if (pageMargins !== null) pageMargins.parentNode?.insertBefore(hyperLinksParent, pageMargins)\r\n }\r\n\r\n const add = ({ range, url }: {\r\n range: CellRef\r\n url: string\r\n }): void => {\r\n let id\r\n const ref = toCellRef(range)\r\n const oldUrlElemnt = xml.querySelector(`Relationship[Target=\"${url}\"]`)\r\n if (oldUrlElemnt !== null) {\r\n const oldUrl = oldUrlElemnt.getAttribute('Id')\r\n if (oldUrl !== null) id = oldUrl\r\n } else {\r\n id = relations.add({\r\n type: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink',\r\n target: url,\r\n targetMode: 'External'\r\n })\r\n }\r\n if (id === undefined) throw new Error('The URL is mailformed')\r\n addHyperlink(xml, hyperLinksParent, ref, id)\r\n }\r\n\r\n return {\r\n add,\r\n save\r\n }\r\n}\r\n","import type JSZip from 'jszip'\nimport type { ThreadedComment, Comments, Comment } from '../types/comments'\nimport { createXml, serializeXml } from './xml-helpers'\nimport type { Relations } from '../types/relations'\nimport { NS, NS_TC } from './constants'\nimport { parser } from './global-helpers'\nimport type { Workbook } from '../types/workbook'\nimport type { DataStore } from '../types/data-store'\nimport { replaceAccessors } from './get-replacements'\nimport type { OldComments } from '../types/old-comments'\nimport type { Drawings } from '../types/drawings'\nimport { parseCellRef, toCellRef } from './excel-helpers'\n\nconst addThreadedComment = (doc: Document, c: ThreadedComment): string => {\n const id = crypto.randomUUID()\n\n const el = doc.createElementNS(NS_TC, 'threadedComment')\n el.setAttribute('ref', c.ref)\n el.setAttribute('dT', new Date().toISOString())\n el.setAttribute('personId', c.personId ?? '')\n el.setAttribute('id', '{' + id.toUpperCase() + '}')\n\n const text = doc.createElementNS(NS_TC, 'text')\n text.textContent = c.text\n\n el.appendChild(text)\n doc.documentElement.appendChild(el)\n\n return id\n}\n\nexport const getComments = async ({\n xlsx,\n relations,\n workbook,\n id\n}: {\n xlsx: JSZip\n relations: Relations\n workbook: Workbook\n id: string\n}): Promise<Comments> => {\n let isDirty = false\n const guessedFilename = `../threadedComments/threadedComment${id.replace('rId', '')}.xml`\n\n const commentsRelations = relations.getElements('threadedComment')\n if (commentsRelations.length > 1) throw new Error('Comments are mailformed')\n let relationExists = commentsRelations.length > 0\n\n const commentsFileName = (commentsRelations[0]?.target ?? guessedFilename).replace('..', 'xl')\n\n const xmlText = await xlsx.file(commentsFileName)?.async('string')\n const xml = xmlText === undefined\n ? createXml({ coreSchema: NS, specificSchema: NS_TC, tagName: 'threadedComments' })\n : parser.parseFromString(xmlText, 'application/xml')\n\n if (xmlText === undefined) isDirty = true\n if (xml.getElementsByTagName('parsererror').length > 0) {\n throw new Error(`Invalid relations file for ${commentsFileName}`)\n }\n\n const oldCommentsMap = new Map<string, Comment>()\n const commentsXml = xml.querySelectorAll('threadedComment')\n\n for (const comment of commentsXml) {\n const ref = comment.getAttribute('ref')\n const dT = comment.getAttribute('dT')\n const personId = comment.getAttribute('personId')\n const id = comment.getAttribute('id')\n const text = comment.querySelector('text')?.textContent\n if (ref === null || dT === null || personId === null || id === null) continue\n oldCommentsMap.set(ref, {\n ref,\n dT,\n personId,\n id,\n text: text ?? '',\n xml: comment\n })\n }\n\n const changeComments = (datastore: DataStore): void => {\n for (const [, comment] of oldCommentsMap) {\n comment.text = replaceAccessors(comment.text, datastore)\n const text = comment.xml.querySelector('text')\n if (text === null) continue\n text.textContent = comment.text\n isDirty = true\n }\n }\n\n let oldComments: OldComments\n let drawings: Drawings\n\n const setOldComments = (props: OldComments): void => {\n oldComments = props\n }\n\n const setDrawings = (props: Drawings): void => {\n drawings = props\n }\n\n const add = ({ ref, text, row, column }: {\n row?: number\n column?: number\n ref?: string\n text: string\n }): void => {\n addRelation()\n if (ref === undefined) {\n if (row === undefined || column === undefined) {\n throw new Error('Comment position is undefined')\n }\n ref = toCellRef({ row, column })\n }\n if (row === undefined && column === undefined) {\n if (ref === undefined) {\n throw new Error('Comment position is undefined')\n }\n const location = parseCellRef(ref)\n row = location.row\n column = location.column\n }\n const { persons } = workbook\n const systemPersonId = persons.getSystemUserId()\n const id = addThreadedComment(xml, {\n personId: systemPersonId,\n ref,\n text\n })\n oldComments?.add({ id: `{${id.toUpperCase()}}`, ref, text })\n drawings?.add({ row: String(row), column: String(column) })\n isDirty = true\n }\n\n const getComment = (ref: string): string | undefined => {\n return oldCommentsMap.get(ref)?.ref\n }\n\n const addRelation = (): void => {\n if (relationExists) return\n const commentsRelation = {\n type: 'http://schemas.microsoft.com/office/2017/10/relationships/threadedComment',\n target: `../threadedComments/threadedComment${id.replace('rId', '')}.xml`\n }\n relations.add(commentsRelation)\n relationExists = true\n }\n\n const save = (): void => {\n if (!isDirty) return\n if (oldComments !== undefined) oldComments.save()\n if (drawings !== undefined) drawings.save()\n const text = serializeXml(xml)\n xlsx.file(commentsFileName, text)\n }\n\n return {\n add,\n changeComments,\n getComment,\n setDrawings,\n setOldComments,\n save\n }\n}\n","import type { Cell } from '../types/cells'\nimport type { ConditionalFormatting, ConditionalFormattings } from '../types/conditional-formatting'\nimport { isInRange, parseCellRange, toCellRange } from './excel-helpers'\n\nexport const getConditionalFormatting = (xml: Document): ConditionalFormattings => {\n const conditionalFormattingXml = xml.querySelectorAll('conditionalFormatting')\n const conditionalFormattings: Map<string, ConditionalFormatting> = new Map()\n\n let index = -1\n for (const formatting of conditionalFormattingXml) {\n const sqref = formatting.getAttribute('sqref')\n const formula = formatting.querySelector('formula')?.textContent\n if (sqref === null) continue\n index++\n const range = parseCellRange(sqref)\n const extension = {\n rows: 0,\n cols: 0\n }\n\n let columnExtension = 0\n let rowExtension = 0\n let currentRow = 0\n const extend = (cell: Cell): void => {\n if (Array.isArray(cell.newValue)) {\n if (cell.row !== currentRow) {\n currentRow = cell.row\n columnExtension = 0\n rowExtension = 0\n }\n const length = cell.newValue.length - 1\n if ('$isTable' in cell.newValue) {\n rowExtension = Math.max(length, rowExtension) - Math.min(length, rowExtension)\n extension.rows = extension.rows + rowExtension\n } else {\n columnExtension = columnExtension + length\n extension.cols = Math.max(columnExtension, extension.cols)\n }\n }\n }\n\n const currentFormatting = {\n sqref,\n range,\n extension,\n extend,\n ...(formula === undefined ? {} : { formula }),\n xml: formatting\n }\n conditionalFormattings.set(String(index), currentFormatting)\n }\n\n const save = (): void => {\n for (const formatting of conditionalFormattings.values()) {\n formatting.range.columnEnd = formatting.range.columnEnd + formatting.extension.cols\n formatting.range.rowEnd = formatting.range.rowEnd + formatting.extension.rows\n const ref = toCellRange(formatting.range)\n formatting.xml.setAttribute('sqref', ref)\n }\n }\n\n const get = (ref: string): ConditionalFormatting | undefined => {\n return conditionalFormattings.get(ref)\n }\n\n const findByCell = (cell: Cell): string | null => {\n for (const [name, value] of conditionalFormattings) {\n if (isInRange(cell, value.range)) return name\n }\n return null\n }\n\n return {\n get,\n save,\n findByCell\n }\n}\n","import type JSZip from 'jszip'\nimport type { Cell } from '../types/cells'\nimport type { Table, Tables } from '../types/tables'\nimport type { Relations } from '../types/relations'\nimport { isInRange, parseCellRange, toCellRange } from './excel-helpers'\nimport { generateUUID, parser } from './global-helpers'\nimport { NS } from './constants'\n\nconst serializer = new XMLSerializer()\n\nexport const getTables = async ({\n xlsx,\n relations\n}: {\n xlsx: JSZip\n relations: Relations\n}): Promise<Tables> => {\n const tablesProps = relations.getElements('table')\n const tableFiles = tablesProps.map(el => el.target)\n const tables = new Map<string, Table>()\n\n for (let file of tableFiles) {\n file = file.replace(/^\\.\\./, 'xl')\n const xmlText = await xlsx.file(file)?.async('string')\n if (xmlText === undefined) { continue }\n const xml = parser.parseFromString(xmlText, 'application/xml')\n const table = xml.querySelector('table')\n if (table === null) continue\n const ref = table.getAttribute('ref')\n if (ref === null) continue\n const range = parseCellRange(ref)\n const headers = Array.from(xml.querySelectorAll('tableColumn'))\n .map(el => el.getAttribute('name'))\n .filter(el => el !== null)\n const initialHeadersLength = headers.length\n const extension = {\n rows: 0,\n cols: 0\n }\n const existingHeaders: Set<string> = new Set(headers)\n\n const addHeader = (name: string, index: number): string => {\n let newName = name\n let j = 0\n while (existingHeaders.has(newName)) {\n j++\n newName = name + String(j)\n }\n existingHeaders.add(newName)\n headers.splice(index, 0, newName)\n return newName\n }\n\n const createHeaders = (names: string[]): Element[] => {\n return names.map((name, i) => {\n const h = xml.createElementNS(NS, 'tableColumn')\n h.setAttribute('id', String(i + 1))\n h.setAttribute('name', name)\n h.setAttribute('xr3:uid', `{${generateUUID().toUpperCase()}}`)\n return h\n })\n }\n\n let columnExtension = 0\n let rowExtension = 0\n let currentRow = 0\n const extend = (cell: Cell): Cell | undefined => {\n const t = tables.get(file)\n // Extend headers row\n if (t === undefined) return\n if (Array.isArray(cell.newValue)) {\n const isHeader = cell.row === range.rowStart\n if (isHeader) {\n const index = cell.column - range.columnStart\n const removed = headers.splice(index, 1)\n existingHeaders.delete(removed[0])\n cell.newValue = cell.newValue.map((header: string, i: number) => {\n return addHeader(header, i + index)\n })\n }\n }\n\n // Set in advance extensions for the table\n if (Array.isArray(cell.newValue)) {\n if (cell.row !== currentRow) {\n currentRow = cell.row\n columnExtension = 0\n rowExtension = 0\n }\n const length = cell.newValue.length - 1\n if ('$isTable' in cell.newValue) {\n rowExtension = Math.max(length, rowExtension) - Math.min(length, rowExtension)\n t.extension.rows = t.extension.rows + rowExtension\n } else {\n columnExtension = columnExtension + length\n t.extension.cols = Math.max(columnExtension, t.extension.cols)\n }\n }\n t.isDirty = true\n }\n\n const finalize = (): void => {\n const headersLength = range.columnEnd - range.columnStart + extension.cols + 1\n const headersDifference = headersLength - initialHeadersLength\n if (headersDifference !== 0) {\n for (let i = 0; i < headersDifference; i++) {\n addHeader('Column', range.columnEnd + i - 1)\n }\n if (tableInMap.lastHeaderCell !== undefined) {\n tableInMap.lastHeaderCell.newValue = headers.slice(initialHeadersLength - 1)\n }\n }\n const newHeaders = createHeaders(headers)\n xml.querySelector('tableColumns')?.replaceChildren(...newHeaders)\n range.columnEnd = range.columnEnd + extension.cols\n range.rowEnd = range.rowEnd + extension.rows\n const ref = toCellRange(range)\n table.setAttribute('ref', ref)\n const autofilter = table.querySelector('autoFilter')\n if (autofilter !== null) autofilter.setAttribute('ref', ref)\n }\n\n const save = (): void => {\n const newData = serializer.serializeToString(xml)\n xlsx.file(file, newData)\n }\n\n const tableInMap: Table = {\n xml,\n ref,\n range,\n extend,\n extension,\n finalize,\n save,\n isDirty: false\n }\n\n tables.set(file, tableInMap)\n }\n\n const get = (tableName: string): Table | undefined => {\n return tables.get(tableName)\n }\n\n const save = (): void => {\n for (const value of tables.values()) {\n if (value.isDirty) value.save()\n }\n }\n\n const findByCell = (cell: Cell): string | null => {\n for (const [name, table] of tables) {\n // Set the last header row to extend the table columns\n if (cell.column === table.range.columnEnd && cell.row === table.range.rowStart) {\n table.lastHeaderCell = cell\n }\n if (isInRange(cell, table.range)) return name\n }\n return null\n }\n\n return {\n get,\n save,\n findByCell\n }\n}\n","import type JSZip from 'jszip'\nimport type { Relations } from '../types/relations'\nimport { parser } from './global-helpers'\nimport type { Drawings } from '../types/drawings'\n\nconst serializeXml = (content: string): string => (`\n<xml xmlns:v=\"urn:schemas-microsoft-com:vml\"\n xmlns:o=\"urn:schemas-microsoft-com:office:office\"\n xmlns:x=\"urn:schemas-microsoft-com:office:excel\">\n\n <o:shapelayout v:ext=\"edit\">\n <o:idmap v:ext=\"edit\" data=\"1\"/>\n </o:shapelayout>\n\n <v:shapetype id=\"_x0000_t202\" coordsize=\"21600,21600\" o:spt=\"202\" path=\"m,l,21600r21600,l21600,xe\">\n <v:stroke joinstyle=\"miter\"/>\n <v:path gradientshapeok=\"t\" o:connecttype=\"rect\"/>\n </v:shapetype>\n ${content}\n</xml>\n`)\n\nconst createShape = ({\n id,\n row,\n column\n}: {\n id: number\n row: number\n column: number\n}): string => {\n return `<v:shape id=\"_x0000_s${String(1025 + id)}\" type=\"#_x0000_t202\"\n style=\"position:absolute;width:10pt;height:10pt;visibility:hidden\"\n fillcolor=\"none\" strokecolor=\"none\">\n <v:fill color2=\"infoBackground [80]\"/>\n <v:shadow color=\"none [81]\" obscured=\"t\"/>\n <v:path o:connecttype=\"none\"/>\n <v:textbox style=\"mso-direction-alt:auto\">\n <div style=\"text-align:left\"/>\n </v:textbox>\n <x:ClientData ObjectType=\"Note\">\n <x:MoveWithCells/>\n <x:SizeWithCells/>\n <x:Anchor>${column},0,${row},0,${column + 1},0,${row + 2},0</x:Anchor>\n <x:AutoFill>False</x:AutoFill>\n <x:Row>${row}</x:Row>\n <x:Column>${column}</x:Column>\n </x:ClientData>\n </v:shape>`\n}\n\nexport const getDrawings = async ({\n id,\n relations,\n xlsx\n}: {\n id: string\n relations: Relations\n xlsx: JSZip\n}): Promise<Drawings> => {\n const drawingRelation = relations.getElements('vmlDrawing')\n const guessedFilename = `../drawings/vmlDrawing${id.replace('rId', '')}.vml`\n const noRelation = drawingRelation.length === 0\n const filename = (drawingRelation[0]?.target ?? guessedFilename).replace('..', 'xl')\n const unique = new Set<string>()\n let isDirty = false\n const drawings: Array<{ row: string, column: string }> = []\n const xmlText = await xlsx.file(filename)?.async('string')\n if (xmlText !== undefined) {\n const vmlDoc = parser.parseFromString(xmlText, 'application/xml')\n const shapes = vmlDoc.getElementsByTagName('v:shape')\n for (const shape of shapes) {\n const row = shape.getElementsByTagName('x:Row')[0]?.textContent\n const column = shape.getElementsByTagName('x:Column')[0]?.textContent\n if (row === undefined || column === undefined) continue\n const rowValue = String(parseInt(row) + 1)\n const columnValue = String(parseInt(column) + 1)\n drawings.push({ row: rowValue, column: columnValue })\n }\n }\n\n const add = ({ row, column }: { row: string, column: string }): void => {\n const ref = `${row}:${column}`\n if (unique.has(ref)) return\n drawings.push({ row, column })\n unique.add(ref)\n isDirty = true\n }\n\n const save = (): void => {\n if (!isDirty) return\n if (noRelation) {\n relations.add({\n target: filename.replace('xl', '..'),\n type: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing'\n })\n }\n const content = drawings.map((drawing, i) => {\n return createShape({\n id: i,\n row: parseInt(drawing.row) - 1,\n column: parseInt(drawing.column) - 1\n })\n }).join('')\n const data = serializeXml(content)\n xlsx.file(filename, data)\n }\n return {\n add,\n save\n }\n}\n","import type JSZip from 'jszip'\nimport type { Relations } from '../types/relations'\nimport { parser } from './global-helpers'\nimport { createXml, serializeXml } from './xml-helpers'\nimport { NS } from './constants'\nimport type { OldComment, OldComments } from '../types/old-comments'\n\nconst EXCEL_NOTIFICATION = `[Threaded comment]\n\nYour version of Excel allows you to read this threaded comment; however, any edits to it will get removed if the file is opened in a newer version of Excel. Learn more: https://go.microsoft.com/fwlink/?linkid=870924\n\nComment:\n `\n\nconst NS_MC = 'http://schemas.openxmlformats.org/markup-compatibility/2006'\nconst NS_XR = 'http://schemas.microsoft.com/office/spreadsheetml/2014/revision'\n\nconst createComment = (\n { xml, ref, id, text, author }: OldComment & { xml: Document, author: string }\n): Element => {\n const comment = xml.createElementNS(NS, 'comment')\n comment.setAttribute('ref', ref)\n comment.setAttribute('xr:uid', id)\n comment.setAttribute('authorId', author)\n comment.setAttribute('shapeId', '0')\n const textTag = xml.createElementNS(NS, 'text')\n const tTag = xml.createElementNS(NS, 't')\n tTag.textContent = text\n textTag.appendChild(tTag)\n comment.appendChild(textTag)\n return comment\n}\n\nconst createAuthor = ({ xml, id }: { xml: Document, id: string }): Element => {\n const author = xml.createElementNS(NS, 'author')\n author.textContent = `tc=${id}`\n return author\n}\n\nexport const getOldComments = async ({\n id,\n relations,\n xlsx\n}: {\n id: string\n relations: Relations\n xlsx: JSZip\n}): Promise<OldComments> => {\n const oldCommentsRelation = relations.getElements('comments')\n const guessedFilename = `../comments${id.replace('rId', '')}.xml`\n const noRelation = oldCommentsRelation.length === 0\n const filename = (oldCommentsRelation[0]?.target ?? guessedFilename).replace('..', 'xl')\n\n let isDirty = false\n const comments: OldComment[] = []\n\n const xmlText = await xlsx.file(filename)?.async('string')\n const xml = xmlText === undefined\n ? createXml({ specificSchema: NS, tagName: 'comments' })\n : parser.parseFromString(xmlText, 'application/xml')\n\n if (xmlText === undefined) {\n xml.querySelector('comments')?.setAttribute('xmlns:mc', NS_MC)\n xml.querySelector('comments')?.setAttribute('xmlns:xr', NS_XR)\n xml.querySelector('comments')?.setAttribute('mc:Ignorable', 'xr')\n xml.querySelector('comments')?.appendChild(xml.createElementNS(NS, 'authors'))\n xml.querySelector('comments')?.appendChild(xml.createElementNS(NS, 'commentList'))\n }\n const parent = xml.querySelector('comments')\n const authors = xml.querySelector('authors')\n const commentList = xml.querySelector('commentList')\n if (parent === null || authors === null || commentList === null) throw new Error('Comments are mailformed')\n\n const uniqueRefs = new Set<string>()\n\n if (xmlText !== undefined) {\n const currentComments = commentList.getElementsByTagName('comment')\n for (const comment of currentComments) {\n const ref = comment.getAttribute('ref')\n const id = comment.getAttribute('xr:uid')\n let text = comment.querySelector('t')?.textContent ?? ''\n text = text.replace(EXCEL_NOTIFICATION, '')\n if (ref === null || id === null) continue\n comments.push({ ref, id, text })\n }\n }\n\n const add = ({ ref, id, text }: OldComment): void => {\n if (uniqueRefs.has(ref)) return\n uniqueRefs.add(ref)\n comments.push({ ref, id, text })\n isDirty = true\n }\n\n const save = (): void => {\n if (!isDirty) return\n if (noRelation) {\n relations.add({\n target: filename.replace('xl', '..'),\n type: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments'\n })\n }\n const newComments: Element[] = []\n const newAuthors: Element[] = []\n let index = 0\n for (const comment of comments) {\n const newComment = createComment({ xml, author: String(index), ...comment })\n const author = createAuthor({ xml, id: comment.id })\n newComments.push(newComment)\n newAuthors.push(author)\n index++\n }\n authors.replaceChildren(...newAuthors)\n commentList?.replaceChildren(...newComments)\n const data = serializeXml(xml)\n xlsx.file(filename, data)\n }\n\n return {\n add,\n save\n }\n}\n","import type JSZip from 'jszip'\nimport type { Workbook } from '../types/workbook'\nimport { getCells } from './get-cells'\nimport { getMergedCells } from './get-merged-cells'\nimport { getHyperlinks } from './get-hyperlinks'\nimport { getComments } from './get-comments'\nimport { getConditionalFormatting } from './get-conditional-formatting'\nimport { getTables } from './get-tables'\nimport { serializeXml } from './xml-helpers'\nimport type { Relations } from '../types/relations'\nimport { getDrawings } from './get-drawings'\nimport { getOldComments } from './get-old-comments'\nimport { type Sheet } from '../types/sheets'\n\nexport const getSheet = async ({\n xlsx,\n xml,\n relations,\n workbook,\n target,\n id,\n name\n}: {\n xlsx: JSZip\n xml: Document\n relations: Relations\n workbook: Workbook\n target: string\n id: string\n name: string\n}): Promise<Sheet> => {\n const filename = `xl/${target}`\n const {\n pivotTables,\n dataValidations,\n extensionLists\n } = workbook\n const initialCells = getCells(xml)\n const mergedCells = getMergedCells(xml)\n const hyperlinks = getHyperlinks({ xml, relations })\n const comments = await getComments({ xlsx, workbook, relations, id })\n const conditionalFormattings = getConditionalFormatting(xml)\n const tables = await getTables({ xlsx, relations })\n const drawings = await getDrawings({ xlsx, id, relations })\n const oldComments = await getOldComments({ xlsx, id, relations })\n comments.setDrawings(drawings)\n comments.setOldComments(oldComments)\n\n // TO DO\n // print areas\n // named ranges\n // drawings\n // charts\n // sparklines\n\n const cells = initialCells.map(cell => {\n const comment = comments.getComment(cell.ref)\n if (comment !== undefined) cell.hasComment = comment\n const table = tables.findByCell(cell)\n if (table !== null) cell.inTable = table\n const mergeCell = mergedCells.findByCell(cell)\n if (mergeCell !== null) cell.inMergedCell = mergeCell\n const pivotTable = pivotTables.findByCell(name, cell)\n if (pivotTable !== null) cell.inPivotTableSource = pivotTable\n const dataValidation = dataValidations.findByCell(name, cell)\n if (dataValidation !== null) cell.inDataValidation = dataValidation\n const dataValidationList = dataValidations.findListByCell(name, cell)\n if (dataValidationList !== null) cell.inDataValidationList = dataValidationList\n const conditionalFormatting = conditionalFormattings.findByCell(cell)\n if (conditionalFormatting !== null) cell.inConditionalFormatting = conditionalFormatting\n const extension = conditionalFormattings.findByCell(cell)\n if (extension !== null) cell.inExtensionList = extension\n const extensionListSource = extensionLists.findListByCell(name, cell)\n if (extensionListSource !== null) cell.inExtensionListSource = extensionListSource\n return cell\n })\n\n const replaceCells = (element: Element): void => {\n xml.querySelector('sheetData')?.replaceWith(element)\n }\n\n const cleanUp = (): void => {\n const hyperlinks = xml.querySelector('hyperlinks')\n if (hyperlinks?.childNodes.length === 0) hyperlinks.remove()\n const mergeCells = xml.querySelector('mergeCells')\n if (mergeCells?.childNodes.length === 0) mergeCells.remove()\n }\n\n const save = (): void => {\n cleanUp()\n const newData = serializeXml(xml)\n relations.save()\n xlsx.file(filename, newData)\n }\n\n return {\n xml,\n sheetId: id,\n relations,\n target,\n id,\n name,\n cells,\n mergedCells,\n hyperlinks,\n comments,\n dataValidations,\n extensionLists,\n conditionalFormattings,\n drawings,\n oldComments,\n tables,\n replaceCells,\n save\n }\n}\n","import type JSZip from 'jszip'\nimport { createXml, serializeXml } from './xml-helpers'\nimport { parser } from './global-helpers'\nimport { NS_REL } from './constants'\nimport type { Relation, Relations } from '../types/relations'\n\nexport const getRelations = async ({ xlsx, filename }: {\n xlsx: JSZip\n filename: string\n}): Promise<Relations> => {\n let isDirty = false\n const relFilename = `xl/${filename}`\n const xmlText = await xlsx.file(relFilename)?.async('string')\n const xml = xmlText === undefined\n ? createXml({ specificSchema: NS_REL, tagName: 'Relationships' })\n : parser.parseFromString(xmlText, 'application/xml')\n\n if (xmlText === undefined) isDirty = true\n if (xml.getElementsByTagName('parsererror').length > 0) {\n throw new Error(`Invalid relations file for ${filename}`)\n }\n const realationsXml = Array.from(xml.querySelectorAll('Relationship'))\n let relations: Relation[] = []\n\n for (const el of realationsXml) {\n const id = el.getAttribute('Id')\n const target = el.getAttribute('Target')\n const elementType = el.getAttribute('Type')\n const targetMode = el.getAttribute('TargetMode')\n if (id === null || target === null || elementType === null) continue\n const realType = elementType.slice(elementType.lastIndexOf('/') + 1)\n relations.push({\n id,\n target,\n type: elementType,\n realType,\n ...(targetMode === null ? {} : { targetMode })\n })\n }\n\n const getNextId = (): string => {\n let max = 0\n xml.querySelectorAll('Relationship[Id^=\\'rId\\']').forEach(el => {\n const n = Number((el.getAttribute('Id') ?? 'Id1').slice(3))\n if (!Number.isNaN(n)) max = Math.max(max, n)\n })\n return `rId${max + 1}`\n }\n\n const add = (rel: Relation): string => {\n const id = getNextId()\n const root = xml.querySelector('Relationships')\n if (root === null) return 'NA'\n const el = xml.createElementNS(NS_REL, 'Relationship')\n el.setAttribute('Id', id)\n el.setAttribute('Type', rel.type)\n el.setAttribute('Target', rel.target)\n if (rel.targetMode !== undefined) el.setAttribute('TargetMode', rel.targetMode)\n root.appendChild(el)\n relations.push({ id, type: rel.type, target: rel.target })\n isDirty = true\n return id\n }\n\n const get = ({ by, value }: { by: keyof Relation, value: string }): Relation[] => {\n return relations.filter(relation => relation[by] === value)\n }\n\n const remove = ({ by, value }: { by: keyof Relation, value: string }): void => {\n const valuesToRemove = relations.filter(relation => relation[by] === value)\n for (const value of valuesToRemove) {\n xml.querySelector(`Relationship[id=\"${String(value)}\"]`)?.remove()\n }\n relations = relations.filter(relation => relation[by] !== value)\n }\n\n const save = (): void => {\n if (!isDirty) return\n const newData = serializeXml(xml)\n xlsx.file(relFilename, newData)\n }\n\n const getElements = (element: string): Relation[] => {\n return relations.filter(el => el.realType === element)\n }\n\n return {\n add,\n remove,\n get,\n save,\n getElements\n }\n}\n","import JSZip from 'jszip'\nimport type { Cell } from '../types/cells'\nimport { parser } from './global-helpers'\nimport { NS_PREFIX } from './constants'\nimport { isInRange, parseCellRange, toCellRange } from './excel-helpers'\nimport type { PivotTable, PivotTables } from '../types/pivot-tables'\n\nconst serializer = new XMLSerializer()\n\nexport const getPivotTables = async (xlsx: JSZip): Promise<PivotTables> => {\n const pivotTables = new Map<string, PivotTable>()\n\n const pivotFiles = Object.keys(xlsx.files)\n .filter(f => f.startsWith('xl/pivotTables/') && f.endsWith('.xml'))\n .map(f => ({\n definitionFilename: f,\n relsFilename: f.replace('/pivotTables', '/pivotTables/_rels') + '.rels'\n }))\n\n for (const { definitionFilename, relsFilename } of pivotFiles) {\n // Get table\n const tableDefinitionText = await xlsx.file(definitionFilename)?.async('string')\n if (tableDefinitionText === undefined) continue\n\n const tableDefinitionXml = parser.parseFromString(tableDefinitionText, 'application/xml')\n const tableDefinition = tableDefinitionXml.querySelector('pivotTableDefinition')\n if (tableDefinition === null) continue\n\n // Get cache\n const xmlRelsText = await xlsx.file(relsFilename)?.async('string')\n if (xmlRelsText === undefined) continue\n const rels = parser.parseFromString(xmlRelsText, 'application/xml')\n const cacheTarget = rels\n .querySelector(`Relationship[Type=\"${NS_PREFIX}/relationships/pivotCacheDefinition\"]`)\n ?.getAttribute('Target')\n if (cacheTarget === undefined || cacheTarget === null) continue\n const cacheFile = cacheTarget.replace('../', 'xl/')\n const cacheText = await xlsx.file(cacheFile)?.async('string')\n if (cacheText === undefined) continue\n const cache = parser.parseFromString(cacheText, 'application/xml')\n const workSheetSource = cache.querySelector('worksheetSource')\n if (workSheetSource === null) continue\n\n const ref = workSheetSource.getAttribute('ref')\n const sheet = workSheetSource.getAttribute('sheet')\n if (ref === null || sheet === null) continue\n const range = parseCellRange(ref)\n\n const extension = {\n rows: 0,\n cols: 0\n }\n\n let columnExtension = 0\n let rowExtension = 0\n let currentRow = 0\n const extend = (cell: Cell): void => {\n if (Array.isArray(cell.newValue)) {\n if (cell.row !== currentRow) {\n currentRow = cell.row\n columnExtension = 0\n rowExtension = 0\n }\n const length = cell.newValue.length - 1\n if ('$isTable' in cell.newValue) {\n rowExtension = Math.max(length, rowExtension) - Math.min(length, rowExtension)\n extension.rows = extension.rows + rowExtension\n } else {\n columnExtension = columnExtension + length\n extension.cols = Math.max(columnExtension, extension.cols)\n }\n }\n }\n\n const save = (): void => {\n tableDefinition.setAttribute('refreshOnLoad', '1')\n tableDefinition.setAttribute('saveData', '0')\n const cacheDefinition = cache.querySelector('pivotCacheDefinition')\n if (cacheDefinition !== null) {\n cacheDefinition.setAttribute('refreshOnLoad', '1')\n cacheDefinition.setAttribute('saveData', '0')\n cacheDefinition.setAttribute('invalid', '1')\n cacheDefinition.setAttribute('recordCount', '1')\n }\n const newDefinition = serializer.serializeToString(tableDefinition)\n xlsx.file(definitionFilename, newDefinition)\n range.columnEnd = range.columnEnd + extension.cols\n range.rowEnd = range.rowEnd + extension.rows\n const ref = toCellRange(range)\n workSheetSource.setAttribute('ref', ref)\n const newCache = serializer.serializeToString(cache)\n xlsx.file(cacheFile, newCache)\n }\n\n const pivotTable: PivotTable = {\n ref,\n sheet,\n range,\n definitionXml: tableDefinitionXml,\n cacheXml: cache,\n extension,\n extend,\n save\n }\n pivotTables.set(definitionFilename, pivotTable)\n }\n\n const get = (tableName: string): PivotTable | undefined => {\n return pivotTables.get(tableName)\n }\n\n const save = (): void => {\n for (const table of pivotTables.values()) {\n table.save()\n }\n }\n\n const findByCell = (sheet: string, cell: Cell): string | null => {\n for (const [name, value] of pivotTables) {\n if (value.sheet !== sheet) continue\n if (isInRange(cell, value.range)) return name\n }\n return null\n }\n\n return {\n get,\n save,\n findByCell\n }\n}\n","const sheetRegex = '(?:(?<sheet>(?:\\'(?:[^\\'!]|\\'\\')+\\'|[^\\'!()+/*-]+))!)'\r\nconst completeRefRegex = '\\\\$?[A-Z]+\\\\$?[0-9]+(?::\\\\$?[A-Z]+\\\\$?[0-9]+)?'\r\nconst partialRefRegex = '\\\\$?[A-Z]+(?::\\\\$?[A-Z]+)|\\\\$?[0-9]+(?::\\\\$?[0-9]+)'\r\nconst re = new RegExp(`(?<![A-Z0-9])(?:${sheetRegex})?(?<ref>${completeRefRegex}|${partialRefRegex})(?![A-Z0-9])`, 'g')\r\n\r\nexport const getFormulasFromReferences = (s: string): Array<{ sheet?: string, ref?: string }> =>\r\n [...s.matchAll(re)].map(m => ({\r\n sheet: m.groups?.sheet\r\n ?.replace(/^'|'$/g, '')\r\n .replace(/''/g, \"'\"),\r\n ref: m.groups?.ref\r\n }))\r\n","import type { Cell } from '../types/cells'\nimport type { CreateDataValidation, DataValidation, DataValidations } from '../types/data-validation'\nimport { NS, TAGS_ORDER } from './constants'\nimport { isInRange, parseCellRange, toCellRange } from './excel-helpers'\nimport { getFormulasFromReferences } from './get-formulas'\n\nconst createDataValidation = (doc: Document, dataValidation: CreateDataValidation): Element => {\n if (dataValidation.sqref === undefined) throw new Error('The validation area is not defined')\n if (dataValidation.formula === undefined) throw new Error('The data validation formula is not defined')\n const dataValidationTag = doc.createElementNS(NS, 'dataValidation')\n const formulaTag = doc.createElementNS(NS, 'formula1')\n dataValidationTag.setAttribute('allowBlank', '1')\n dataValidationTag.setAttribute('showInputMessage', '1')\n dataValidationTag.setAttribute('showErrorMessage', '1')\n dataValidationTag.setAttribute('sqref', dataValidation.sqref)\n dataValidationTag.setAttribute('type', dataValidation.type)\n formulaTag.textContent = dataValidation.formula\n dataValidationTag.appendChild(formulaTag)\n return dataValidationTag\n}\n\nexport const getDataValidations = (sheets: Array<{\n xml: Document\n name: string\n}>): DataValidations => {\n const dataValidations = new Map<string, DataValidation>()\n\n let index = -1\n for (const sheet of sheets) {\n const dataValidationsParent = sheet.xml.querySelector('dataValidations')\n if (dataValidationsParent === null) continue\n\n const dataValidationsXml = dataValidationsParent.querySelectorAll('dataValidation')\n for (const dataValidation of dataValidationsXml) {\n const sheetName = sheet.name\n const extension = { rows: 0, cols: 0 }\n const formulaExtension = { rows: 0, cols: 0 }\n const sqref = dataValidation.getAttribute('sqref')\n const formula = dataValidation.querySelector('formula1')?.textContent\n if (sqref === null) continue\n index++\n const range = parseCellRange(sqref)\n const validation: Partial<DataValidation> = {\n sheet: sheetName,\n sqref,\n range,\n xml: dataValidation\n }\n if (formula !== undefined) {\n validation.formula = formula\n const references = getFormulasFromReferences(formula)\n if (references.length !== 1) continue\n const reference = references[0]\n if (reference.ref === undefined) continue\n validation.listRange = {\n ref: reference.ref,\n sheet: reference.sheet ?? sheetName\n }\n if (reference.ref === formula) {\n validation.listRange.range = parseCellRange(reference.ref)\n }\n }\n\n let columnExtension = 0\n let rowExtension = 0\n let currentRow = 0\n const extend = (cell: Cell): void => {\n if (Array.isArray(cell.newValue)) {\n if (cell.row !== currentRow) {\n currentRow = cell.row\n columnExtension = 0\n rowExtension = 0\n }\n const length = cell.newValue.length - 1\n if ('$isTable' in cell.newValue) {\n rowExtension = Math.max(length, rowExtension) - Math.min(length, rowExtension)\n extension.rows = extension.rows + rowExtension\n } else {\n columnExtension = columnExtension + length\n extension.cols = Math.max(columnExtension, extension.cols)\n }\n }\n }\n\n const extendFormula = (cell: Cell): void => {\n if (Array.isArray(cell.newValue)) {\n const length = cell.newValue.length - 1\n if ('$isTable' in cell.newValue) {\n formulaExtension.rows = Math.max(length, formulaExtension.rows)\n } else {\n formulaExtension.cols = Math.max(length, formulaExtension.cols)\n }\n }\n }\n validation.extension = extension\n validation.formulaExtension = formulaExtension\n validation.extend = extend\n validation.extendFormula = extendFormula\n dataValidations.set(String(index), validation as DataValidation)\n }\n }\n\n const save = (): void => {\n for (const dataValidation of dataValidations.values()) {\n dataValidation.range.columnEnd = dataValidation.range.columnEnd + dataValidation.extension.cols\n dataValidation.range.rowEnd = dataValidation.range.rowEnd + dataValidation.extension.rows\n const ref = toCellRange(dataValidation.range)\n dataValidation.xml.setAttribute('sqref', ref)\n if (dataValidation.listRange?.range !== undefined) {\n dataValidation.listRange.range.columnEnd = dataValidation.listRange.range.columnEnd +\n dataValidation.formulaExtension.cols\n dataValidation.listRange.range.rowEnd = dataValidation.listRange.range.rowEnd +\n dataValidation.formulaExtension.rows\n const listRef = toCellRange(dataValidation.listRange.range)\n const formula = dataValidation.xml.querySelector('formula1')\n if (formula !== null) {\n formula.textContent = listRef\n }\n }\n }\n }\n\n const add = (xml: Document, dataValidation: CreateDataValidation): void => {\n if (dataValidation.sqref === undefined && dataValidation.range === undefined) {\n throw new Error('The validation area is not defined')\n }\n if (dataValidation.type === 'formula' && dataValidation.formula === undefined) {\n throw new Error('Data validation formula is not defined')\n }\n if (dataValidation.type === 'list' &&\n dataValidation.formula === undefined &&\n dataValidation.range === undefined\n ) {\n throw new Error('Data validation list is not defined')\n }\n if (dataValidation.range !== undefined) {\n dataValidation.sqref = toCellRange(dataValidation.range)\n }\n if (dataValidation.formula === undefined) {\n if (dataValidation.listRange?.range === undefined) {\n throw new Error('The data validation list is not defined')\n }\n dataValidation.formula = toCellRange(dataValidation.listRange.range)\n }\n const dataValidationXml = createDataValidation(sheets[0].xml, dataValidation)\n const dataValidationsTag = xml.querySelector('dataValidations')\n if (dataValidationsTag === null) {\n const elements = TAGS_ORDER.slice(TAGS_ORDER.indexOf('dataValidations') + 1)\n let element: Element | null = null\n for (const elName of elements) {\n const foundElement = xml.querySelector(elName)\n if (foundElement !== null) {\n element = foundElement\n break\n }\n }\n xml.querySelector('worksheet')?.insertBefore(xml.createElementNS(NS, 'dataValidations'), element)\n }\n xml.querySelector('dataValidations')?.appendChild(dataValidationXml)\n }\n\n const get = (ref: string): DataValidation | undefined => {\n return dataValidations.get(ref)\n }\n\n const findByCell = (sheetName: string, cell: Cell): string | null => {\n for (const [name, value] of dataValidations) {\n if (sheetName !== value.sheet) continue\n if (isInRange(cell, value.range)) return name\n }\n return null\n }\n\n const findListByCell = (sheetName: string, cell: Cell): string | null => {\n for (const [name, value] of dataValidations) {\n if (value.listRange?.range === undefined) continue\n if (value.listRange.sheet !== sheetName) continue\n if (isInRange(cell, value.listRange.range)) return name\n }\n return null\n }\n\n return {\n add,\n save,\n get,\n findByCell,\n findListByCell\n }\n}\n","import type { Cell } from '../types/cells'\r\nimport type { ExtenstionList, ExtenstionLists } from '../types/extension-lists'\r\nimport { NS } from './constants'\r\nimport { isInRange, parseCellRange, toCellRange } from './excel-helpers'\r\nimport { getFormulasFromReferences } from './get-formulas'\r\n\r\nexport const getExtensionLists = (sheets: Array<{\r\n xml: Document\r\n name: string\r\n}>): ExtenstionLists => {\r\n const extensions = new Map<string, ExtenstionList>()\r\n\r\n let index = -1\r\n for (const sheet of sheets) {\r\n const extenstionListsParent = sheet.xml.querySelector('extLst dataValidations') ??\r\n sheet.xml.createElementNS(NS, 'dataValidations')\r\n\r\n const extenstionListsXml = extenstionListsParent.querySelectorAll('dataValidation')\r\n\r\n for (const extensionList of extenstionListsXml) {\r\n const sheetName = sheet.name\r\n const extension = {\r\n rows: 0,\r\n cols: 0\r\n }\r\n const formulaExtension = {\r\n rows: 0,\r\n cols: 0\r\n }\r\n\r\n const sqref = extensionList.querySelector('sqref')?.textContent\r\n const formula = extensionList.querySelector('formula1 f')?.textContent\r\n if (sqref === undefined || formula === undefined) continue\r\n index++\r\n\r\n const range = parseCellRange(sqref)\r\n\r\n const currentExtension: Partial<ExtenstionList> = {\r\n xml: extensionList,\r\n sheet: sheetName,\r\n sqref,\r\n range\r\n }\r\n\r\n if (formula !== undefined) {\r\n currentExtension.formula = formula\r\n const references = getFormulasFromReferences(formula)\r\n if (references.length !== 1) continue\r\n const reference = references[0]\r\n if (reference.ref === undefined) continue\r\n currentExtension.listRange = {\r\n ref: reference.ref,\r\n sheet: reference.sheet ?? sheetName\r\n }\r\n if (`${String(reference.sheet)}!${String(reference.ref)}` === formula) {\r\n currentExtension.listRange.range = parseCellRange(reference.ref)\r\n }\r\n }\r\n\r\n const extend = (cell: Cell): void => {\r\n if (Array.isArray(cell.newValue)) {\r\n const length = cell.newValue.length - 1\r\n if ('$isTable' in cell.newValue) {\r\n extension.rows = Math.max(length, extension.rows)\r\n } else {\r\n extension.cols = Math.max(length, extension.cols)\r\n }\r\n }\r\n }\r\n\r\n const extendFormula = (cell: Cell): void => {\r\n if (Array.isArray(cell.newValue)) {\r\n const length = cell.newValue.length - 1\r\n if ('$isTable' in cell.newValue) {\r\n formulaExtension.rows = Math.max(length, formulaExtension.rows)\r\n } else {\r\n formulaExtension.cols = Math.max(length, formulaExtension.cols)\r\n }\r\n }\r\n }\r\n\r\n currentExtension.extension = extension\r\n currentExtension.formulaExtension = formulaExtension\r\n currentExtension.extend = extend\r\n currentExtension.extendFormula = extendFormula\r\n\r\n extensions.set(String(index), currentExtension as ExtenstionList)\r\n }\r\n }\r\n\r\n const save = (): void => {\r\n for (const extension of extensions.values()) {\r\n extension.range.columnEnd = extension.range.columnEnd + extension.extension.cols\r\n extension.range.rowEnd = extension.range.rowEnd + extension.extension.rows\r\n const ref = toCellRange(extension.range)\r\n const sqref = extension.xml.querySelector('sqref')\r\n if (sqref !== null) sqref.textContent = ref\r\n extension.xml.setAttribute('sqref', ref)\r\n if (extension.listRange?.range !== undefined) {\r\n extension.listRange.range.columnEnd = extension.listRange.range.columnEnd +\r\n extension.formulaExtension.cols\r\n extension.listRange.range.rowEnd = extension.listRange.range.rowEnd +\r\n extension.formulaExtension.rows\r\n const listRef = toCellRange(extension.listRange.range)\r\n const formula = extension.xml.querySelector('formula1 f')\r\n if (formula !== null) {\r\n formula.textContent = String(extension.listRange.sheet) + '!' + listRef\r\n }\r\n }\r\n }\r\n }\r\n\r\n const get = (ref: string): ExtenstionList | undefined => {\r\n return extensions.get(ref)\r\n }\r\n\r\n const findByCell = (cell: Cell): string | null => {\r\n for (const [name, value] of extensions) {\r\n if (isInRange(cell, value.range)) return name\r\n }\r\n return null\r\n }\r\n\r\n const findListByCell = (sheetName: string, cell: Cell): string | null => {\r\n for (const [name, value] of extensions) {\r\n if (value.listRange?.range === undefined) continue\r\n if (value.listRange.sheet !== sheetName) continue\r\n if (isInRange(cell, value.listRange.range)) return name\r\n }\r\n return null\r\n }\r\n\r\n return {\r\n save,\r\n get,\r\n findByCell,\r\n findListByCell\r\n }\r\n}\r\n","import type JSZip from 'jszip'\nimport { generateUUID, parser } from './global-helpers'\nimport { type Person, type Persons } from '../types/people'\nimport { createXml, serializeXml } from './xml-helpers'\nimport { NS, NS_TC } from './constants'\n\nconst addPerson = (doc: Document, person: Person): void => {\n const el = doc.createElementNS(NS_TC, 'person')\n el.setAttribute('displayName', person.displayName)\n el.setAttribute('id', person.id)\n el.setAttribute('userId', person.userId)\n el.setAttribute('providerId', person.providerId)\n doc.documentElement.appendChild(el)\n}\n\nexport const getPersons = async (xlsx: JSZip, target: string): Promise<Persons> => {\n let isDirty = false\n const xmlText = await xlsx.file(`xl/${target}`)?.async('string')\n if (xmlText === undefined) isDirty = true\n const xml = xmlText === undefined\n ? createXml({ coreSchema: NS, specificSchema: NS_TC, tagName: 'personList' })\n : parser.parseFromString(xmlText, 'application/xml')\n\n if (xml.getElementsByTagName('parsererror').length > 0) {\n throw new Error('Invalid person.xml')\n }\n\n const getSystemUserId = (): string => {\n const existing = Array.from(xml.getElementsByTagNameNS(NS_TC, 'person'))\n .find(p => p.getAttribute('displayName') === 'System')?.getAttribute('id')\n if (existing !== null && existing !== undefined) return existing\n const systemPerson = {\n id: `{${generateUUID().toUpperCase()}}`,\n displayName: 'System',\n userId: 'S::system@local::00000000-0000-0000-0000-000000000000',\n providerId: 'AD'\n }\n addPerson(xml, systemPerson)\n isDirty = true\n return systemPerson.id\n }\n\n const save = (): void => {\n if (!isDirty) return\n const newData = serializeXml(xml)\n xlsx.file(`xl/${target}`, newData)\n }\n\n return {\n getSystemUserId,\n save\n }\n}\n","import type JSZip from 'jszip'\r\nimport { parser } from './global-helpers'\r\nimport { GLOBAL_RELS, OFFICE_DOCUMENT_TYPE } from './constants'\r\nimport { getRelationsPath } from './excel-helpers'\r\nimport type { Sheet } from '../types/sheets'\r\nimport type { Workbook } from '../types/workbook'\r\nimport { createStyles } from './get-styles'\r\nimport { getSharedStrings } from './get-shared-strings'\r\nimport { getSheet } from './get-sheets'\r\nimport { getRelations } from './get-relations'\r\nimport { getPivotTables } from './get-pivot-tables'\r\nimport type { Relations } from '../types/relations'\r\nimport { getDataValidations } from './get-data-validations'\r\nimport { getExtensionLists } from './get-extension-lists'\r\nimport { getPersons } from './get-persons'\r\n\r\nexport const getWorkbook = async (xlsx: JSZip): Promise<Workbook> => {\r\n // Get global path for the workbook\r\n const relsXmlText = await xlsx.file(GLOBAL_RELS)?.async('string')\r\n if (relsXmlText === undefined) throw new Error('This Excel file has no relations')\r\n const relsXml = parser.parseFromString(relsXmlText, 'application/xml')\r\n const workBookElement = relsXml.querySelector(`Relationship[Type=\"${OFFICE_DOCUMENT_TYPE}/officeDocument\"]`)\r\n if (workBookElement === null) throw new Error('This Excel file has no workbook')\r\n\r\n const workbookPath = workBookElement.getAttribute('Target')\r\n if (workbookPath === null) throw new Error('This Excel file has no workbook')\r\n\r\n // Process the workbook\r\n const workbookXmlText = await xlsx.file(workbookPath)?.async('string')\r\n if (workbookXmlText === undefined) throw new Error('This Excel file has no workbook')\r\n\r\n const workbookXml = parser.parseFromString(workbookXmlText, 'application/xml')\r\n const sheetsParent = workbookXml.querySelector('sheets')\r\n if (sheetsParent === null) throw new Error('This Excel file has no sheets')\r\n const sheetsXml = Array.from(sheetsParent.children)\r\n\r\n const sheets: Array<Partial<Sheet>> = sheetsXml.map(el => ({\r\n id: el.getAttribute('r:id') ?? undefined,\r\n name: el.getAttribute('name') ?? undefined,\r\n sheetId: el.getAttribute('sheetId') ?? undefined\r\n }))\r\n\r\n // Process relations\r\n const relationsPath = getRelationsPath(workbookPath)\r\n const relations = await getRelations({ xlsx, filename: relationsPath })\r\n\r\n const workbook: Partial<Workbook> = {}\r\n workbook.relations = relations\r\n\r\n // Get styles\r\n const styleProps = relations.getElements('styles')[0]\r\n if (styleProps === undefined) throw new Error('Styles are mailformed')\r\n const styles = await createStyles(xlsx, styleProps.target)\r\n workbook.styles = styles\r\n\r\n // Shared strings\r\n const sharedStringsProps = relations.getElements('sharedStrings')[0]\r\n if (sharedStringsProps === undefined) throw new Error('This file does not contain strings')\r\n const sharedStrings = await getSharedStrings(xlsx, sharedStringsProps.target)\r\n workbook.sharedStrings = sharedStrings\r\n\r\n // Get system user\r\n const persons = await getPersons(xlsx, 'persons/person.xml')\r\n workbook.persons = persons\r\n\r\n const pivotTables = await getPivotTables(xlsx)\r\n workbook.pivotTables = pivotTables\r\n\r\n const sheetsRels = relations.getElements('worksheet')\r\n\r\n const sheetsData = await Promise.all(sheetsRels.map(async (s): Promise<{\r\n xml: Document\r\n relations: Relations\r\n target: string\r\n id: string\r\n name: string\r\n }> => {\r\n if (s?.target === undefined || s?.id === undefined) throw new Error('Excel file is mailformed')\r\n const currentSheet = sheets.find(sheet => sheet.id === s.id)\r\n if (currentSheet === undefined || currentSheet.name === undefined) throw new Error('Excel file is mailformed')\r\n const relsTarget = s.target.replace(/worksheets\\//, 'worksheets/_rels/') + '.rels'\r\n const relations = await getRelations({ xlsx, filename: relsTarget })\r\n const sheetXmlText = await xlsx.file(`xl/${s.target}`)?.async('string')\r\n if (sheetXmlText === undefined) throw new Error(`${s.target} sheet is mailformed`)\r\n const xml = parser.parseFromString(sheetXmlText, 'application/xml')\r\n const sheet = {\r\n xml,\r\n relations,\r\n target: s.target,\r\n id: s.id,\r\n name: currentSheet.name\r\n }\r\n Object.assign(currentSheet, sheet)\r\n return sheet\r\n }))\r\n\r\n const dataValidations = getDataValidations(sheetsData)\r\n workbook.dataValidations = dataValidations\r\n\r\n const extensionLists = getExtensionLists(sheetsData)\r\n workbook.extensionLists = extensionLists\r\n\r\n const enrichedSheets = await Promise.all(sheetsData.map(async sheet => await getSheet({\r\n xlsx,\r\n workbook: workbook as Workbook,\r\n ...sheet\r\n })))\r\n\r\n workbook.sheets = enrichedSheets as Sheet[] // eslint-disable-line\r\n\r\n workbook.save = (): void => {\r\n const calcChain = relations.get({ by: 'realType', value: 'calcChain' })\r\n for (const { target } of calcChain) {\r\n xlsx.remove(`xl/${target}`)\r\n }\r\n relations.remove({ by: 'realType', value: 'calcChain' })\r\n sharedStrings.save()\r\n styles.save()\r\n }\r\n\r\n return workbook as Workbook // eslint-disable-line\r\n}\r\n","import { createDataStore } from './data-helpers'\r\nimport { processWorksheets } from './process-worksheets'\r\nimport { readXlsx } from './xml-helpers'\r\nimport { getWorkbook } from './get-workbook'\r\n\r\nexport const generateTemplate = async (buffer: ArrayBuffer, data: Record<string, unknown>): Promise<Blob> => {\r\n const xlsx = await readXlsx(buffer)\r\n const workbook = await getWorkbook(xlsx)\r\n const dataStore = createDataStore(data)\r\n await processWorksheets({\r\n workbook,\r\n dataStore\r\n })\r\n workbook.save()\r\n workbook.persons.save()\r\n const file = await xlsx.generateAsync({ type: 'blob' })\r\n return file\r\n}\r\n"],"mappings":"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","names":["value","JSZip","value","serializer","xf","value","index","id","serializer","ref","save","serializeXml","id","hyperlinks","value","serializer","save","ref","sheet","relations"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
declare const generateXlsx: (template: string | ArrayBuffer, data: Record<string, unknown>) => Promise<Blob>;
|
|
2
|
+
/**
|
|
3
|
+
* Downloads an XLSX file by replacing data in a template file and initiates the download in the browser.
|
|
4
|
+
* @param {string} templateURL - The URL of the template XLSX file.
|
|
5
|
+
* @param {Object} data - The data object containing values to replace in the template.
|
|
6
|
+
* @param {string} [fileName] - The name of the file to be downloaded. If not provided, a default name based on the current date will be used.
|
|
7
|
+
* @returns {Promise<void>} A promise that resolves once the download is initiated.
|
|
8
|
+
*/
|
|
9
|
+
declare const downloadXlsx: (template: string | ArrayBuffer, data: Record<string, unknown>, fileName?: string, mimeType?: string) => Promise<void>;
|
|
10
|
+
|
|
11
|
+
export { downloadXlsx, generateXlsx };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
declare const generateXlsx: (template: string | ArrayBuffer, data: Record<string, unknown>) => Promise<Blob>;
|
|
2
|
+
/**
|
|
3
|
+
* Downloads an XLSX file by replacing data in a template file and initiates the download in the browser.
|
|
4
|
+
* @param {string} templateURL - The URL of the template XLSX file.
|
|
5
|
+
* @param {Object} data - The data object containing values to replace in the template.
|
|
6
|
+
* @param {string} [fileName] - The name of the file to be downloaded. If not provided, a default name based on the current date will be used.
|
|
7
|
+
* @returns {Promise<void>} A promise that resolves once the download is initiated.
|
|
8
|
+
*/
|
|
9
|
+
declare const downloadXlsx: (template: string | ArrayBuffer, data: Record<string, unknown>, fileName?: string, mimeType?: string) => Promise<void>;
|
|
10
|
+
|
|
11
|
+
export { downloadXlsx, generateXlsx };
|