@simplysm/excel 13.0.0-beta.46 → 13.0.0-beta.47

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/dist/excel-cell.js.map +0 -1
  2. package/dist/excel-col.js.map +0 -1
  3. package/dist/excel-row.js.map +0 -1
  4. package/dist/excel-workbook.js.map +0 -1
  5. package/dist/excel-worksheet.js.map +0 -1
  6. package/dist/excel-wrapper.js.map +0 -1
  7. package/dist/index.js.map +0 -1
  8. package/dist/types.js.map +0 -1
  9. package/dist/utils/excel-utils.js.map +0 -1
  10. package/dist/utils/zip-cache.js.map +0 -1
  11. package/dist/xml/excel-xml-content-type.js.map +0 -1
  12. package/dist/xml/excel-xml-drawing.js.map +0 -1
  13. package/dist/xml/excel-xml-relationship.js.map +0 -1
  14. package/dist/xml/excel-xml-shared-string.js.map +0 -1
  15. package/dist/xml/excel-xml-style.js.map +0 -1
  16. package/dist/xml/excel-xml-unknown.js.map +0 -1
  17. package/dist/xml/excel-xml-workbook.js.map +0 -1
  18. package/dist/xml/excel-xml-worksheet.js.map +0 -1
  19. package/package.json +4 -3
  20. package/src/excel-cell.ts +326 -0
  21. package/src/excel-col.ts +43 -0
  22. package/src/excel-row.ts +37 -0
  23. package/src/excel-workbook.ts +206 -0
  24. package/src/excel-worksheet.ts +380 -0
  25. package/src/excel-wrapper.ts +219 -0
  26. package/src/index.ts +13 -0
  27. package/src/types.ts +396 -0
  28. package/src/utils/excel-utils.ts +201 -0
  29. package/src/utils/zip-cache.ts +103 -0
  30. package/src/xml/excel-xml-content-type.ts +64 -0
  31. package/src/xml/excel-xml-drawing.ts +87 -0
  32. package/src/xml/excel-xml-relationship.ts +86 -0
  33. package/src/xml/excel-xml-shared-string.ts +80 -0
  34. package/src/xml/excel-xml-style.ts +393 -0
  35. package/src/xml/excel-xml-unknown.ts +11 -0
  36. package/src/xml/excel-xml-workbook.ts +112 -0
  37. package/src/xml/excel-xml-worksheet.ts +544 -0
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/excel-cell.ts"],
4
- "sourcesContent": ["import type { ExcelXmlWorksheet } from \"./xml/excel-xml-worksheet\";\nimport type { ExcelXmlContentType } from \"./xml/excel-xml-content-type\";\nimport type { ExcelXmlRelationship } from \"./xml/excel-xml-relationship\";\nimport type { ExcelXmlStyle, ExcelStyle } from \"./xml/excel-xml-style\";\nimport type { ExcelXmlSharedString } from \"./xml/excel-xml-shared-string\";\nimport type { ZipCache } from \"./utils/zip-cache\";\nimport type { ExcelAddressPoint, ExcelStyleOptions, ExcelValueType } from \"./types\";\nimport { DateOnly, DateTime, numParseFloat, numParseInt, strIsNullOrEmpty, Time } from \"@simplysm/core-common\";\nimport { ExcelXmlSharedString as ExcelXmlSharedStringClass } from \"./xml/excel-xml-shared-string\";\nimport { ExcelXmlStyle as ExcelXmlStyleClass } from \"./xml/excel-xml-style\";\nimport { ExcelUtils } from \"./utils/excel-utils\";\n\n/**\n * Excel \uC140\uC744 \uB098\uD0C0\uB0B4\uB294 \uD074\uB798\uC2A4.\n * \uAC12 \uC77D\uAE30/\uC4F0\uAE30, \uC218\uC2DD \uC124\uC815, \uC2A4\uD0C0\uC77C \uC124\uC815, \uC140 \uBCD1\uD569 \uB4F1\uC758 \uAE30\uB2A5\uC744 \uC81C\uACF5\uD55C\uB2E4.\n *\n * @remarks\n * ## \uBE44\uB3D9\uAE30 \uBA54\uC11C\uB4DC \uC124\uACC4\n *\n * `getVal()`, `setVal()` \uB4F1 \uBAA8\uB4E0 \uC140 \uBA54\uC11C\uB4DC\uAC00 `async`\uC778 \uC774\uC720:\n * - \uC140 \uD0C0\uC785\uC5D0 \uB530\uB77C \uD544\uC694\uD55C XML\uB9CC \uC120\uD0DD\uC801\uC73C\uB85C \uB85C\uB4DC\uD55C\uB2E4\n * - \uBB38\uC790\uC5F4 \uC140: SharedStrings.xml \uB85C\uB4DC\n * - \uC22B\uC790 \uC140: SharedStrings \uB85C\uB4DC \uC548\uD568\n * - \uC2A4\uD0C0\uC77C\uC774 \uC788\uB294 \uC140: Styles.xml \uB85C\uB4DC\n *\n * \uC5B4\uB5A4 \uC140\uC744 \uC77D\uC744\uC9C0 \uBBF8\uB9AC \uC54C \uC218 \uC5C6\uAE30 \uB54C\uBB38\uC5D0 \uB3D9\uAE30 \uAD6C\uC870\uB85C\uB294 \uAD6C\uD604\uD560 \uC218 \uC5C6\uB2E4.\n * \uB3D9\uAE30 \uAD6C\uC870\uB85C \uB9CC\uB4E4\uB824\uBA74 \uBAA8\uB4E0 XML\uC744 \uBBF8\uB9AC \uB85C\uB4DC\uD574\uC57C \uD558\uBBC0\uB85C \uB300\uC6A9\uB7C9 \uD30C\uC77C\uC5D0\uC11C \uBA54\uBAA8\uB9AC \uBB38\uC81C\uAC00 \uBC1C\uC0DD\uD55C\uB2E4.\n */\nexport class ExcelCell {\n /** \uC140 \uC8FC\uC18C (0-based \uD589/\uC5F4 \uC778\uB371\uC2A4) */\n readonly addr: ExcelAddressPoint;\n\n constructor(\n private readonly _zipCache: ZipCache,\n private readonly _targetFileName: string,\n private readonly _r: number,\n private readonly _c: number,\n ) {\n this.addr = { r: this._r, c: this._c };\n }\n\n //#region Value Methods\n\n /** \uC140\uC5D0 \uC218\uC2DD \uC124\uC815 (undefined: \uC218\uC2DD \uC0AD\uC81C) */\n async setFormula(val: string | undefined): Promise<void> {\n if (val === undefined) {\n await this._deleteCell(this.addr);\n } else {\n const wsData = await this._getWsData();\n wsData.setCellType(this.addr, \"str\");\n wsData.setCellVal(this.addr, undefined);\n wsData.setCellFormula(this.addr, val);\n }\n }\n\n /** \uC140\uC758 \uC218\uC2DD \uBC18\uD658 */\n async getFormula(): Promise<string | undefined> {\n const wsData = await this._getWsData();\n return wsData.getCellFormula(this.addr);\n }\n\n /** \uC140 \uAC12 \uC124\uC815 (undefined: \uC140 \uC0AD\uC81C) */\n async setVal(val: ExcelValueType): Promise<void> {\n if (val === undefined) {\n await this._deleteCell(this.addr);\n } else if (typeof val === \"string\") {\n const wsData = await this._getWsData();\n const ssData = await this._getOrCreateSsData();\n const ssId = ssData.getIdByString(val);\n if (ssId !== undefined) {\n wsData.setCellType(this.addr, \"s\");\n wsData.setCellVal(this.addr, ssId.toString());\n } else {\n const newSsId = ssData.add(val);\n wsData.setCellType(this.addr, \"s\");\n wsData.setCellVal(this.addr, newSsId.toString());\n }\n } else if (typeof val === \"boolean\") {\n const wsData = await this._getWsData();\n wsData.setCellType(this.addr, \"b\");\n wsData.setCellVal(this.addr, val ? \"1\" : \"0\");\n } else if (typeof val === \"number\") {\n const wsData = await this._getWsData();\n wsData.setCellType(this.addr, undefined);\n wsData.setCellVal(this.addr, val.toString());\n } else if (val instanceof DateOnly || val instanceof DateTime || val instanceof Time) {\n const wsData = await this._getWsData();\n wsData.setCellType(this.addr, undefined);\n wsData.setCellVal(this.addr, ExcelUtils.convertTimeTickToNumber(val.tick).toString());\n\n const numFmtName = val instanceof DateOnly ? \"DateOnly\" : val instanceof DateTime ? \"DateTime\" : \"Time\";\n await this._setStyleInternal({ numFmtId: ExcelUtils.convertNumFmtNameToId(numFmtName).toString() });\n } else {\n throw new Error(`[${ExcelUtils.stringifyAddr(this.addr)}] \uC9C0\uC6D0\uB418\uC9C0 \uC54A\uB294 \uD0C0\uC785\uC785\uB2C8\uB2E4: ${typeof val}`);\n }\n }\n\n /** \uC140 \uAC12 \uBC18\uD658 */\n async getVal(): Promise<ExcelValueType> {\n const wsData = await this._getWsData();\n const cellVal = wsData.getCellVal(this.addr);\n if (cellVal === undefined || strIsNullOrEmpty(cellVal)) {\n return undefined;\n }\n\n const cellType = wsData.getCellType(this.addr);\n if (cellType === \"s\") {\n const ssData = await this._getOrCreateSsData();\n const ssId = numParseInt(cellVal);\n if (ssId == null) {\n throw new Error(`[${ExcelUtils.stringifyAddr(this.addr)}] SharedString ID \uD30C\uC2F1 \uC2E4\uD328: ${cellVal}`);\n }\n return ssData.getStringById(ssId);\n } else if (cellType === \"str\") {\n return cellVal;\n } else if (cellType === \"inlineStr\") {\n return cellVal;\n } else if (cellType === \"b\") {\n return cellVal === \"1\";\n } else if (cellType === \"n\") {\n return parseFloat(cellVal);\n } else if (cellType === \"e\") {\n throw new Error(\n `[${ExcelUtils.stringifyAddr(this.addr)}] \uC140 \uD0C0\uC785 \uBD84\uC11D \uC2E4\uD328: \uC140\uC5D0 \uC5D0\uB7EC \uAC12\uC774 \uD3EC\uD568\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4 (${cellVal})`,\n );\n } else {\n // cellType === undefined: \uC22B\uC790 \uB610\uB294 \uB0A0\uC9DC/\uC2DC\uAC04 \uD0C0\uC785\n const cellStyleId = wsData.getCellStyleId(this.addr);\n if (cellStyleId === undefined) {\n return parseFloat(cellVal);\n }\n\n const styleData = await this._getStyleData();\n if (styleData == null) {\n return parseFloat(cellVal);\n }\n\n const numFmtId = styleData.get(cellStyleId).numFmtId;\n if (numFmtId === undefined) {\n return parseFloat(cellVal);\n }\n\n const numFmtCode = styleData.getNumFmtCode(numFmtId);\n let numFmt;\n if (numFmtCode !== undefined) {\n numFmt = ExcelUtils.convertNumFmtCodeToName(numFmtCode);\n } else {\n const numFmtIdNum = numParseInt(numFmtId);\n if (numFmtIdNum == null) {\n throw new Error(`[${ExcelUtils.stringifyAddr(this.addr)}] numFmtId \uD30C\uC2F1 \uC2E4\uD328: ${numFmtId}`);\n }\n numFmt = ExcelUtils.convertNumFmtIdToName(numFmtIdNum);\n }\n\n if (numFmt === \"number\") {\n return parseFloat(cellVal);\n } else if (numFmt === \"string\") {\n return cellVal;\n } else {\n // DateOnly, DateTime, Time\n const dateNum = numParseFloat(cellVal);\n if (dateNum == null) {\n throw new Error(`[${ExcelUtils.stringifyAddr(this.addr)}] \uB0A0\uC9DC \uC22B\uC790 \uD30C\uC2F1 \uC2E4\uD328: ${cellVal}`);\n }\n const tick = ExcelUtils.convertNumberToTimeTick(dateNum);\n if (numFmt === \"DateOnly\") {\n return new DateOnly(tick);\n } else if (numFmt === \"DateTime\") {\n return new DateTime(tick);\n } else {\n return new Time(tick);\n }\n }\n }\n }\n\n //#endregion\n\n //#region Merge Methods\n\n /**\n * \uD604\uC7AC \uC140\uBD80\uD130 \uC9C0\uC815\uB41C \uB05D \uC88C\uD45C\uAE4C\uC9C0 \uC140 \uBCD1\uD569\n * @param r \uBCD1\uD569 \uB05D \uD589 \uC778\uB371\uC2A4 (0-based)\n * @param c \uBCD1\uD569 \uB05D \uC5F4 \uC778\uB371\uC2A4 (0-based)\n * @example\n * // A1 \uC140\uC5D0\uC11C \uD638\uCD9C\uD558\uBA74 A1:C3 \uBC94\uC704 (3\uD589 x 3\uC5F4)\uB97C \uBCD1\uD569\n * await ws.cell(0, 0).merge(2, 2);\n */\n async merge(r: number, c: number): Promise<void> {\n const wsData = await this._getWsData();\n wsData.setMergeCells(this.addr, { r, c });\n }\n\n //#endregion\n\n //#region Style Methods\n\n /** \uC140\uC758 \uC2A4\uD0C0\uC77C ID \uBC18\uD658 */\n async getStyleId(): Promise<string | undefined> {\n const wsData = await this._getWsData();\n return wsData.getCellStyleId(this.addr);\n }\n\n /** \uC140\uC758 \uC2A4\uD0C0\uC77C ID \uC124\uC815 */\n async setStyleId(styleId: string | undefined): Promise<void> {\n const wsData = await this._getWsData();\n wsData.setCellStyleId(this.addr, styleId);\n }\n\n /**\n * \uC140 \uC2A4\uD0C0\uC77C \uC124\uC815\n * @param opts \uC2A4\uD0C0\uC77C \uC635\uC158\n * @param opts.background \uBC30\uACBD\uC0C9 (ARGB \uD615\uC2DD, 8\uC790\uB9AC 16\uC9C4\uC218. \uC608: \"FFFF0000\")\n * @param opts.border \uD14C\uB450\uB9AC \uC704\uCE58 \uBC30\uC5F4 (\uC608: [\"left\", \"right\", \"top\", \"bottom\"])\n * @param opts.horizontalAlign \uAC00\uB85C \uC815\uB82C (\"left\", \"center\", \"right\")\n * @param opts.verticalAlign \uC138\uB85C \uC815\uB82C (\"top\", \"center\", \"bottom\")\n * @param opts.numberFormat \uC22B\uC790 \uD615\uC2DD (\"number\", \"DateOnly\", \"DateTime\", \"Time\", \"string\")\n */\n async setStyle(opts: ExcelStyleOptions): Promise<void> {\n const style: ExcelStyle = {};\n\n if (opts.background != null) {\n if (!/^[0-9A-F]{8}$/i.test(opts.background)) {\n throw new Error(\"\uC0C9\uC0C1 \uD615\uC2DD\uC774 \uC798\uBABB\uB418\uC5C8\uC2B5\uB2C8\uB2E4. (\uD615\uC2DD: 00000000: alpha(\uC5ED)+rgb)\");\n }\n style.background = opts.background;\n }\n\n if (opts.border != null) {\n style.border = opts.border;\n }\n\n if (opts.horizontalAlign != null) {\n style.horizontalAlign = opts.horizontalAlign;\n }\n\n if (opts.verticalAlign != null) {\n style.verticalAlign = opts.verticalAlign;\n }\n\n if (opts.numberFormat != null) {\n style.numFmtId = ExcelUtils.convertNumFmtNameToId(opts.numberFormat).toString();\n }\n\n await this._setStyleInternal(style);\n }\n\n //#endregion\n\n //#region Private Methods\n\n private async _deleteCell(addr: ExcelAddressPoint): Promise<void> {\n const wsData = await this._getWsData();\n wsData.deleteCell(addr);\n }\n\n private async _getWsData(): Promise<ExcelXmlWorksheet> {\n return (await this._zipCache.get(`xl/worksheets/${this._targetFileName}`)) as ExcelXmlWorksheet;\n }\n\n private async _setStyleInternal(style: ExcelStyle): Promise<void> {\n const wsData = await this._getWsData();\n const styleData = await this._getOrCreateStyleData();\n let styleId = wsData.getCellStyleId(this.addr);\n if (styleId == null) {\n styleId = styleData.add(style);\n } else {\n styleId = styleData.addWithClone(styleId, style);\n }\n wsData.setCellStyleId(this.addr, styleId);\n }\n\n private async _getTypeData(): Promise<ExcelXmlContentType> {\n return (await this._zipCache.get(\"[Content_Types].xml\")) as ExcelXmlContentType;\n }\n\n private async _getSsData(): Promise<ExcelXmlSharedString | undefined> {\n return (await this._zipCache.get(\"xl/sharedStrings.xml\")) as ExcelXmlSharedString | undefined;\n }\n\n private async _getWbRelData(): Promise<ExcelXmlRelationship> {\n return (await this._zipCache.get(\"xl/_rels/workbook.xml.rels\")) as ExcelXmlRelationship;\n }\n\n private async _getStyleData(): Promise<ExcelXmlStyle | undefined> {\n return (await this._zipCache.get(\"xl/styles.xml\")) as ExcelXmlStyle | undefined;\n }\n\n private async _getOrCreateSsData(): Promise<ExcelXmlSharedString> {\n let ssData = await this._getSsData();\n if (ssData == null) {\n ssData = new ExcelXmlSharedStringClass();\n this._zipCache.set(\"xl/sharedStrings.xml\", ssData);\n\n const typeData = await this._getTypeData();\n typeData.add(\n \"/xl/sharedStrings.xml\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml\",\n );\n\n const wbRelData = await this._getWbRelData();\n wbRelData.add(\n \"sharedStrings.xml\",\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings\",\n );\n }\n return ssData;\n }\n\n private async _getOrCreateStyleData(): Promise<ExcelXmlStyle> {\n let styleData = await this._getStyleData();\n if (styleData == null) {\n styleData = new ExcelXmlStyleClass();\n this._zipCache.set(\"xl/styles.xml\", styleData);\n\n const typeData = await this._getTypeData();\n typeData.add(\"/xl/styles.xml\", \"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml\");\n\n const wbRelData = await this._getWbRelData();\n wbRelData.add(\"styles.xml\", \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\");\n }\n return styleData;\n }\n\n //#endregion\n}\n"],
5
4
  "mappings": "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",
6
5
  "names": []
7
6
  }
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/excel-col.ts"],
4
- "sourcesContent": ["import \"@simplysm/core-common\";\nimport { ExcelCell } from \"./excel-cell\";\nimport type { ExcelXmlWorksheet } from \"./xml/excel-xml-worksheet\";\nimport type { ZipCache } from \"./utils/zip-cache\";\n\n/** Excel \uC6CC\uD06C\uC2DC\uD2B8\uC758 \uC5F4\uC744 \uB098\uD0C0\uB0B4\uB294 \uD074\uB798\uC2A4. \uC140 \uC811\uADFC \uBC0F \uC5F4 \uB108\uBE44 \uC124\uC815 \uAE30\uB2A5\uC744 \uC81C\uACF5\uD55C\uB2E4. */\nexport class ExcelCol {\n private readonly _cellMap = new Map<number, ExcelCell>();\n\n constructor(\n private readonly _zipCache: ZipCache,\n private readonly _targetFileName: string,\n private readonly _c: number,\n ) {}\n\n /** \uD589 \uC778\uB371\uC2A4\uC5D0 \uD574\uB2F9\uD558\uB294 \uC140 \uBC18\uD658 (0-based) */\n cell(r: number): ExcelCell {\n return this._cellMap.getOrCreate(r, new ExcelCell(this._zipCache, this._targetFileName, r, this._c));\n }\n\n /** \uC5F4\uC758 \uBAA8\uB4E0 \uC140 \uBC18\uD658 */\n async getCells(): Promise<ExcelCell[]> {\n const result: ExcelCell[] = [];\n const wsData = await this._getWsData();\n const range = wsData.range;\n\n for (let r = range.s.r; r <= range.e.r; r++) {\n result[r] = this.cell(r);\n }\n\n return result;\n }\n\n /** \uC5F4 \uB108\uBE44 \uC124\uC815 */\n async setWidth(size: number): Promise<void> {\n const wsData = await this._getWsData();\n wsData.setColWidth((this._c + 1).toString(), size.toString());\n }\n\n private async _getWsData(): Promise<ExcelXmlWorksheet> {\n return (await this._zipCache.get(`xl/worksheets/${this._targetFileName}`)) as ExcelXmlWorksheet;\n }\n}\n"],
5
4
  "mappings": "AAAA,OAAO;AACP,SAAS,iBAAiB;AAKnB,MAAM,SAAS;AAAA,EAGpB,YACmB,WACA,iBACA,IACjB;AAHiB;AACA;AACA;AAAA,EAChB;AAAA,EANc,WAAW,oBAAI,IAAuB;AAAA;AAAA,EASvD,KAAK,GAAsB;AACzB,WAAO,KAAK,SAAS,YAAY,GAAG,IAAI,UAAU,KAAK,WAAW,KAAK,iBAAiB,GAAG,KAAK,EAAE,CAAC;AAAA,EACrG;AAAA;AAAA,EAGA,MAAM,WAAiC;AACrC,UAAM,SAAsB,CAAC;AAC7B,UAAM,SAAS,MAAM,KAAK,WAAW;AACrC,UAAM,QAAQ,OAAO;AAErB,aAAS,IAAI,MAAM,EAAE,GAAG,KAAK,MAAM,EAAE,GAAG,KAAK;AAC3C,aAAO,CAAC,IAAI,KAAK,KAAK,CAAC;AAAA,IACzB;AAEA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,SAAS,MAA6B;AAC1C,UAAM,SAAS,MAAM,KAAK,WAAW;AACrC,WAAO,aAAa,KAAK,KAAK,GAAG,SAAS,GAAG,KAAK,SAAS,CAAC;AAAA,EAC9D;AAAA,EAEA,MAAc,aAAyC;AACrD,WAAQ,MAAM,KAAK,UAAU,IAAI,iBAAiB,KAAK,eAAe,EAAE;AAAA,EAC1E;AACF;",
6
5
  "names": []
7
6
  }
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/excel-row.ts"],
4
- "sourcesContent": ["import \"@simplysm/core-common\";\nimport { ExcelCell } from \"./excel-cell\";\nimport type { ExcelXmlWorksheet } from \"./xml/excel-xml-worksheet\";\nimport type { ZipCache } from \"./utils/zip-cache\";\n\n/** Excel \uC6CC\uD06C\uC2DC\uD2B8\uC758 \uD589\uC744 \uB098\uD0C0\uB0B4\uB294 \uD074\uB798\uC2A4. \uC140 \uC811\uADFC \uAE30\uB2A5\uC744 \uC81C\uACF5\uD55C\uB2E4. */\nexport class ExcelRow {\n private readonly _cellMap = new Map<number, ExcelCell>();\n\n constructor(\n private readonly _zipCache: ZipCache,\n private readonly _targetFileName: string,\n private readonly _r: number,\n ) {}\n\n /** \uC5F4 \uC778\uB371\uC2A4\uC5D0 \uD574\uB2F9\uD558\uB294 \uC140 \uBC18\uD658 (0-based) */\n cell(c: number): ExcelCell {\n return this._cellMap.getOrCreate(c, new ExcelCell(this._zipCache, this._targetFileName, this._r, c));\n }\n\n /** \uD589\uC758 \uBAA8\uB4E0 \uC140 \uBC18\uD658 */\n async getCells(): Promise<ExcelCell[]> {\n const result: ExcelCell[] = [];\n const wsData = await this._getWsData();\n const range = wsData.range;\n\n for (let c = range.s.c; c <= range.e.c; c++) {\n result[c] = this.cell(c);\n }\n\n return result;\n }\n\n private async _getWsData(): Promise<ExcelXmlWorksheet> {\n return (await this._zipCache.get(`xl/worksheets/${this._targetFileName}`)) as ExcelXmlWorksheet;\n }\n}\n"],
5
4
  "mappings": "AAAA,OAAO;AACP,SAAS,iBAAiB;AAKnB,MAAM,SAAS;AAAA,EAGpB,YACmB,WACA,iBACA,IACjB;AAHiB;AACA;AACA;AAAA,EAChB;AAAA,EANc,WAAW,oBAAI,IAAuB;AAAA;AAAA,EASvD,KAAK,GAAsB;AACzB,WAAO,KAAK,SAAS,YAAY,GAAG,IAAI,UAAU,KAAK,WAAW,KAAK,iBAAiB,KAAK,IAAI,CAAC,CAAC;AAAA,EACrG;AAAA;AAAA,EAGA,MAAM,WAAiC;AACrC,UAAM,SAAsB,CAAC;AAC7B,UAAM,SAAS,MAAM,KAAK,WAAW;AACrC,UAAM,QAAQ,OAAO;AAErB,aAAS,IAAI,MAAM,EAAE,GAAG,KAAK,MAAM,EAAE,GAAG,KAAK;AAC3C,aAAO,CAAC,IAAI,KAAK,KAAK,CAAC;AAAA,IACzB;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,aAAyC;AACrD,WAAQ,MAAM,KAAK,UAAU,IAAI,iBAAiB,KAAK,eAAe,EAAE;AAAA,EAC1E;AACF;",
6
5
  "names": []
7
6
  }
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/excel-workbook.ts"],
4
- "sourcesContent": ["import type { Bytes } from \"@simplysm/core-common\";\nimport { ExcelWorksheet } from \"./excel-worksheet\";\nimport { ZipCache } from \"./utils/zip-cache\";\nimport { ExcelXmlContentType } from \"./xml/excel-xml-content-type\";\nimport { ExcelXmlRelationship } from \"./xml/excel-xml-relationship\";\nimport type { ExcelXmlWorkbook } from \"./xml/excel-xml-workbook\";\nimport { ExcelXmlWorkbook as ExcelXmlWorkbookClass } from \"./xml/excel-xml-workbook\";\nimport { ExcelXmlWorksheet as ExcelXmlWorksheetClass } from \"./xml/excel-xml-worksheet\";\n\n/**\n * Excel \uC6CC\uD06C\uBD81 \uCC98\uB9AC \uD074\uB798\uC2A4\n *\n * @remarks\n * \uC774 \uD074\uB798\uC2A4\uB294 \uB0B4\uBD80\uC801\uC73C\uB85C ZIP \uB9AC\uC18C\uC2A4\uB97C \uAD00\uB9AC\uD569\uB2C8\uB2E4.\n * \uC0AC\uC6A9 \uC644\uB8CC \uD6C4 \uBC18\uB4DC\uC2DC \uB9AC\uC18C\uC2A4\uB97C \uD574\uC81C\uD574\uC57C \uD569\uB2C8\uB2E4.\n *\n * ## \uBE44\uB3D9\uAE30 \uC124\uACC4\n *\n * \uB300\uC6A9\uB7C9 Excel \uD30C\uC77C\uC758 \uBA54\uBAA8\uB9AC \uD6A8\uC728\uC131\uC744 \uC704\uD574 Lazy Loading \uAD6C\uC870\uB97C \uCC44\uD0DD\uD569\uB2C8\uB2E4:\n * - ZIP \uD30C\uC77C \uB0B4\uBD80\uC758 XML\uC740 \uC811\uADFC \uC2DC\uC810\uC5D0\uB9CC \uC77D\uACE0 \uD30C\uC2F1\uD55C\uB2E4\n * - SharedStrings, Styles \uB4F1 \uB300\uC6A9\uB7C9 XML\uC740 \uD544\uC694\uD560 \uB54C\uB9CC \uB85C\uB4DC\uD55C\uB2E4\n * - \uADF9\uB2E8\uC801 \uCF00\uC774\uC2A4(\uC608: SharedStrings\uAC00 1TB\uC778 \uD30C\uC77C\uC5D0\uC11C \uC22B\uC790 \uC140 \uD558\uB098\uB9CC \uC77D\uAE30)\uC5D0\uC11C\uB3C4 \uBA54\uBAA8\uB9AC \uD6A8\uC728\uC801\uC774\uB2E4\n *\n * @example\n * ```typescript\n * // await using \uC0AC\uC6A9 (\uAD8C\uC7A5)\n * await using wb = new ExcelWorkbook(bytes);\n * const ws = await wb.getWorksheet(0);\n * // ... \uC791\uC5C5 \uC218\uD589\n * // \uC2A4\uCF54\uD504 \uC885\uB8CC \uC2DC \uC790\uB3D9\uC73C\uB85C \uB9AC\uC18C\uC2A4 \uD574\uC81C\n *\n * // \uB610\uB294 try-finally \uC0AC\uC6A9\n * const wb = new ExcelWorkbook(bytes);\n * try {\n * const ws = await wb.getWorksheet(0);\n * // ... \uC791\uC5C5 \uC218\uD589\n * } finally {\n * await wb.close();\n * }\n * ```\n */\nexport class ExcelWorkbook {\n readonly zipCache: ZipCache;\n private readonly _wsMap = new Map<number, ExcelWorksheet>();\n private _isClosed = false;\n\n /**\n * @param arg \uAE30\uC874 Excel \uD30C\uC77C \uB370\uC774\uD130 (Blob \uB610\uB294 Uint8Array). \uC0DD\uB7B5 \uC2DC \uC0C8 \uC6CC\uD06C\uBD81\uC744 \uC0DD\uC131\uD55C\uB2E4.\n */\n constructor(arg?: Blob | Bytes) {\n if (arg != null) {\n this.zipCache = new ZipCache(arg);\n } else {\n this.zipCache = new ZipCache();\n\n // Global ContentTypes\n const typeXml = new ExcelXmlContentType();\n this.zipCache.set(\"[Content_Types].xml\", typeXml);\n\n // Global Rels\n this.zipCache.set(\n \"_rels/.rels\",\n new ExcelXmlRelationship().add(\n \"xl/workbook.xml\",\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\",\n ),\n );\n\n // Workbook\n const wbXml = new ExcelXmlWorkbookClass();\n this.zipCache.set(\"xl/workbook.xml\", wbXml);\n\n // Workbook Rels\n const wbRelXml = new ExcelXmlRelationship();\n this.zipCache.set(\"xl/_rels/workbook.xml.rels\", wbRelXml);\n }\n }\n\n //#region Worksheet Methods\n\n private _ensureNotClosed(): void {\n if (this._isClosed) {\n throw new Error(\"ExcelWorkbook\uC774 \uC774\uBBF8 \uB2EB\uD614\uC2B5\uB2C8\uB2E4. close() \uD638\uCD9C \uD6C4\uC5D0\uB294 \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.\");\n }\n }\n\n /** \uC6CC\uD06C\uBD81\uC758 \uBAA8\uB4E0 \uC6CC\uD06C\uC2DC\uD2B8 \uC774\uB984\uC744 \uBC18\uD658 */\n async getWorksheetNames(): Promise<string[]> {\n this._ensureNotClosed();\n const wbData = (await this.zipCache.get(\"xl/workbook.xml\")) as ExcelXmlWorkbook;\n return wbData.sheetNames;\n }\n\n /** \uC0C8 \uC6CC\uD06C\uC2DC\uD2B8\uB97C \uC0DD\uC131\uD558\uACE0 \uBC18\uD658 */\n async createWorksheet(name: string): Promise<ExcelWorksheet> {\n this._ensureNotClosed();\n // Workbook\n const wbXml = (await this.zipCache.get(\"xl/workbook.xml\")) as ExcelXmlWorkbook;\n const newWsRelId = wbXml.addWorksheet(name).lastWsRelId!;\n\n // Content Types\n const typeXml = (await this.zipCache.get(\"[Content_Types].xml\")) as ExcelXmlContentType;\n typeXml.add(\n `/xl/worksheets/sheet${newWsRelId}.xml`,\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\",\n );\n\n // Workbook Rels\n const wbRelXml = (await this.zipCache.get(\"xl/_rels/workbook.xml.rels\")) as ExcelXmlRelationship;\n wbRelXml.insert(\n newWsRelId,\n `worksheets/sheet${newWsRelId}.xml`,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\",\n );\n\n // Worksheet\n const wsXml = new ExcelXmlWorksheetClass();\n this.zipCache.set(`xl/worksheets/sheet${newWsRelId}.xml`, wsXml);\n\n const ws = new ExcelWorksheet(this.zipCache, newWsRelId, `sheet${newWsRelId}.xml`);\n this._wsMap.set(newWsRelId, ws);\n return ws;\n }\n\n /** \uC774\uB984 \uB610\uB294 \uC778\uB371\uC2A4(0-based)\uB85C \uC6CC\uD06C\uC2DC\uD2B8\uB97C \uC870\uD68C */\n async getWorksheet(nameOrIndex: string | number): Promise<ExcelWorksheet> {\n this._ensureNotClosed();\n const wbData = (await this.zipCache.get(\"xl/workbook.xml\")) as ExcelXmlWorkbook;\n const wsId =\n typeof nameOrIndex === \"string\" ? wbData.getWsRelIdByName(nameOrIndex) : wbData.getWsRelIdByIndex(nameOrIndex);\n\n if (wsId === undefined) {\n if (typeof nameOrIndex === \"string\") {\n throw new Error(`\uC2DC\uD2B8\uBA85\uC774 '${nameOrIndex}'\uC778 \uC2DC\uD2B8\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.`);\n } else {\n throw new Error(`'${nameOrIndex}'\uBC88\uC9F8 \uC2DC\uD2B8\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.`);\n }\n }\n\n if (this._wsMap.has(wsId)) {\n return this._wsMap.get(wsId)!;\n }\n\n const relData = (await this.zipCache.get(\"xl/_rels/workbook.xml.rels\")) as ExcelXmlRelationship;\n const targetFilePath = relData.getTargetByRelId(wsId);\n if (targetFilePath == null) {\n throw new Error(`\uC2DC\uD2B8 \uAD00\uACC4 \uC815\uBCF4\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4: rId${wsId}`);\n }\n\n // path.basename \uB300\uC2E0 \uC9C1\uC811 \uD30C\uC77C\uBA85 \uCD94\uCD9C (\uBE0C\uB77C\uC6B0\uC800 \uD638\uD658\uC131)\n const fileName = targetFilePath.split(\"/\").pop();\n if (fileName == null) {\n throw new Error(`\uC2DC\uD2B8 \uD30C\uC77C\uBA85\uC744 \uCD94\uCD9C\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4: ${targetFilePath}`);\n }\n\n const ws = new ExcelWorksheet(this.zipCache, wsId, fileName);\n this._wsMap.set(wsId, ws);\n return ws;\n }\n\n //#endregion\n\n //#region Export Methods\n\n /** \uC6CC\uD06C\uBD81\uC744 \uBC14\uC774\uD2B8 \uBC30\uC5F4\uB85C \uCD9C\uB825 */\n async getBytes(): Promise<Bytes> {\n this._ensureNotClosed();\n return this.zipCache.toBytes();\n }\n\n /** \uC6CC\uD06C\uBD81\uC744 Blob\uC73C\uB85C \uCD9C\uB825 */\n async getBlob(): Promise<Blob> {\n this._ensureNotClosed();\n const bytes = await this.zipCache.toBytes();\n return new Blob([new Uint8Array(bytes)], {\n type: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n });\n }\n\n //#endregion\n\n //#region Lifecycle Methods\n\n /**\n * \uC6CC\uD06C\uBD81 \uB9AC\uC18C\uC2A4 \uD574\uC81C\n *\n * @remarks\n * ZIP \uB9AC\uB354\uC640 \uB0B4\uBD80 \uCE90\uC2DC\uB97C \uC815\uB9AC\uD569\uB2C8\uB2E4.\n * \uD638\uCD9C \uD6C4\uC5D0\uB294 \uC774 \uC6CC\uD06C\uBD81 \uC778\uC2A4\uD134\uC2A4\uB97C \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.\n * \uC774\uBBF8 \uB2EB\uD78C \uC6CC\uD06C\uBD81\uC5D0 \uB300\uD574 \uD638\uCD9C\uD574\uB3C4 \uC548\uC804\uD569\uB2C8\uB2E4 (no-op).\n */\n async close(): Promise<void> {\n if (this._isClosed) {\n return; // \uC774\uBBF8 \uB2EB\uD78C \uACBD\uC6B0 \uBB34\uC2DC\n }\n this._isClosed = true;\n this._wsMap.clear();\n await this.zipCache.close();\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.close();\n }\n\n //#endregion\n}\n"],
5
4
  "mappings": "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",
6
5
  "names": []
7
6
  }
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/excel-worksheet.ts"],
4
- "sourcesContent": ["import type { Bytes } from \"@simplysm/core-common\";\nimport \"@simplysm/core-common\";\nimport { strIsNullOrEmpty } from \"@simplysm/core-common\";\nimport mime from \"mime\";\nimport type { ExcelCell } from \"./excel-cell\";\nimport { ExcelCol } from \"./excel-col\";\nimport { ExcelRow } from \"./excel-row\";\nimport type { ExcelAddressPoint, ExcelAddressRangePoint, ExcelValueType } from \"./types\";\nimport type { ZipCache } from \"./utils/zip-cache\";\nimport type { ExcelXmlContentType } from \"./xml/excel-xml-content-type\";\nimport { ExcelXmlDrawing } from \"./xml/excel-xml-drawing\";\nimport { ExcelXmlRelationship } from \"./xml/excel-xml-relationship\";\nimport type { ExcelXmlWorkbook } from \"./xml/excel-xml-workbook\";\nimport type { ExcelXmlWorksheet } from \"./xml/excel-xml-worksheet\";\n\n/**\n * Excel \uC6CC\uD06C\uC2DC\uD2B8\uB97C \uB098\uD0C0\uB0B4\uB294 \uD074\uB798\uC2A4.\n * \uC140 \uC811\uADFC, \uD589/\uC5F4 \uBCF5\uC0AC, \uB370\uC774\uD130 \uD14C\uC774\uBE14 \uCC98\uB9AC, \uC774\uBBF8\uC9C0 \uC0BD\uC785 \uB4F1\uC758 \uAE30\uB2A5\uC744 \uC81C\uACF5\uD55C\uB2E4.\n */\nexport class ExcelWorksheet {\n private readonly _rowMap = new Map<number, ExcelRow>();\n private readonly _colMap = new Map<number, ExcelCol>();\n\n constructor(\n private readonly _zipCache: ZipCache,\n private readonly _relId: number,\n private readonly _targetFileName: string,\n ) {}\n\n //#region Name Methods\n\n /** \uC6CC\uD06C\uC2DC\uD2B8 \uC774\uB984 \uBC18\uD658 */\n async getName(): Promise<string> {\n const wbXmlData = await this._getWbData();\n const name = wbXmlData.getWorksheetNameById(this._relId);\n if (name == null) {\n throw new Error(`\uC6CC\uD06C\uC2DC\uD2B8 ID ${this._relId}\uC5D0 \uD574\uB2F9\uD558\uB294 \uC774\uB984\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4`);\n }\n return name;\n }\n\n /** \uC6CC\uD06C\uC2DC\uD2B8 \uC774\uB984 \uBCC0\uACBD */\n async setName(newName: string): Promise<void> {\n const wbXmlData = await this._getWbData();\n wbXmlData.setWorksheetNameById(this._relId, newName);\n }\n\n //#endregion\n\n //#region Cell Access Methods\n\n /** \uD589 \uAC1D\uCCB4 \uBC18\uD658 (0-based) */\n row(r: number): ExcelRow {\n return this._rowMap.getOrCreate(r, new ExcelRow(this._zipCache, this._targetFileName, r));\n }\n\n /** \uC140 \uAC1D\uCCB4 \uBC18\uD658 (0-based \uD589/\uC5F4) */\n cell(r: number, c: number): ExcelCell {\n return this.row(r).cell(c);\n }\n\n /** \uC5F4 \uAC1D\uCCB4 \uBC18\uD658 (0-based) */\n col(c: number): ExcelCol {\n return this._colMap.getOrCreate(c, new ExcelCol(this._zipCache, this._targetFileName, c));\n }\n\n //#endregion\n\n //#region Copy Methods\n\n /** \uC18C\uC2A4 \uD589\uC758 \uC2A4\uD0C0\uC77C\uC744 \uD0C0\uAC9F \uD589\uC5D0 \uBCF5\uC0AC */\n async copyRowStyle(srcR: number, targetR: number): Promise<void> {\n const range = await this.getRange();\n\n for (let c = range.s.c; c <= range.e.c; c++) {\n await this.copyCellStyle({ r: srcR, c: c }, { r: targetR, c: c });\n }\n }\n\n /** \uC18C\uC2A4 \uC140\uC758 \uC2A4\uD0C0\uC77C\uC744 \uD0C0\uAC9F \uC140\uC5D0 \uBCF5\uC0AC */\n async copyCellStyle(srcAddr: ExcelAddressPoint, targetAddr: ExcelAddressPoint): Promise<void> {\n const wsData = await this._getWsData();\n\n const styleId = wsData.getCellStyleId(srcAddr);\n if (styleId != null) {\n wsData.setCellStyleId(targetAddr, styleId);\n }\n }\n\n /** \uC18C\uC2A4 \uD589\uC744 \uD0C0\uAC9F \uD589\uC5D0 \uBCF5\uC0AC (\uB36E\uC5B4\uC4F0\uAE30) */\n async copyRow(srcR: number, targetR: number): Promise<void> {\n const wsData = await this._getWsData();\n wsData.copyRow(srcR, targetR);\n }\n\n /** \uC18C\uC2A4 \uC140\uC744 \uD0C0\uAC9F \uC140\uC5D0 \uBCF5\uC0AC */\n async copyCell(srcAddr: ExcelAddressPoint, targetAddr: ExcelAddressPoint): Promise<void> {\n const wsData = await this._getWsData();\n wsData.copyCell(srcAddr, targetAddr);\n }\n\n /**\n * \uC18C\uC2A4 \uD589\uC744 \uD0C0\uAC9F \uC704\uCE58\uC5D0 \uC0BD\uC785 \uBCF5\uC0AC.\n * \uD0C0\uAC9F \uC704\uCE58 \uC774\uD558\uC758 \uAE30\uC874 \uD589\uB4E4\uC740 \uD55C \uCE78\uC529 \uC544\uB798\uB85C \uBC00\uB9B0\uB2E4.\n * @param srcR \uBCF5\uC0AC\uD560 \uC18C\uC2A4 \uD589 \uC778\uB371\uC2A4 (0-based)\n * @param targetR \uC0BD\uC785\uD560 \uD0C0\uAC9F \uD589 \uC778\uB371\uC2A4 (0-based)\n */\n async insertCopyRow(srcR: number, targetR: number): Promise<void> {\n const wsData = await this._getWsData();\n const range = wsData.range;\n\n // targetR \uC774\uD558 \uBAA8\uB4E0 \uBCD1\uD569 \uC140\uC758 \uD589 \uC778\uB371\uC2A4 +1\n const mergeCells = wsData.getMergeCells();\n for (const mc of mergeCells) {\n if (mc.s.r >= targetR) mc.s.r++;\n if (mc.e.r >= targetR) mc.e.r++;\n }\n\n // srcR >= targetR\uC778 \uACBD\uC6B0, \uBC00\uB9BC \uD6C4 srcR \uC704\uCE58\uAC00 \uBCC0\uACBD\uB418\uBBC0\uB85C \uBCF4\uC815\n const adjustedSrcR = srcR >= targetR ? srcR + 1 : srcR;\n\n for (let r = range.e.r; r >= targetR; r--) {\n await this.copyRow(r, r + 1);\n }\n\n await this.copyRow(adjustedSrcR, targetR);\n }\n\n //#endregion\n\n //#region Range Methods\n\n /** \uC6CC\uD06C\uC2DC\uD2B8\uC758 \uB370\uC774\uD130 \uBC94\uC704 \uBC18\uD658 */\n async getRange(): Promise<ExcelAddressRangePoint> {\n const xml = await this._getWsData();\n return xml.range;\n }\n\n /** \uC6CC\uD06C\uC2DC\uD2B8\uC758 \uBAA8\uB4E0 \uC140\uC744 2\uCC28\uC6D0 \uBC30\uC5F4\uB85C \uBC18\uD658 */\n async getCells(): Promise<ExcelCell[][]> {\n const xml = await this._getWsData();\n const range = xml.range;\n const promises: Promise<ExcelCell[]>[] = [];\n\n for (let r = range.s.r; r <= range.e.r; r++) {\n promises.push(this.row(r).getCells());\n }\n\n return Promise.all(promises);\n }\n\n //#endregion\n\n //#region Data Methods\n\n /**\n * \uC6CC\uD06C\uC2DC\uD2B8 \uB370\uC774\uD130\uB97C \uD14C\uC774\uBE14(\uB808\uCF54\uB4DC \uBC30\uC5F4) \uD615\uC2DD\uC73C\uB85C \uBC18\uD658.\n * @param opt.headerRowIndex \uD5E4\uB354 \uD589 \uC778\uB371\uC2A4 (\uAE30\uBCF8\uAC12: \uCCAB \uBC88\uC9F8 \uD589)\n * @param opt.checkEndColIndex \uB370\uC774\uD130 \uC885\uB8CC\uB97C \uD310\uB2E8\uD560 \uC5F4 \uC778\uB371\uC2A4. \uD574\uB2F9 \uC5F4\uC774 \uBE44\uC5B4\uC788\uC73C\uBA74 \uB370\uC774\uD130 \uB05D\uC73C\uB85C \uAC04\uC8FC\n * @param opt.usableHeaderNameFn \uC0AC\uC6A9\uD560 \uD5E4\uB354\uB97C \uD544\uD130\uB9C1\uD558\uB294 \uD568\uC218\n */\n async getDataTable(opt?: {\n headerRowIndex?: number;\n checkEndColIndex?: number;\n usableHeaderNameFn?: (headerName: string) => boolean;\n }): Promise<Record<string, ExcelValueType>[]> {\n const result: Record<string, ExcelValueType>[] = [];\n const headerMap = new Map<string, number>();\n\n const xml = await this._getWsData();\n const range = xml.range;\n const startRow = opt?.headerRowIndex ?? range.s.r;\n\n for (let c = range.s.c; c <= range.e.c; c++) {\n const headerName = await this.cell(startRow, c).getVal();\n if (typeof headerName === \"string\") {\n if (opt?.usableHeaderNameFn == null || opt.usableHeaderNameFn(headerName)) {\n headerMap.set(headerName, c);\n }\n }\n }\n\n for (let r = startRow + 1; r <= range.e.r; r++) {\n if (opt?.checkEndColIndex !== undefined && (await this.cell(r, opt.checkEndColIndex).getVal()) === undefined) {\n break;\n }\n\n const record: Record<string, ExcelValueType> = {};\n for (const header of headerMap.keys()) {\n const c = headerMap.get(header)!;\n record[header] = await this.cell(r, c).getVal();\n }\n\n result.push(record);\n }\n\n return result;\n }\n\n /**\n * 2\uCC28\uC6D0 \uBC30\uC5F4 \uB370\uC774\uD130\uB97C \uC6CC\uD06C\uC2DC\uD2B8\uC5D0 \uAE30\uB85D\n * @param matrix 2\uCC28\uC6D0 \uBC30\uC5F4 \uB370\uC774\uD130 (\uD589 \uC6B0\uC120, 0\uBC88 \uC778\uB371\uC2A4\uAC00 \uCCAB \uBC88\uC9F8 \uD589)\n */\n async setDataMatrix(matrix: ExcelValueType[][]): Promise<void> {\n for (let r = 0; r < matrix.length; r++) {\n for (let c = 0; c < matrix[r].length; c++) {\n await this.cell(r, c).setVal(matrix[r][c]);\n }\n }\n }\n\n /**\n * \uB808\uCF54\uB4DC \uBC30\uC5F4\uC744 \uC6CC\uD06C\uC2DC\uD2B8\uC5D0 \uAE30\uB85D\n * @param records \uB808\uCF54\uB4DC \uBC30\uC5F4. \uCCAB \uD589\uC5D0 \uD5E4\uB354\uAC00 \uC790\uB3D9 \uC0DD\uC131\uB418\uACE0, \uC774\uD6C4 \uD589\uC5D0 \uB370\uC774\uD130\uAC00 \uAE30\uB85D\uB41C\uB2E4.\n */\n async setRecords(records: Record<string, ExcelValueType>[]): Promise<void> {\n const headers = records\n .flatMap((item) => Object.keys(item))\n .distinct()\n .filter((item) => !strIsNullOrEmpty(item));\n\n for (let c = 0; c < headers.length; c++) {\n await this.cell(0, c).setVal(headers[c]);\n }\n\n for (let r = 1; r < records.length + 1; r++) {\n for (let c = 0; c < headers.length; c++) {\n await this.cell(r, c).setVal(records[r - 1][headers[c]]);\n }\n }\n }\n\n //#endregion\n\n //#region View Methods\n\n /** \uC6CC\uD06C\uC2DC\uD2B8 \uD655\uB300/\uCD95\uC18C \uBE44\uC728 \uC124\uC815 (\uD37C\uC13C\uD2B8) */\n async setZoom(percent: number): Promise<void> {\n const wbXml = await this._getWbData();\n wbXml.initializeView();\n\n const wsXml = await this._getWsData();\n wsXml.setZoom(percent);\n }\n\n /** \uD589/\uC5F4 \uD2C0 \uACE0\uC815 \uC124\uC815 */\n async setFix(point: { r?: number; c?: number }): Promise<void> {\n const wbXml = await this._getWbData();\n wbXml.initializeView();\n\n const wsXml = await this._getWsData();\n wsXml.setFix(point);\n }\n\n //#endregion\n\n //#region Image Methods\n\n /**\n * \uC6CC\uD06C\uC2DC\uD2B8\uC5D0 \uC774\uBBF8\uC9C0\uB97C \uC0BD\uC785.\n * @param opts.bytes \uC774\uBBF8\uC9C0 \uBC14\uC774\uB108\uB9AC \uB370\uC774\uD130\n * @param opts.ext \uC774\uBBF8\uC9C0 \uD655\uC7A5\uC790 (png, jpg \uB4F1)\n * @param opts.from \uC774\uBBF8\uC9C0 \uC2DC\uC791 \uC704\uCE58 (0-based \uD589/\uC5F4 \uC778\uB371\uC2A4, rOff/cOff\uB294 EMU \uB2E8\uC704 \uC624\uD504\uC14B)\n * @param opts.to \uC774\uBBF8\uC9C0 \uB05D \uC704\uCE58 (\uC0DD\uB7B5 \uC2DC from \uC704\uCE58\uC5D0 \uC6D0\uBCF8 \uD06C\uAE30\uB85C \uC0BD\uC785)\n */\n async addImage(opts: {\n bytes: Bytes;\n ext: string;\n from: { r: number; c: number; rOff?: number | string; cOff?: number | string };\n to?: { r: number; c: number; rOff?: number | string; cOff?: number | string };\n }): Promise<void> {\n const mimeType = mime.getType(opts.ext);\n if (mimeType == null) {\n throw new Error(`\uD655\uC7A5\uC790 '${opts.ext}'\uC758 MIME \uD0C0\uC785\uC744 \uD655\uC778\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4`);\n }\n\n // 1. media \uD30C\uC77C\uBA85 \uACB0\uC815 \uBC0F \uC800\uC7A5\n let mediaIndex = 1;\n while ((await this._zipCache.get(`xl/media/image${mediaIndex}.${opts.ext}`)) !== undefined) {\n mediaIndex++;\n }\n const mediaPath = `xl/media/image${mediaIndex}.${opts.ext}`;\n this._zipCache.set(mediaPath, opts.bytes);\n\n // 2. [Content_Types].xml \uAC31\uC2E0\n const typeXml = (await this._zipCache.get(\"[Content_Types].xml\")) as ExcelXmlContentType;\n typeXml.add(`/xl/media/image${mediaIndex}.${opts.ext}`, mimeType);\n\n // 3. worksheet\uC758 \uAE30\uC874 drawing \uD655\uC778\n const wsXml = await this._getWsData();\n const sheetRelsPath = `xl/worksheets/_rels/${this._targetFileName}.rels`;\n let sheetRels = (await this._zipCache.get(sheetRelsPath)) as ExcelXmlRelationship | undefined;\n\n // \uAE30\uC874 drawing \uCC3E\uAE30\n let drawingIndex: number | undefined;\n let drawingPath: string | undefined;\n let drawing: ExcelXmlDrawing | undefined;\n let drawingRels: ExcelXmlRelationship | undefined;\n\n if (sheetRels != null) {\n const existingDrawingRel = sheetRels.data.Relationships.Relationship?.find(\n (r) => r.$.Type === \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing\",\n );\n if (existingDrawingRel != null) {\n // \uAE30\uC874 drawing \uACBD\uB85C\uC5D0\uC11C \uC778\uB371\uC2A4 \uCD94\uCD9C\n const match = existingDrawingRel.$.Target.match(/drawing(\\d+)\\.xml$/);\n if (match != null) {\n drawingIndex = parseInt(match[1], 10);\n drawingPath = `xl/drawings/drawing${drawingIndex}.xml`;\n drawing = (await this._zipCache.get(drawingPath)) as ExcelXmlDrawing | undefined;\n drawingRels = (await this._zipCache.get(`xl/drawings/_rels/drawing${drawingIndex}.xml.rels`)) as\n | ExcelXmlRelationship\n | undefined;\n }\n }\n }\n\n // 4. drawing\uC774 \uC5C6\uC73C\uBA74 \uC0C8\uB85C \uC0DD\uC131\n if (drawingIndex == null || drawingPath == null || drawing == null) {\n drawingIndex = 1;\n while ((await this._zipCache.get(`xl/drawings/drawing${drawingIndex}.xml`)) !== undefined) {\n drawingIndex++;\n }\n drawingPath = `xl/drawings/drawing${drawingIndex}.xml`;\n drawing = new ExcelXmlDrawing();\n\n // [Content_Types].xml\uC5D0 drawing \uD0C0\uC785 \uCD94\uAC00\n typeXml.add(\"/\" + drawingPath, \"application/vnd.openxmlformats-officedocument.drawing+xml\");\n\n // worksheet\uC758 rels\uC5D0 drawing \uCD94\uAC00\n sheetRels = sheetRels ?? new ExcelXmlRelationship();\n const sheetRelNum = sheetRels.addAndGetId(\n `../drawings/drawing${drawingIndex}.xml`,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing\",\n );\n const drawingRelIdOnWorksheet = `rId${sheetRelNum}`;\n this._zipCache.set(sheetRelsPath, sheetRels);\n\n // worksheet XML\uC5D0 drawing \uCD94\uAC00\n wsXml.data.worksheet.$[\"xmlns:r\"] =\n wsXml.data.worksheet.$[\"xmlns:r\"] ?? \"http://schemas.openxmlformats.org/officeDocument/2006/relationships\";\n wsXml.data.worksheet.drawing = wsXml.data.worksheet.drawing ?? [];\n wsXml.data.worksheet.drawing.push({ $: { \"r:id\": drawingRelIdOnWorksheet } });\n this._zipCache.set(`xl/worksheets/${this._targetFileName}`, wsXml);\n }\n\n // 5. drawing rels \uC900\uBE44 (\uC5C6\uC73C\uBA74 \uC0C8\uB85C \uC0DD\uC131)\n drawingRels = drawingRels ?? new ExcelXmlRelationship();\n const mediaFileName = mediaPath.slice(3);\n const drawingTarget = `../${mediaFileName}`;\n const relNum = drawingRels.addAndGetId(\n drawingTarget,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\",\n );\n this._zipCache.set(`xl/drawings/_rels/drawing${drawingIndex}.xml.rels`, drawingRels);\n\n // 6. drawing\uC5D0 \uC774\uBBF8\uC9C0 \uCD94\uAC00\n const blipRelId = `rId${relNum}`;\n drawing.addPicture({\n from: opts.from,\n to: opts.to ?? { r: opts.from.r + 1, c: opts.from.c + 1 },\n blipRelId: blipRelId,\n });\n this._zipCache.set(drawingPath, drawing);\n }\n\n //#endregion\n\n //#region Private Methods\n\n private async _getWsData(): Promise<ExcelXmlWorksheet> {\n return (await this._zipCache.get(`xl/worksheets/${this._targetFileName}`)) as ExcelXmlWorksheet;\n }\n\n private async _getWbData(): Promise<ExcelXmlWorkbook> {\n return (await this._zipCache.get(\"xl/workbook.xml\")) as ExcelXmlWorkbook;\n }\n\n //#endregion\n}\n"],
5
4
  "mappings": "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",
6
5
  "names": []
7
6
  }
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/excel-wrapper.ts"],
4
- "sourcesContent": ["import type { Bytes } from \"@simplysm/core-common\";\nimport { DateOnly, DateTime, numParseFloat, Time } from \"@simplysm/core-common\";\nimport { type z, ZodBoolean, ZodDefault, ZodNullable, ZodNumber, ZodOptional, ZodString } from \"zod\";\nimport { ExcelWorkbook } from \"./excel-workbook\";\nimport type { ExcelValueType } from \"./types\";\n\n/**\n * Zod \uC2A4\uD0A4\uB9C8 \uAE30\uBC18 Excel \uB798\uD37C\n *\n * \uC2A4\uD0A4\uB9C8\uC5D0\uC11C \uD0C0\uC785 \uC815\uBCF4\uB97C \uCD94\uB860\uD558\uC5EC \uD0C0\uC785 \uC548\uC804\uD55C \uC77D\uAE30/\uC4F0\uAE30 \uC81C\uACF5\n */\nexport class ExcelWrapper<T extends z.ZodObject<z.ZodRawShape>> {\n /**\n * @param _schema Zod \uC2A4\uD0A4\uB9C8 (\uB808\uCF54\uB4DC \uAD6C\uC870 \uC815\uC758)\n * @param _displayNameMap \uD544\uB4DC\uBA85-\uD45C\uC2DC\uBA85 \uB9E4\uD551 (Excel \uD5E4\uB354\uB85C \uC0AC\uC6A9)\n */\n constructor(\n private readonly _schema: T,\n private readonly _displayNameMap: Record<keyof z.infer<T>, string>,\n ) {}\n\n /**\n * Excel \uD30C\uC77C \uC77D\uAE30 \u2192 \uB808\uCF54\uB4DC \uBC30\uC5F4\n */\n async read(file: Bytes | Blob, wsNameOrIndex: string | number = 0): Promise<z.infer<T>[]> {\n await using wb = new ExcelWorkbook(file);\n\n const ws = await wb.getWorksheet(wsNameOrIndex);\n const wsName = await ws.getName();\n\n const displayNames = Object.values(this._displayNameMap);\n const rawData = await ws.getDataTable({\n usableHeaderNameFn: (headerName) => displayNames.includes(headerName),\n });\n\n if (rawData.length === 0) {\n throw new Error(`[${wsName}] \uC5D1\uC140\uD30C\uC77C\uC5D0\uC11C \uB370\uC774\uD130\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. (\uAE30\uB300 \uD5E4\uB354: ${displayNames.join(\", \")})`);\n }\n\n const reverseMap = this._getReverseDisplayNameMap();\n const shape = this._schema.shape;\n const result: z.infer<T>[] = [];\n\n for (const row of rawData) {\n const record: Record<string, unknown> = {};\n let hasNonNullValue = false;\n\n for (const [displayName, fieldKey] of reverseMap) {\n const rawValue = row[displayName];\n const fieldSchema = shape[fieldKey] as z.ZodType;\n\n if (rawValue != null && rawValue !== \"\") {\n hasNonNullValue = true;\n }\n\n record[fieldKey] = this._convertValue(rawValue, fieldSchema);\n }\n\n if (!hasNonNullValue) {\n continue;\n }\n\n // Zod \uC2A4\uD0A4\uB9C8\uB85C \uAC80\uC99D\n const parseResult = this._schema.safeParse(record);\n if (!parseResult.success) {\n const errors = parseResult.error.issues.map((issue) => `${issue.path.join(\".\")}: ${issue.message}`).join(\", \");\n throw new Error(`[${wsName}] \uB370\uC774\uD130 \uAC80\uC99D \uC2E4\uD328: ${errors}`);\n }\n\n result.push(parseResult.data);\n }\n\n return result;\n }\n\n /**\n * \uB808\uCF54\uB4DC \uBC30\uC5F4 \u2192 Excel \uC6CC\uD06C\uBD81\n *\n * @remarks\n * \uBC18\uD658\uB41C \uC6CC\uD06C\uBD81\uC740 \uD638\uCD9C\uC790\uAC00 \uB9AC\uC18C\uC2A4\uB97C \uAD00\uB9AC\uD574\uC57C \uD569\uB2C8\uB2E4.\n * `await using`\uC744 \uC0AC\uC6A9\uD558\uAC70\uB098 \uC791\uC5C5 \uC644\uB8CC \uD6C4 `close()`\uB97C \uD638\uCD9C\uD558\uC138\uC694.\n *\n * @example\n * ```typescript\n * await using wb = await wrapper.write(\"Sheet1\", records);\n * const bytes = await wb.getBytes();\n * ```\n */\n async write(wsName: string, records: Partial<z.infer<T>>[]): Promise<ExcelWorkbook> {\n const wb = new ExcelWorkbook();\n const ws = await wb.createWorksheet(wsName);\n\n const keys = Object.keys(this._displayNameMap) as (keyof z.infer<T>)[];\n const headers = keys.map((key) => this._displayNameMap[key]);\n\n // \uD5E4\uB354 \uD589 \uC791\uC131\n for (let c = 0; c < headers.length; c++) {\n await ws.cell(0, c).setVal(headers[c]);\n }\n\n // \uB370\uC774\uD130 \uD589 \uC791\uC131\n for (let r = 0; r < records.length; r++) {\n for (let c = 0; c < keys.length; c++) {\n const key = keys[c];\n const value = records[r][key] as ExcelValueType;\n await ws.cell(r + 1, c).setVal(value);\n }\n }\n\n // \uD14C\uB450\uB9AC \uC2A4\uD0C0\uC77C \uC801\uC6A9\n for (let r = 0; r < records.length + 1; r++) {\n for (let c = 0; c < keys.length; c++) {\n await ws.cell(r, c).setStyle({\n border: [\"left\", \"right\", \"top\", \"bottom\"],\n });\n }\n }\n\n // \uD544\uC218 \uD544\uB4DC \uD5E4\uB354 \uAC15\uC870 (\uB178\uB780\uC0C9)\n const shape = this._schema.shape;\n for (let c = 0; c < keys.length; c++) {\n const fieldKey = keys[c] as string;\n const fieldSchema = shape[fieldKey] as z.ZodType;\n\n if (this._isRequired(fieldSchema) && !this._isBoolean(fieldSchema)) {\n await ws.cell(0, c).setStyle({\n background: \"00FFFF00\",\n });\n }\n }\n\n // \uBDF0 \uC124\uC815\n await ws.setZoom(85);\n await ws.setFix({ r: 0 });\n\n return wb;\n }\n\n //#region Private Methods\n\n private _getReverseDisplayNameMap(): Map<string, string> {\n const map = new Map<string, string>();\n for (const [fieldKey, displayName] of Object.entries(this._displayNameMap)) {\n map.set(displayName, fieldKey);\n }\n return map;\n }\n\n private _convertValue(rawValue: ExcelValueType, fieldSchema: z.ZodType): unknown {\n if (rawValue == null || rawValue === \"\") {\n return this._getDefaultForSchema(fieldSchema);\n }\n\n const innerSchema = this._unwrapSchema(fieldSchema);\n\n if (innerSchema instanceof ZodString) {\n return typeof rawValue === \"string\" ? rawValue : String(rawValue);\n }\n\n if (innerSchema instanceof ZodNumber) {\n if (typeof rawValue === \"number\") return rawValue;\n return numParseFloat(String(rawValue));\n }\n\n if (innerSchema instanceof ZodBoolean) {\n if (typeof rawValue === \"boolean\") return rawValue;\n if (rawValue === \"1\" || rawValue === \"true\") return true;\n if (rawValue === \"0\" || rawValue === \"false\") return false;\n return Boolean(rawValue);\n }\n\n // DateOnly, DateTime, Time\uC740 instanceof\uB85C \uCC98\uB9AC\n if (rawValue instanceof DateOnly || rawValue instanceof DateTime || rawValue instanceof Time) {\n return rawValue;\n }\n\n return rawValue;\n }\n\n private _unwrapSchema(schema: z.ZodType): z.ZodType {\n if (schema instanceof ZodOptional || schema instanceof ZodNullable) {\n return this._unwrapSchema(schema.unwrap() as z.ZodType);\n }\n if (schema instanceof ZodDefault) {\n return this._unwrapSchema(schema.removeDefault() as z.ZodType);\n }\n return schema;\n }\n\n private _getDefaultForSchema(schema: z.ZodType): unknown {\n if (schema instanceof ZodDefault) {\n // ZodDefault.parse(undefined)\uB294 \uAE30\uBCF8\uAC12\uC744 \uBC18\uD658\uD568\n return schema.parse(undefined);\n }\n\n if (schema instanceof ZodOptional || schema instanceof ZodNullable) {\n return undefined;\n }\n\n // Boolean \uD544\uC218 \uD544\uB4DC\uC758 \uAE30\uBCF8\uAC12\uC740 false\n const innerSchema = this._unwrapSchema(schema);\n if (innerSchema instanceof ZodBoolean) {\n return false;\n }\n\n return undefined;\n }\n\n private _isRequired(schema: z.ZodType): boolean {\n return !(schema instanceof ZodOptional) && !(schema instanceof ZodNullable) && !(schema instanceof ZodDefault);\n }\n\n private _isBoolean(schema: z.ZodType): boolean {\n const innerSchema = this._unwrapSchema(schema);\n return innerSchema instanceof ZodBoolean;\n }\n\n //#endregion\n}\n"],
5
4
  "mappings": "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",
6
5
  "names": []
7
6
  }
package/dist/index.js.map CHANGED
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts"],
4
- "sourcesContent": ["// \uD0C0\uC785 \uBC0F \uC720\uD2F8\uB9AC\uD2F0\nexport * from \"./types\";\nexport * from \"./utils/excel-utils\";\n\n// \uD575\uC2EC \uD074\uB798\uC2A4\nexport * from \"./excel-cell\";\nexport * from \"./excel-row\";\nexport * from \"./excel-col\";\nexport * from \"./excel-worksheet\";\nexport * from \"./excel-workbook\";\n\n// \uB798\uD37C \uD074\uB798\uC2A4\nexport * from \"./excel-wrapper\";\n"],
5
4
  "mappings": "AACA,cAAc;AACd,cAAc;AAGd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAGd,cAAc;",
6
5
  "names": []
7
6
  }
package/dist/types.js.map CHANGED
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": [],
4
- "sourcesContent": [],
5
4
  "mappings": "",
6
5
  "names": []
7
6
  }
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/utils/excel-utils.ts"],
4
- "sourcesContent": ["import { numParseInt } from \"@simplysm/core-common\";\nimport type { ExcelAddressPoint, ExcelAddressRangePoint, ExcelNumberFormat } from \"../types\";\n\n/**\n * Excel \uAD00\uB828 \uC720\uD2F8\uB9AC\uD2F0 \uD568\uC218 \uBAA8\uC74C.\n * \uC140 \uC8FC\uC18C \uBCC0\uD658, \uB0A0\uC9DC/\uC22B\uC790 \uBCC0\uD658, \uC22B\uC790 \uD615\uC2DD \uCC98\uB9AC \uB4F1\uC758 \uAE30\uB2A5\uC744 \uC81C\uACF5\uD55C\uB2E4.\n */\nexport class ExcelUtils {\n /** \uC140 \uC88C\uD45C\uB97C \"A1\" \uD615\uC2DD \uBB38\uC790\uC5F4\uB85C \uBCC0\uD658 */\n static stringifyAddr(point: ExcelAddressPoint): string {\n const rowStr = this.stringifyRowAddr(point.r);\n const colStr = this.stringifyColAddr(point.c);\n return `${colStr}${rowStr}`;\n }\n\n /** \uD589 \uC778\uB371\uC2A4(0-based)\uB97C \uD589 \uC8FC\uC18C \uBB38\uC790\uC5F4\uB85C \uBCC0\uD658 (\uC608: 0 -> \"1\") */\n static stringifyRowAddr(r: number): string {\n return (r + 1).toString();\n }\n\n /** \uC5F4 \uC778\uB371\uC2A4(0-based)\uB97C \uC5F4 \uC8FC\uC18C \uBB38\uC790\uC5F4\uB85C \uBCC0\uD658 (\uC608: 0 -> \"A\", 26 -> \"AA\") */\n static stringifyColAddr(c: number): string {\n if (c < 0 || c > 16383) {\n throw new Error(`\uC5F4 \uC778\uB371\uC2A4\uB294 0~16383 \uBC94\uC704\uC5EC\uC57C \uD569\uB2C8\uB2E4: ${c}`);\n }\n\n let remained = c;\n let result = String.fromCharCode((remained % 26) + 65);\n remained = Math.floor(remained / 26);\n while (remained !== 0) {\n result = String.fromCharCode((remained % 26) + 64) + result;\n remained = Math.floor(remained / 26);\n }\n return result;\n }\n\n /** \uC140 \uC8FC\uC18C\uC5D0\uC11C \uD589 \uC778\uB371\uC2A4 \uCD94\uCD9C (\uC608: \"A3\" -> 2) */\n static parseRowAddrCode(addrCode: string): number {\n const rowAddrCode = /\\d*$/.exec(addrCode)?.[0] ?? \"\";\n const parsed = numParseInt(rowAddrCode);\n if (parsed == null) {\n throw new Error(`\uC798\uBABB\uB41C \uD589 \uC8FC\uC18C \uCF54\uB4DC: ${addrCode}`);\n }\n return parsed - 1;\n }\n\n /** \uC140 \uC8FC\uC18C\uC5D0\uC11C \uC5F4 \uC778\uB371\uC2A4 \uCD94\uCD9C (\uC608: \"B3\" -> 1) */\n static parseColAddrCode(addrCode: string): number {\n const colAddrCode = /^[a-zA-Z]*/.exec(addrCode)?.[0] ?? \"\";\n\n let result = 0;\n const revAddr = Array.from(colAddrCode).reverse().join(\"\");\n for (let i = 0; i < revAddr.length; i++) {\n const col = revAddr.charCodeAt(i) - (i === 0 ? 65 : 64);\n result += col * 26 ** i;\n }\n return result;\n }\n\n /** \uC140 \uC8FC\uC18C\uB97C \uC88C\uD45C\uB85C \uBCC0\uD658 (\uC608: \"B3\" -> {r: 2, c: 1}) */\n static parseCellAddrCode(addr: string): ExcelAddressPoint {\n return {\n r: ExcelUtils.parseRowAddrCode(addr),\n c: ExcelUtils.parseColAddrCode(addr),\n };\n }\n\n /** \uBC94\uC704 \uC8FC\uC18C\uB97C \uC88C\uD45C\uB85C \uBCC0\uD658 (\uC608: \"A1:C3\" -> {s: {r:0,c:0}, e: {r:2,c:2}}) */\n static parseRangeAddrCode(rangeAddr: string): ExcelAddressRangePoint {\n const parts = rangeAddr.split(\":\");\n return {\n s: ExcelUtils.parseCellAddrCode(parts[0]),\n e: ExcelUtils.parseCellAddrCode(parts[1] ?? parts[0]),\n };\n }\n\n /** \uBC94\uC704 \uC88C\uD45C\uB97C \uC8FC\uC18C \uBB38\uC790\uC5F4\uB85C \uBCC0\uD658 */\n static stringifyRangeAddr(point: ExcelAddressRangePoint): string {\n const sAddr = this.stringifyAddr(point.s);\n const eAddr = this.stringifyAddr(point.e);\n\n if (sAddr === eAddr) {\n return sAddr;\n } else {\n return sAddr + \":\" + eAddr;\n }\n }\n\n /**\n * JavaScript \uD0C0\uC784\uC2A4\uD0EC\uD504(ms)\uB97C Excel \uB0A0\uC9DC \uC22B\uC790\uB85C \uBCC0\uD658.\n * Excel\uC740 1900-01-01\uC744 1\uB85C \uACC4\uC0B0\uD55C\uB2E4 (1899-12-30\uC774 \uB0A0\uC9DC 0).\n */\n static convertTimeTickToNumber(tick: number): number {\n const currDate = new Date(tick);\n currDate.setMinutes(currDate.getMinutes() - currDate.getTimezoneOffset());\n const excelBaseDateNumberUtc = Date.UTC(1899, 11, 31);\n const inputExcelDateNumberUtc = currDate.getTime() - excelBaseDateNumberUtc;\n return inputExcelDateNumberUtc / (24 * 60 * 60 * 1000) + 1;\n }\n\n /**\n * Excel \uB0A0\uC9DC \uC22B\uC790\uB97C JavaScript \uD0C0\uC784\uC2A4\uD0EC\uD504(ms)\uB85C \uBCC0\uD658.\n * Excel\uC740 1900-01-01\uC744 1\uB85C \uACC4\uC0B0\uD55C\uB2E4 (1899-12-30\uC774 \uB0A0\uC9DC 0).\n */\n static convertNumberToTimeTick(num: number): number {\n const excelBaseDateNumberUtc = Date.UTC(1899, 11, 31);\n const excelDateNumberUtc = (num - 1) * 24 * 60 * 60 * 1000;\n const dateNumberUtc = excelBaseDateNumberUtc + excelDateNumberUtc;\n const date = new Date(dateNumberUtc);\n date.setMinutes(date.getMinutes() + date.getTimezoneOffset());\n return date.getTime();\n }\n\n /** \uC22B\uC790 \uD615\uC2DD \uCF54\uB4DC\uB97C \uD615\uC2DD \uC774\uB984\uC73C\uB85C \uBCC0\uD658 */\n static convertNumFmtCodeToName(numFmtCode: string): ExcelNumberFormat {\n if (numFmtCode === \"General\") {\n return \"number\";\n }\n\n const hasDate = /yy/i.test(numFmtCode) || /dd/i.test(numFmtCode) || /mm/i.test(numFmtCode);\n const hasTime = /hh/i.test(numFmtCode) || /ss/i.test(numFmtCode);\n\n if (hasDate && hasTime) {\n return \"DateTime\"; // \uB0A0\uC9DC+\uC2DC\uAC04 = DateTime\n } else if (hasDate) {\n return \"DateOnly\"; // \uB0A0\uC9DC\uB9CC = DateOnly\n } else if (hasTime) {\n return \"Time\"; // \uC2DC\uAC04\uB9CC = Time\n }\n // \uC22B\uC790 \uD615\uC2DD \uD328\uD134: 0, #, \uC18C\uC218\uC810, \uCC9C\uB2E8\uC704 \uAD6C\uBD84\uC790, \uC74C\uC218 \uAD6C\uBD84\uC790, \uAD04\uD638, \uD1B5\uD654, \uACF5\uBC31, \uC9C0\uC218, \uBC31\uBD84\uC728 \uB4F1\n // \"[\uC870\uAC74\uBD80 \uC11C\uC2DD]\uC2E4\uC81C\uD615\uC2DD\" \uAD6C\uC870\uC5D0\uC11C \uC2E4\uC81C\uD615\uC2DD \uBD80\uBD84\uB9CC \uAC80\uC0AC (split(\"]\").at(-1))\n else if (/^[0.#,_;()\\-\\\\$ @*?\"E%+]*$/.test(numFmtCode.split(\"]\").at(-1) ?? \"\")) {\n return \"number\";\n } else if ((numFmtCode.split(\"]\").at(-1) ?? \"\").includes(\"#,0\")) {\n return \"number\";\n } else {\n throw new Error(`[numFmtCode: ${numFmtCode}]\uC5D0 \uB300\uD55C \uD615\uC2DD\uC744 \uC54C \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.`);\n }\n }\n\n /**\n * \uC22B\uC790 \uD615\uC2DD ID\uB97C \uD615\uC2DD \uC774\uB984\uC73C\uB85C \uBCC0\uD658\n *\n * @remarks\n * Excel \uB0B4\uC7A5 \uD615\uC2DD ID \uBC94\uC704:\n * - 0~13, 37~40, 48: \uC22B\uC790/\uC77C\uBC18/\uD1B5\uD654/\uBC31\uBD84\uC728 \uD615\uC2DD\n * - 14~17, 27~31, 34~36, 50~58: \uB0A0\uC9DC \uD615\uC2DD (\uC9C0\uC5ED\uD654 \uD3EC\uD568)\n * - 22: \uB0A0\uC9DC+\uC2DC\uAC04 \uD615\uC2DD\n * - 18~21, 32~33, 45~47: \uC2DC\uAC04 \uD615\uC2DD\n * - 49: \uD14D\uC2A4\uD2B8 \uD615\uC2DD\n */\n static convertNumFmtIdToName(numFmtId: number): ExcelNumberFormat {\n // \uC22B\uC790/\uC77C\uBC18/\uD1B5\uD654/\uBC31\uBD84\uC728 \uD615\uC2DD\n if (numFmtId <= 13 || (numFmtId >= 37 && numFmtId <= 40) || numFmtId === 48) {\n return \"number\";\n }\n // \uB0A0\uC9DC \uD615\uC2DD (\uC9C0\uC5ED\uD654 \uD3EC\uD568)\n else if (\n (numFmtId >= 14 && numFmtId <= 17) ||\n (numFmtId >= 27 && numFmtId <= 31) ||\n (numFmtId >= 34 && numFmtId <= 36) ||\n (numFmtId >= 50 && numFmtId <= 58)\n ) {\n return \"DateOnly\";\n }\n // \uB0A0\uC9DC+\uC2DC\uAC04 \uD615\uC2DD\n else if (numFmtId === 22) {\n return \"DateTime\";\n }\n // \uC2DC\uAC04 \uD615\uC2DD\n else if (\n (numFmtId >= 18 && numFmtId <= 21) ||\n (numFmtId >= 32 && numFmtId <= 33) ||\n (numFmtId >= 45 && numFmtId <= 47)\n ) {\n return \"Time\";\n }\n // \uD14D\uC2A4\uD2B8 \uD615\uC2DD\n else if (numFmtId === 49) {\n return \"string\";\n } else {\n throw new Error(`[numFmtId: ${numFmtId}]\uC5D0 \uB300\uD55C \uD615\uC2DD\uC744 \uC54C \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.`);\n }\n }\n\n /** \uC22B\uC790 \uD615\uC2DD \uC774\uB984\uC744 \uD615\uC2DD ID\uB85C \uBCC0\uD658 */\n static convertNumFmtNameToId(numFmtName: ExcelNumberFormat): number {\n if (numFmtName === \"number\") {\n return 0;\n } else if (numFmtName === \"DateOnly\") {\n return 14;\n } else if (numFmtName === \"DateTime\") {\n return 22;\n } else if (numFmtName === \"Time\") {\n return 18;\n } else {\n // \uB9C8\uC9C0\uB9C9 \uCF00\uC774\uC2A4: \"string\" (TypeScript\uAC00 \uD0C0\uC785 \uC881\uD788\uAE30\uB97C \uD1B5\uD574 \uC790\uB3D9\uC73C\uB85C \uD655\uC778)\n return 49;\n }\n }\n}\n"],
5
4
  "mappings": "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",
6
5
  "names": []
7
6
  }
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/utils/zip-cache.ts"],
4
- "sourcesContent": ["import type { Bytes } from \"@simplysm/core-common\";\nimport { ZipArchive, xmlStringify, xmlParse } from \"@simplysm/core-common\";\nimport type {\n ExcelXml,\n ExcelXmlContentTypeData,\n ExcelXmlDrawingData,\n ExcelXmlRelationshipData,\n ExcelXmlSharedStringData,\n ExcelXmlStyleData,\n ExcelXmlWorkbookData,\n ExcelXmlWorksheetData,\n} from \"../types\";\nimport { ExcelXmlContentType } from \"../xml/excel-xml-content-type\";\nimport { ExcelXmlDrawing } from \"../xml/excel-xml-drawing\";\nimport { ExcelXmlRelationship } from \"../xml/excel-xml-relationship\";\nimport { ExcelXmlSharedString } from \"../xml/excel-xml-shared-string\";\nimport { ExcelXmlStyle } from \"../xml/excel-xml-style\";\nimport { ExcelXmlUnknown } from \"../xml/excel-xml-unknown\";\nimport { ExcelXmlWorkbook } from \"../xml/excel-xml-workbook\";\nimport { ExcelXmlWorksheet } from \"../xml/excel-xml-worksheet\";\n\n/**\n * Excel ZIP \uC544\uCE74\uC774\uBE0C\uC758 \uD30C\uC77C \uCE90\uC2DC\uB97C \uAD00\uB9AC\uD558\uB294 \uD074\uB798\uC2A4.\n * XML \uD30C\uC77C\uC740 \uD30C\uC2F1\uD558\uC5EC ExcelXml \uAC1D\uCCB4\uB85C, \uADF8 \uC678 \uD30C\uC77C\uC740 \uBC14\uC774\uD2B8 \uBC30\uC5F4\uB85C \uCE90\uC2F1\uD55C\uB2E4.\n *\n * @remarks\n * ## Lazy Loading \uCE90\uC2DC \uC804\uB7B5\n *\n * - \uD30C\uC77C\uC740 \uCCAB \uC811\uADFC \uC2DC\uC5D0\uB9CC ZIP\uC5D0\uC11C \uC77D\uACE0 \uD30C\uC2F1\uD55C\uB2E4\n * - \uC774\uD6C4 \uC811\uADFC\uC740 \uCE90\uC2DC\uB41C \uAC1D\uCCB4\uB97C \uBC18\uD658\uD55C\uB2E4\n * - \uB300\uC6A9\uB7C9 Excel \uD30C\uC77C\uC5D0\uC11C \uD544\uC694\uD55C \uBD80\uBD84\uB9CC \uB85C\uB4DC\uD558\uC5EC \uBA54\uBAA8\uB9AC \uD6A8\uC728\uC131\uC744 \uB192\uC778\uB2E4\n */\nexport class ZipCache {\n private readonly _cache = new Map<string, ExcelXml | Bytes | undefined>();\n private readonly _zip: ZipArchive;\n\n constructor(arg?: Blob | Bytes) {\n this._zip = new ZipArchive(arg);\n }\n\n async get(filePath: string): Promise<ExcelXml | Bytes | undefined> {\n if (this._cache.has(filePath)) {\n return this._cache.get(filePath);\n }\n\n const fileData = await this._zip.get(filePath);\n if (fileData == null) {\n this._cache.set(filePath, undefined);\n return undefined;\n }\n\n if (filePath.endsWith(\".xml\") || filePath.endsWith(\".rels\")) {\n const fileText = new TextDecoder().decode(fileData);\n const xml = xmlParse(fileText, { stripTagPrefix: true });\n if (filePath.endsWith(\".rels\")) {\n this._cache.set(filePath, new ExcelXmlRelationship(xml as ExcelXmlRelationshipData));\n } else if (filePath === \"[Content_Types].xml\") {\n this._cache.set(filePath, new ExcelXmlContentType(xml as ExcelXmlContentTypeData));\n } else if (filePath === \"xl/workbook.xml\") {\n this._cache.set(filePath, new ExcelXmlWorkbook(xml as ExcelXmlWorkbookData));\n } else if (filePath.startsWith(\"xl/worksheets/sheet\") && filePath.endsWith(\".xml\")) {\n this._cache.set(filePath, new ExcelXmlWorksheet(xml as ExcelXmlWorksheetData));\n } else if (filePath.startsWith(\"xl/drawings/drawing\") && filePath.endsWith(\".xml\")) {\n this._cache.set(filePath, new ExcelXmlDrawing(xml as ExcelXmlDrawingData));\n } else if (filePath === \"xl/sharedStrings.xml\") {\n this._cache.set(filePath, new ExcelXmlSharedString(xml as ExcelXmlSharedStringData));\n } else if (filePath === \"xl/styles.xml\") {\n this._cache.set(filePath, new ExcelXmlStyle(xml as ExcelXmlStyleData));\n } else {\n this._cache.set(filePath, new ExcelXmlUnknown(xml as Record<string, unknown>));\n }\n } else {\n this._cache.set(filePath, fileData);\n }\n\n return this._cache.get(filePath);\n }\n\n set(filePath: string, content: ExcelXml | Bytes): void {\n this._cache.set(filePath, content);\n }\n\n async toBytes(): Promise<Bytes> {\n for (const filePath of this._cache.keys()) {\n const content = this._cache.get(filePath);\n if (content == null) continue;\n\n if (\"cleanup\" in content) {\n content.cleanup();\n this._zip.write(filePath, new TextEncoder().encode(xmlStringify(content.data)));\n } else {\n this._zip.write(filePath, content);\n }\n }\n\n return this._zip.compress();\n }\n\n async close(): Promise<void> {\n await this._zip.close();\n this._cache.clear();\n }\n}\n"],
5
4
  "mappings": "AACA,SAAS,YAAY,cAAc,gBAAgB;AAWnD,SAAS,2BAA2B;AACpC,SAAS,uBAAuB;AAChC,SAAS,4BAA4B;AACrC,SAAS,4BAA4B;AACrC,SAAS,qBAAqB;AAC9B,SAAS,uBAAuB;AAChC,SAAS,wBAAwB;AACjC,SAAS,yBAAyB;AAa3B,MAAM,SAAS;AAAA,EACH,SAAS,oBAAI,IAA0C;AAAA,EACvD;AAAA,EAEjB,YAAY,KAAoB;AAC9B,SAAK,OAAO,IAAI,WAAW,GAAG;AAAA,EAChC;AAAA,EAEA,MAAM,IAAI,UAAyD;AACjE,QAAI,KAAK,OAAO,IAAI,QAAQ,GAAG;AAC7B,aAAO,KAAK,OAAO,IAAI,QAAQ;AAAA,IACjC;AAEA,UAAM,WAAW,MAAM,KAAK,KAAK,IAAI,QAAQ;AAC7C,QAAI,YAAY,MAAM;AACpB,WAAK,OAAO,IAAI,UAAU,MAAS;AACnC,aAAO;AAAA,IACT;AAEA,QAAI,SAAS,SAAS,MAAM,KAAK,SAAS,SAAS,OAAO,GAAG;AAC3D,YAAM,WAAW,IAAI,YAAY,EAAE,OAAO,QAAQ;AAClD,YAAM,MAAM,SAAS,UAAU,EAAE,gBAAgB,KAAK,CAAC;AACvD,UAAI,SAAS,SAAS,OAAO,GAAG;AAC9B,aAAK,OAAO,IAAI,UAAU,IAAI,qBAAqB,GAA+B,CAAC;AAAA,MACrF,WAAW,aAAa,uBAAuB;AAC7C,aAAK,OAAO,IAAI,UAAU,IAAI,oBAAoB,GAA8B,CAAC;AAAA,MACnF,WAAW,aAAa,mBAAmB;AACzC,aAAK,OAAO,IAAI,UAAU,IAAI,iBAAiB,GAA2B,CAAC;AAAA,MAC7E,WAAW,SAAS,WAAW,qBAAqB,KAAK,SAAS,SAAS,MAAM,GAAG;AAClF,aAAK,OAAO,IAAI,UAAU,IAAI,kBAAkB,GAA4B,CAAC;AAAA,MAC/E,WAAW,SAAS,WAAW,qBAAqB,KAAK,SAAS,SAAS,MAAM,GAAG;AAClF,aAAK,OAAO,IAAI,UAAU,IAAI,gBAAgB,GAA0B,CAAC;AAAA,MAC3E,WAAW,aAAa,wBAAwB;AAC9C,aAAK,OAAO,IAAI,UAAU,IAAI,qBAAqB,GAA+B,CAAC;AAAA,MACrF,WAAW,aAAa,iBAAiB;AACvC,aAAK,OAAO,IAAI,UAAU,IAAI,cAAc,GAAwB,CAAC;AAAA,MACvE,OAAO;AACL,aAAK,OAAO,IAAI,UAAU,IAAI,gBAAgB,GAA8B,CAAC;AAAA,MAC/E;AAAA,IACF,OAAO;AACL,WAAK,OAAO,IAAI,UAAU,QAAQ;AAAA,IACpC;AAEA,WAAO,KAAK,OAAO,IAAI,QAAQ;AAAA,EACjC;AAAA,EAEA,IAAI,UAAkB,SAAiC;AACrD,SAAK,OAAO,IAAI,UAAU,OAAO;AAAA,EACnC;AAAA,EAEA,MAAM,UAA0B;AAC9B,eAAW,YAAY,KAAK,OAAO,KAAK,GAAG;AACzC,YAAM,UAAU,KAAK,OAAO,IAAI,QAAQ;AACxC,UAAI,WAAW,KAAM;AAErB,UAAI,aAAa,SAAS;AACxB,gBAAQ,QAAQ;AAChB,aAAK,KAAK,MAAM,UAAU,IAAI,YAAY,EAAE,OAAO,aAAa,QAAQ,IAAI,CAAC,CAAC;AAAA,MAChF,OAAO;AACL,aAAK,KAAK,MAAM,UAAU,OAAO;AAAA,MACnC;AAAA,IACF;AAEA,WAAO,KAAK,KAAK,SAAS;AAAA,EAC5B;AAAA,EAEA,MAAM,QAAuB;AAC3B,UAAM,KAAK,KAAK,MAAM;AACtB,SAAK,OAAO,MAAM;AAAA,EACpB;AACF;",
6
5
  "names": []
7
6
  }
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/xml/excel-xml-content-type.ts"],
4
- "sourcesContent": ["import type { ExcelXml, ExcelXmlContentTypeData } from \"../types\";\n\n/**\n * [Content_Types].xml \uD30C\uC77C\uC744 \uAD00\uB9AC\uD558\uB294 \uD074\uB798\uC2A4.\n * \uD30C\uC77C\uBCC4 MIME \uD0C0\uC785 \uC815\uBCF4\uB97C \uAD00\uB9AC\uD55C\uB2E4.\n */\nexport class ExcelXmlContentType implements ExcelXml {\n data: ExcelXmlContentTypeData;\n\n constructor(data?: ExcelXmlContentTypeData) {\n if (data == null) {\n this.data = {\n Types: {\n $: {\n xmlns: \"http://schemas.openxmlformats.org/package/2006/content-types\",\n },\n Default: [\n {\n $: {\n Extension: \"rels\",\n ContentType: \"application/vnd.openxmlformats-package.relationships+xml\",\n },\n },\n {\n $: {\n Extension: \"xml\",\n ContentType: \"application/xml\",\n },\n },\n ],\n Override: [\n {\n $: {\n PartName: \"/xl/workbook.xml\",\n ContentType: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\",\n },\n },\n ],\n },\n };\n } else {\n this.data = data;\n }\n }\n\n add(partName: string, contentType: string): this {\n // \uC911\uBCF5 \uCCB4\uD06C\n const exists = this.data.Types.Override.some((item) => item.$.PartName === partName);\n if (exists) {\n return this;\n }\n\n this.data.Types.Override.push({\n $: {\n PartName: partName,\n ContentType: contentType,\n },\n });\n\n return this;\n }\n\n cleanup(): void {}\n}\n"],
5
4
  "mappings": "AAMO,MAAM,oBAAwC;AAAA,EACnD;AAAA,EAEA,YAAY,MAAgC;AAC1C,QAAI,QAAQ,MAAM;AAChB,WAAK,OAAO;AAAA,QACV,OAAO;AAAA,UACL,GAAG;AAAA,YACD,OAAO;AAAA,UACT;AAAA,UACA,SAAS;AAAA,YACP;AAAA,cACE,GAAG;AAAA,gBACD,WAAW;AAAA,gBACX,aAAa;AAAA,cACf;AAAA,YACF;AAAA,YACA;AAAA,cACE,GAAG;AAAA,gBACD,WAAW;AAAA,gBACX,aAAa;AAAA,cACf;AAAA,YACF;AAAA,UACF;AAAA,UACA,UAAU;AAAA,YACR;AAAA,cACE,GAAG;AAAA,gBACD,UAAU;AAAA,gBACV,aAAa;AAAA,cACf;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK,OAAO;AAAA,IACd;AAAA,EACF;AAAA,EAEA,IAAI,UAAkB,aAA2B;AAE/C,UAAM,SAAS,KAAK,KAAK,MAAM,SAAS,KAAK,CAAC,SAAS,KAAK,EAAE,aAAa,QAAQ;AACnF,QAAI,QAAQ;AACV,aAAO;AAAA,IACT;AAEA,SAAK,KAAK,MAAM,SAAS,KAAK;AAAA,MAC5B,GAAG;AAAA,QACD,UAAU;AAAA,QACV,aAAa;AAAA,MACf;AAAA,IACF,CAAC;AAED,WAAO;AAAA,EACT;AAAA,EAEA,UAAgB;AAAA,EAAC;AACnB;",
6
5
  "names": []
7
6
  }
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/xml/excel-xml-drawing.ts"],
4
- "sourcesContent": ["import type { ExcelXml, ExcelXmlDrawingData } from \"../types\";\n\n/**\n * xl/drawings/drawing*.xml \uD30C\uC77C\uC744 \uAD00\uB9AC\uD558\uB294 \uD074\uB798\uC2A4.\n * \uC774\uBBF8\uC9C0 \uC0BD\uC785 \uC2DC \uC704\uCE58 \uBC0F \uCC38\uC870 \uC815\uBCF4\uB97C \uCC98\uB9AC\uD55C\uB2E4.\n */\nexport class ExcelXmlDrawing implements ExcelXml {\n data: ExcelXmlDrawingData;\n\n constructor(data?: ExcelXmlDrawingData) {\n if (data == null) {\n this.data = {\n wsDr: {\n $: {\n \"xmlns\": \"http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing\",\n \"xmlns:a\": \"http://schemas.openxmlformats.org/drawingml/2006/main\",\n \"xmlns:r\": \"http://schemas.openxmlformats.org/officeDocument/2006/relationships\",\n },\n twoCellAnchor: [],\n },\n };\n } else {\n this.data = data;\n }\n }\n\n addPicture(opts: {\n from: { r: number; c: number; rOff?: number | string; cOff?: number | string };\n to: { r: number; c: number; rOff?: number | string; cOff?: number | string };\n blipRelId: string;\n }): void {\n this.data.wsDr.twoCellAnchor = this.data.wsDr.twoCellAnchor ?? [];\n\n const anchors = this.data.wsDr.twoCellAnchor;\n const picId = anchors.length + 1;\n const name = `Picture ${picId}`;\n\n this.data.wsDr.twoCellAnchor.push({\n from: [\n {\n col: [opts.from.c.toString()],\n colOff: [opts.from.cOff != null ? opts.from.cOff.toString() : \"0\"],\n row: [opts.from.r.toString()],\n rowOff: [opts.from.rOff != null ? opts.from.rOff.toString() : \"0\"],\n },\n ],\n to: [\n {\n col: [opts.to.c.toString()],\n colOff: [opts.to.cOff != null ? opts.to.cOff.toString() : \"0\"],\n row: [opts.to.r.toString()],\n rowOff: [opts.to.rOff != null ? opts.to.rOff.toString() : \"0\"],\n },\n ],\n pic: [\n {\n nvPicPr: [\n {\n cNvPr: [{ $: { id: picId.toString(), name } }],\n cNvPicPr: [{ \"a:picLocks\": [{ $: { noChangeAspect: \"1\" } }] }],\n },\n ],\n blipFill: [\n {\n \"a:blip\": [{ $: { \"r:embed\": opts.blipRelId } }],\n \"a:stretch\": [{ \"a:fillRect\": [] }],\n },\n ],\n spPr: [\n {\n \"a:xfrm\": [\n {\n \"a:off\": [{ $: { x: \"0\", y: \"0\" } }],\n \"a:ext\": [{ $: { cx: \"0\", cy: \"0\" } }],\n },\n ],\n \"a:prstGeom\": [{ \"$\": { prst: \"rect\" }, \"a:avLst\": [] }],\n },\n ],\n },\n ],\n clientData: [{}],\n });\n }\n\n cleanup(): void {}\n}\n"],
5
4
  "mappings": "AAMO,MAAM,gBAAoC;AAAA,EAC/C;AAAA,EAEA,YAAY,MAA4B;AACtC,QAAI,QAAQ,MAAM;AAChB,WAAK,OAAO;AAAA,QACV,MAAM;AAAA,UACJ,GAAG;AAAA,YACD,SAAS;AAAA,YACT,WAAW;AAAA,YACX,WAAW;AAAA,UACb;AAAA,UACA,eAAe,CAAC;AAAA,QAClB;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK,OAAO;AAAA,IACd;AAAA,EACF;AAAA,EAEA,WAAW,MAIF;AACP,SAAK,KAAK,KAAK,gBAAgB,KAAK,KAAK,KAAK,iBAAiB,CAAC;AAEhE,UAAM,UAAU,KAAK,KAAK,KAAK;AAC/B,UAAM,QAAQ,QAAQ,SAAS;AAC/B,UAAM,OAAO,WAAW,KAAK;AAE7B,SAAK,KAAK,KAAK,cAAc,KAAK;AAAA,MAChC,MAAM;AAAA,QACJ;AAAA,UACE,KAAK,CAAC,KAAK,KAAK,EAAE,SAAS,CAAC;AAAA,UAC5B,QAAQ,CAAC,KAAK,KAAK,QAAQ,OAAO,KAAK,KAAK,KAAK,SAAS,IAAI,GAAG;AAAA,UACjE,KAAK,CAAC,KAAK,KAAK,EAAE,SAAS,CAAC;AAAA,UAC5B,QAAQ,CAAC,KAAK,KAAK,QAAQ,OAAO,KAAK,KAAK,KAAK,SAAS,IAAI,GAAG;AAAA,QACnE;AAAA,MACF;AAAA,MACA,IAAI;AAAA,QACF;AAAA,UACE,KAAK,CAAC,KAAK,GAAG,EAAE,SAAS,CAAC;AAAA,UAC1B,QAAQ,CAAC,KAAK,GAAG,QAAQ,OAAO,KAAK,GAAG,KAAK,SAAS,IAAI,GAAG;AAAA,UAC7D,KAAK,CAAC,KAAK,GAAG,EAAE,SAAS,CAAC;AAAA,UAC1B,QAAQ,CAAC,KAAK,GAAG,QAAQ,OAAO,KAAK,GAAG,KAAK,SAAS,IAAI,GAAG;AAAA,QAC/D;AAAA,MACF;AAAA,MACA,KAAK;AAAA,QACH;AAAA,UACE,SAAS;AAAA,YACP;AAAA,cACE,OAAO,CAAC,EAAE,GAAG,EAAE,IAAI,MAAM,SAAS,GAAG,KAAK,EAAE,CAAC;AAAA,cAC7C,UAAU,CAAC,EAAE,cAAc,CAAC,EAAE,GAAG,EAAE,gBAAgB,IAAI,EAAE,CAAC,EAAE,CAAC;AAAA,YAC/D;AAAA,UACF;AAAA,UACA,UAAU;AAAA,YACR;AAAA,cACE,UAAU,CAAC,EAAE,GAAG,EAAE,WAAW,KAAK,UAAU,EAAE,CAAC;AAAA,cAC/C,aAAa,CAAC,EAAE,cAAc,CAAC,EAAE,CAAC;AAAA,YACpC;AAAA,UACF;AAAA,UACA,MAAM;AAAA,YACJ;AAAA,cACE,UAAU;AAAA,gBACR;AAAA,kBACE,SAAS,CAAC,EAAE,GAAG,EAAE,GAAG,KAAK,GAAG,IAAI,EAAE,CAAC;AAAA,kBACnC,SAAS,CAAC,EAAE,GAAG,EAAE,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;AAAA,gBACvC;AAAA,cACF;AAAA,cACA,cAAc,CAAC,EAAE,KAAK,EAAE,MAAM,OAAO,GAAG,WAAW,CAAC,EAAE,CAAC;AAAA,YACzD;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MACA,YAAY,CAAC,CAAC,CAAC;AAAA,IACjB,CAAC;AAAA,EACH;AAAA,EAEA,UAAgB;AAAA,EAAC;AACnB;",
6
5
  "names": []
7
6
  }
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/xml/excel-xml-relationship.ts"],
4
- "sourcesContent": ["import \"@simplysm/core-common\";\nimport { numParseInt } from \"@simplysm/core-common\";\nimport type { ExcelRelationshipData, ExcelXml, ExcelXmlRelationshipData } from \"../types\";\n\n/**\n * *.rels \uD30C\uC77C\uC744 \uAD00\uB9AC\uD558\uB294 \uD074\uB798\uC2A4.\n * \uD30C\uC77C \uAC04\uC758 \uCC38\uC870 \uAD00\uACC4\uB97C \uCC98\uB9AC\uD55C\uB2E4.\n */\nexport class ExcelXmlRelationship implements ExcelXml {\n data: ExcelXmlRelationshipData;\n\n constructor(data?: ExcelXmlRelationshipData) {\n if (data == null) {\n this.data = {\n Relationships: {\n $: {\n xmlns: \"http://schemas.openxmlformats.org/package/2006/relationships\",\n },\n },\n };\n } else {\n this.data = data;\n }\n }\n\n getTargetByRelId(rId: number): string | undefined {\n return (this.data.Relationships.Relationship ?? []).single((rel) => this._getRelId(rel) === rId)?.$.Target;\n }\n\n add(target: string, type: string): this {\n this.addAndGetId(target, type);\n return this;\n }\n\n addAndGetId(target: string, type: string): number {\n this.data.Relationships.Relationship = this.data.Relationships.Relationship ?? [];\n\n const newId = (this._lastId ?? 0) + 1;\n\n this.data.Relationships.Relationship.push({\n $: {\n Id: `rId${newId}`,\n Target: target,\n Type: type,\n },\n });\n\n return newId;\n }\n\n insert(rId: number, target: string, type: string): this {\n this.data.Relationships.Relationship = this.data.Relationships.Relationship ?? [];\n\n const shiftRels = this.data.Relationships.Relationship.filter((rel) => this._getRelId(rel) >= rId);\n for (const shiftRel of shiftRels) {\n shiftRel.$.Id = `rId${this._getRelId(shiftRel) + 1}`;\n }\n\n this.data.Relationships.Relationship.push({\n $: {\n Id: `rId${rId}`,\n Target: target,\n Type: type,\n },\n });\n\n return this;\n }\n\n cleanup(): void {}\n\n private get _lastId(): number | undefined {\n const rels = this.data.Relationships.Relationship;\n if (!rels || rels.length === 0) return undefined;\n const maxRel = rels.orderByDesc((rel) => this._getRelId(rel)).first();\n return maxRel ? this._getRelId(maxRel) : undefined;\n }\n\n private _getRelId(rel: ExcelRelationshipData): number {\n const match = /[0-9]+$/.exec(rel.$.Id);\n if (match == null) {\n throw new Error(`\uC798\uBABB\uB41C \uAD00\uACC4 ID \uD615\uC2DD\uC785\uB2C8\uB2E4: ${rel.$.Id}`);\n }\n return numParseInt(match[0])!;\n }\n}\n"],
5
4
  "mappings": "AAAA,OAAO;AACP,SAAS,mBAAmB;AAOrB,MAAM,qBAAyC;AAAA,EACpD;AAAA,EAEA,YAAY,MAAiC;AAC3C,QAAI,QAAQ,MAAM;AAChB,WAAK,OAAO;AAAA,QACV,eAAe;AAAA,UACb,GAAG;AAAA,YACD,OAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK,OAAO;AAAA,IACd;AAAA,EACF;AAAA,EAEA,iBAAiB,KAAiC;AAzBpD;AA0BI,YAAQ,WAAK,KAAK,cAAc,gBAAgB,CAAC,GAAG,OAAO,CAAC,QAAQ,KAAK,UAAU,GAAG,MAAM,GAAG,MAAvF,mBAA0F,EAAE;AAAA,EACtG;AAAA,EAEA,IAAI,QAAgB,MAAoB;AACtC,SAAK,YAAY,QAAQ,IAAI;AAC7B,WAAO;AAAA,EACT;AAAA,EAEA,YAAY,QAAgB,MAAsB;AAChD,SAAK,KAAK,cAAc,eAAe,KAAK,KAAK,cAAc,gBAAgB,CAAC;AAEhF,UAAM,SAAS,KAAK,WAAW,KAAK;AAEpC,SAAK,KAAK,cAAc,aAAa,KAAK;AAAA,MACxC,GAAG;AAAA,QACD,IAAI,MAAM,KAAK;AAAA,QACf,QAAQ;AAAA,QACR,MAAM;AAAA,MACR;AAAA,IACF,CAAC;AAED,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,KAAa,QAAgB,MAAoB;AACtD,SAAK,KAAK,cAAc,eAAe,KAAK,KAAK,cAAc,gBAAgB,CAAC;AAEhF,UAAM,YAAY,KAAK,KAAK,cAAc,aAAa,OAAO,CAAC,QAAQ,KAAK,UAAU,GAAG,KAAK,GAAG;AACjG,eAAW,YAAY,WAAW;AAChC,eAAS,EAAE,KAAK,MAAM,KAAK,UAAU,QAAQ,IAAI,CAAC;AAAA,IACpD;AAEA,SAAK,KAAK,cAAc,aAAa,KAAK;AAAA,MACxC,GAAG;AAAA,QACD,IAAI,MAAM,GAAG;AAAA,QACb,QAAQ;AAAA,QACR,MAAM;AAAA,MACR;AAAA,IACF,CAAC;AAED,WAAO;AAAA,EACT;AAAA,EAEA,UAAgB;AAAA,EAAC;AAAA,EAEjB,IAAY,UAA8B;AACxC,UAAM,OAAO,KAAK,KAAK,cAAc;AACrC,QAAI,CAAC,QAAQ,KAAK,WAAW,EAAG,QAAO;AACvC,UAAM,SAAS,KAAK,YAAY,CAAC,QAAQ,KAAK,UAAU,GAAG,CAAC,EAAE,MAAM;AACpE,WAAO,SAAS,KAAK,UAAU,MAAM,IAAI;AAAA,EAC3C;AAAA,EAEQ,UAAU,KAAoC;AACpD,UAAM,QAAQ,UAAU,KAAK,IAAI,EAAE,EAAE;AACrC,QAAI,SAAS,MAAM;AACjB,YAAM,IAAI,MAAM,sEAAoB,IAAI,EAAE,EAAE,EAAE;AAAA,IAChD;AACA,WAAO,YAAY,MAAM,CAAC,CAAC;AAAA,EAC7B;AACF;",
6
5
  "names": []
7
6
  }
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/xml/excel-xml-shared-string.ts"],
4
- "sourcesContent": ["import type {\n ExcelXml,\n ExcelXmlSharedStringData,\n ExcelXmlSharedStringDataSi,\n ExcelXmlSharedStringDataText,\n} from \"../types\";\nimport \"@simplysm/core-common\";\n\n/**\n * xl/sharedStrings.xml \uD30C\uC77C\uC744 \uAD00\uB9AC\uD558\uB294 \uD074\uB798\uC2A4.\n * \uBB38\uC790\uC5F4 \uC911\uBCF5\uC744 \uBC29\uC9C0\uD558\uC5EC \uD30C\uC77C \uD06C\uAE30\uB97C \uCD5C\uC801\uD654\uD55C\uB2E4.\n */\nexport class ExcelXmlSharedString implements ExcelXml {\n data: ExcelXmlSharedStringData;\n\n private readonly _stringIndexesMap: Map<string, number[]>;\n\n constructor(data?: ExcelXmlSharedStringData) {\n if (data === undefined) {\n this.data = {\n sst: {\n $: {\n xmlns: \"http://schemas.openxmlformats.org/spreadsheetml/2006/main\",\n },\n },\n };\n } else {\n this.data = data;\n }\n\n this._stringIndexesMap = this.data.sst.si\n ? this.data.sst.si\n .map((tag, id) => ({ id, tag }))\n .filter((item) => !this._getHasInnerStyleOnSiTag(item.tag))\n .toArrayMap(\n (item) => this._getStringFromSiTag(item.tag),\n (item) => item.id,\n )\n : new Map<string, number[]>();\n }\n\n getIdByString(str: string): number | undefined {\n return this._stringIndexesMap.get(str)?.[0];\n }\n\n getStringById(id: number): string | undefined {\n const si = this.data.sst.si?.[id];\n return si != null ? this._getStringFromSiTag(si) : undefined;\n }\n\n add(str: string): number {\n this.data.sst.si = this.data.sst.si ?? [];\n const newLength = this.data.sst.si.push({ t: [str] });\n const arr = this._stringIndexesMap.getOrCreate(str, []);\n arr.push(newLength - 1);\n return newLength - 1;\n }\n\n cleanup(): void {}\n\n private _getStringFromSiTag(si: ExcelXmlSharedStringDataSi): string {\n if (\"t\" in si) {\n return this._getStringFromTTag(si.t);\n } else {\n return si.r.map((item) => this._getStringFromTTag(item.t)).join(\"\");\n }\n }\n\n private _getStringFromTTag(t: ExcelXmlSharedStringDataText): string {\n const firstItem = t[0];\n if (typeof firstItem === \"string\") {\n return firstItem;\n }\n return firstItem._ ?? \" \";\n }\n\n private _getHasInnerStyleOnSiTag(si: ExcelXmlSharedStringDataSi): boolean {\n return Object.keys(si).some((item) => item !== \"t\");\n }\n}\n"],
5
4
  "mappings": "AAMA,OAAO;AAMA,MAAM,qBAAyC;AAAA,EACpD;AAAA,EAEiB;AAAA,EAEjB,YAAY,MAAiC;AAC3C,QAAI,SAAS,QAAW;AACtB,WAAK,OAAO;AAAA,QACV,KAAK;AAAA,UACH,GAAG;AAAA,YACD,OAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK,OAAO;AAAA,IACd;AAEA,SAAK,oBAAoB,KAAK,KAAK,IAAI,KACnC,KAAK,KAAK,IAAI,GACX,IAAI,CAAC,KAAK,QAAQ,EAAE,IAAI,IAAI,EAAE,EAC9B,OAAO,CAAC,SAAS,CAAC,KAAK,yBAAyB,KAAK,GAAG,CAAC,EACzD;AAAA,MACC,CAAC,SAAS,KAAK,oBAAoB,KAAK,GAAG;AAAA,MAC3C,CAAC,SAAS,KAAK;AAAA,IACjB,IACF,oBAAI,IAAsB;AAAA,EAChC;AAAA,EAEA,cAAc,KAAiC;AAzCjD;AA0CI,YAAO,UAAK,kBAAkB,IAAI,GAAG,MAA9B,mBAAkC;AAAA,EAC3C;AAAA,EAEA,cAAc,IAAgC;AA7ChD;AA8CI,UAAM,MAAK,UAAK,KAAK,IAAI,OAAd,mBAAmB;AAC9B,WAAO,MAAM,OAAO,KAAK,oBAAoB,EAAE,IAAI;AAAA,EACrD;AAAA,EAEA,IAAI,KAAqB;AACvB,SAAK,KAAK,IAAI,KAAK,KAAK,KAAK,IAAI,MAAM,CAAC;AACxC,UAAM,YAAY,KAAK,KAAK,IAAI,GAAG,KAAK,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;AACpD,UAAM,MAAM,KAAK,kBAAkB,YAAY,KAAK,CAAC,CAAC;AACtD,QAAI,KAAK,YAAY,CAAC;AACtB,WAAO,YAAY;AAAA,EACrB;AAAA,EAEA,UAAgB;AAAA,EAAC;AAAA,EAET,oBAAoB,IAAwC;AAClE,QAAI,OAAO,IAAI;AACb,aAAO,KAAK,mBAAmB,GAAG,CAAC;AAAA,IACrC,OAAO;AACL,aAAO,GAAG,EAAE,IAAI,CAAC,SAAS,KAAK,mBAAmB,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE;AAAA,IACpE;AAAA,EACF;AAAA,EAEQ,mBAAmB,GAAyC;AAClE,UAAM,YAAY,EAAE,CAAC;AACrB,QAAI,OAAO,cAAc,UAAU;AACjC,aAAO;AAAA,IACT;AACA,WAAO,UAAU,KAAK;AAAA,EACxB;AAAA,EAEQ,yBAAyB,IAAyC;AACxE,WAAO,OAAO,KAAK,EAAE,EAAE,KAAK,CAAC,SAAS,SAAS,GAAG;AAAA,EACpD;AACF;",
6
5
  "names": []
7
6
  }
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/xml/excel-xml-style.ts"],
4
- "sourcesContent": ["import type {\n ExcelBorderPosition,\n ExcelHorizontalAlign,\n ExcelVerticalAlign,\n ExcelXml,\n ExcelXmlStyleData,\n ExcelXmlStyleDataBorder,\n ExcelXmlStyleDataFill,\n ExcelXmlStyleDataXf,\n} from \"../types\";\nimport \"@simplysm/core-common\";\nimport { numParseInt, objClone, objEqual } from \"@simplysm/core-common\";\n\nexport interface ExcelStyle {\n numFmtId?: string;\n numFmtCode?: string;\n border?: ExcelBorderPosition[];\n background?: string;\n verticalAlign?: ExcelVerticalAlign;\n horizontalAlign?: ExcelHorizontalAlign;\n}\n\n/**\n * xl/styles.xml \uD30C\uC77C\uC744 \uAD00\uB9AC\uD558\uB294 \uD074\uB798\uC2A4.\n * \uC22B\uC790 \uD615\uC2DD, \uBC30\uACBD\uC0C9, \uD14C\uB450\uB9AC, \uC815\uB82C \uB4F1\uC758 \uC2A4\uD0C0\uC77C\uC744 \uCC98\uB9AC\uD55C\uB2E4.\n */\nexport class ExcelXmlStyle implements ExcelXml {\n data: ExcelXmlStyleData;\n\n constructor(data?: ExcelXmlStyleData) {\n if (data === undefined) {\n this.data = {\n styleSheet: {\n $: {\n xmlns: \"http://schemas.openxmlformats.org/spreadsheetml/2006/main\",\n },\n fonts: [\n {\n $: { count: \"1\" },\n font: [{}],\n },\n ],\n fills: [\n {\n $: { count: \"2\" },\n fill: [\n { patternFill: [{ $: { patternType: \"none\" } }] },\n { patternFill: [{ $: { patternType: \"gray125\" } }] },\n ],\n },\n ],\n borders: [\n {\n $: { count: \"1\" },\n border: [{}],\n },\n ],\n cellXfs: [\n {\n $: { count: \"1\" },\n xf: [{ $: { numFmtId: \"0\" } }],\n },\n ],\n },\n };\n } else {\n this.data = data;\n }\n }\n\n add(style: ExcelStyle): string {\n const newXf: ExcelXmlStyleDataXf = { $: {} };\n\n if (style.numFmtId !== undefined) {\n newXf.$.numFmtId = style.numFmtId;\n }\n\n if (style.numFmtCode !== undefined) {\n newXf.$.numFmtId = this._setNumFmtCode(style.numFmtCode);\n newXf.$.applyNumberFormat = \"1\";\n }\n\n if (style.background !== undefined) {\n const newFill: ExcelXmlStyleDataFill = {\n patternFill: [\n {\n $: { patternType: \"solid\" },\n fgColor: [{ $: { rgb: style.background.toUpperCase() } }],\n },\n ],\n };\n\n newXf.$.applyFill = \"1\";\n newXf.$.fillId = this._getSameOrCreateFill(newFill);\n }\n\n if (style.border !== undefined) {\n const newBorder = this._createBorderFromPositions(style.border);\n newXf.$.applyBorder = \"1\";\n newXf.$.borderId = this._getSameOrCreateBorder(newBorder);\n }\n\n this._applyAlignment(newXf, style);\n\n return this._getSameOrCreateXf(newXf);\n }\n\n addWithClone(id: string, style: ExcelStyle): string {\n const idNum = numParseInt(id);\n if (idNum == null) {\n throw new Error(`\uC798\uBABB\uB41C \uC2A4\uD0C0\uC77C ID: ${id}`);\n }\n const xfArray = this.data.styleSheet.cellXfs[0].xf;\n if (idNum < 0 || idNum >= xfArray.length) {\n throw new Error(`\uC874\uC7AC\uD558\uC9C0 \uC54A\uB294 \uC2A4\uD0C0\uC77C ID: ${id} (\uBC94\uC704: 0-${xfArray.length - 1})`);\n }\n const prevXf = xfArray[idNum];\n const cloneXf = objClone(prevXf);\n\n if (style.numFmtId !== undefined) {\n cloneXf.$.numFmtId = style.numFmtId;\n }\n\n if (style.numFmtCode !== undefined) {\n cloneXf.$.numFmtId = this._setNumFmtCode(style.numFmtCode);\n cloneXf.$.applyNumberFormat = \"1\";\n }\n\n if (style.background !== undefined) {\n const fillIdNum = cloneXf.$.fillId !== undefined ? numParseInt(cloneXf.$.fillId) : undefined;\n const prevFill = fillIdNum !== undefined ? this.data.styleSheet.fills[0].fill[fillIdNum] : undefined;\n\n if (prevFill != null) {\n const cloneFill = objClone(prevFill);\n cloneFill.patternFill[0].$.patternType = \"solid\";\n\n if (cloneFill.patternFill[0].fgColor == null) {\n cloneFill.patternFill[0].fgColor = [{ $: { rgb: style.background } }];\n } else {\n cloneFill.patternFill[0].fgColor[0].$.rgb = style.background;\n }\n\n cloneXf.$.applyFill = \"1\";\n cloneXf.$.fillId = this._getSameOrCreateFill(cloneFill);\n } else {\n const newFill: ExcelXmlStyleDataFill = {\n patternFill: [\n {\n $: { patternType: \"solid\" },\n fgColor: [{ $: { rgb: style.background.toUpperCase() } }],\n },\n ],\n };\n cloneXf.$.applyFill = \"1\";\n cloneXf.$.fillId = this._getSameOrCreateFill(newFill);\n }\n }\n\n if (style.border !== undefined) {\n const borderIdNum = cloneXf.$.borderId !== undefined ? numParseInt(cloneXf.$.borderId) : undefined;\n const prevBorder = borderIdNum !== undefined ? this.data.styleSheet.borders[0].border[borderIdNum] : undefined;\n\n if (prevBorder != null) {\n const cloneBorder = objClone(prevBorder);\n this._applyBorderPosition(cloneBorder, \"left\", style.border.includes(\"left\"));\n this._applyBorderPosition(cloneBorder, \"right\", style.border.includes(\"right\"));\n this._applyBorderPosition(cloneBorder, \"top\", style.border.includes(\"top\"));\n this._applyBorderPosition(cloneBorder, \"bottom\", style.border.includes(\"bottom\"));\n\n cloneXf.$.applyBorder = \"1\";\n cloneXf.$.borderId = this._getSameOrCreateBorder(cloneBorder);\n } else {\n const newBorder = this._createBorderFromPositions(style.border);\n cloneXf.$.applyBorder = \"1\";\n cloneXf.$.borderId = this._getSameOrCreateBorder(newBorder);\n }\n }\n\n this._applyAlignment(cloneXf, style);\n\n return this._getSameOrCreateXf(cloneXf);\n }\n\n get(id: string): ExcelStyle {\n const idNum = numParseInt(id);\n if (idNum == null) {\n throw new Error(`\uC798\uBABB\uB41C \uC2A4\uD0C0\uC77C ID: ${id}`);\n }\n const xf = this.data.styleSheet.cellXfs[0].xf[idNum] as ExcelXmlStyleDataXf | undefined;\n\n const result: ExcelStyle = {};\n\n if (xf !== undefined) {\n result.numFmtId = xf.$.numFmtId;\n\n if (xf.$.fillId !== undefined) {\n const fillIdNum = numParseInt(xf.$.fillId);\n if (fillIdNum != null) {\n const fill = this.data.styleSheet.fills[0].fill[fillIdNum] as ExcelXmlStyleDataFill | undefined;\n if (fill == null) {\n throw new Error(\n `\uC874\uC7AC\uD558\uC9C0 \uC54A\uB294 fill ID: ${xf.$.fillId} (\uBC94\uC704: 0-${this.data.styleSheet.fills[0].fill.length - 1})`,\n );\n }\n result.background = fill.patternFill[0].fgColor?.[0].$.rgb;\n }\n }\n\n if (xf.$.borderId !== undefined) {\n const borderIdNum = numParseInt(xf.$.borderId);\n if (borderIdNum == null) {\n throw new Error(`\uC798\uBABB\uB41C border ID: ${xf.$.borderId}`);\n }\n const border = this.data.styleSheet.borders[0].border[borderIdNum] as ExcelXmlStyleDataBorder | undefined;\n if (border == null) {\n throw new Error(\n `\uC874\uC7AC\uD558\uC9C0 \uC54A\uB294 border ID: ${xf.$.borderId} (\uBC94\uC704: 0-${this.data.styleSheet.borders[0].border.length - 1})`,\n );\n }\n if (border.top != null || border.left != null || border.right != null || border.bottom != null) {\n result.border = [];\n if (border.left != null) {\n result.border.push(\"left\");\n }\n if (border.right != null) {\n result.border.push(\"right\");\n }\n if (border.top != null) {\n result.border.push(\"top\");\n }\n if (border.bottom != null) {\n result.border.push(\"bottom\");\n }\n }\n }\n\n result.verticalAlign = xf.alignment?.[0].$.vertical;\n result.horizontalAlign = xf.alignment?.[0].$.horizontal;\n }\n\n return result;\n }\n\n getNumFmtCode(numFmtId: string): string | undefined {\n return (this.data.styleSheet.numFmts?.[0].numFmt ?? []).single((item) => item.$.numFmtId === numFmtId)?.$\n .formatCode;\n }\n\n cleanup(): void {\n const result = {} as ExcelXmlStyleData[\"styleSheet\"];\n\n // \uC21C\uC11C \uC815\uB82C (numFmts \uB9E8\uC704\uB85C)\n\n if (this.data.styleSheet.numFmts != null) {\n result.numFmts = this.data.styleSheet.numFmts;\n }\n\n const styleSheetRec = this.data.styleSheet as Record<string, unknown>;\n const resultRec = result as Record<string, unknown>;\n for (const key of Object.keys(styleSheetRec)) {\n if (key === \"numFmts\") continue;\n\n resultRec[key] = styleSheetRec[key];\n }\n\n this.data.styleSheet = result;\n }\n\n //#region Private Methods\n\n private _setNumFmtCode(numFmtCode: string): string {\n // \uC774\uBBF8 \uD574\uB2F9 code\uAC00 \uC788\uC73C\uBA74 \uB118\uAE30\uAE30\n const existsNumFmtId = (this.data.styleSheet.numFmts?.[0].numFmt ?? []).single(\n (item) => item.$.formatCode === numFmtCode,\n )?.$.numFmtId;\n if (existsNumFmtId != null) {\n return existsNumFmtId;\n }\n\n this.data.styleSheet.numFmts = this.data.styleSheet.numFmts ?? [\n {\n $: { count: \"0\" },\n numFmt: [],\n },\n ];\n\n this.data.styleSheet.numFmts[0].numFmt = this.data.styleSheet.numFmts[0].numFmt ?? [];\n\n // Excel \uC0AC\uC6A9\uC790 \uC815\uC758 \uC22B\uC790 \uD615\uC2DD\uC740 ID 180 \uC774\uC0C1\uBD80\uD130 \uC2DC\uC791\uD55C\uB2E4 (0-163: \uB0B4\uC7A5 \uD615\uC2DD, 164-179: \uC608\uC57D\uB428)\n const numFmts = this.data.styleSheet.numFmts[0].numFmt;\n const maxItem =\n numFmts.length > 0 ? numFmts.orderByDesc((item) => numParseInt(item.$.numFmtId) ?? 180).first() : undefined;\n const maxId = maxItem ? (numParseInt(maxItem.$.numFmtId) ?? 180) : 180;\n const nextNumFmtId = (maxId + 1).toString();\n this.data.styleSheet.numFmts[0].numFmt.push({\n $: {\n numFmtId: nextNumFmtId,\n formatCode: numFmtCode,\n },\n });\n this.data.styleSheet.numFmts[0].$.count = (\n (numParseInt(this.data.styleSheet.numFmts[0].$.count) ?? 0) + 1\n ).toString();\n\n return nextNumFmtId;\n }\n\n private _applyAlignment(xf: ExcelXmlStyleDataXf, style: ExcelStyle): void {\n if (style.verticalAlign !== undefined) {\n xf.$.applyAlignment = \"1\";\n if (xf.alignment == null) {\n xf.alignment = [{ $: { vertical: style.verticalAlign } }];\n } else {\n xf.alignment[0].$.vertical = style.verticalAlign;\n }\n }\n\n if (style.horizontalAlign !== undefined) {\n xf.$.applyAlignment = \"1\";\n if (xf.alignment == null) {\n xf.alignment = [{ $: { horizontal: style.horizontalAlign } }];\n } else {\n xf.alignment[0].$.horizontal = style.horizontalAlign;\n }\n }\n }\n\n private _createBorderFromPositions(positions: ExcelBorderPosition[]): ExcelXmlStyleDataBorder {\n return {\n ...(positions.includes(\"left\") ? { left: [{ $: { style: \"thin\" }, color: [{ $: { rgb: \"00000000\" } }] }] } : {}),\n ...(positions.includes(\"right\")\n ? { right: [{ $: { style: \"thin\" }, color: [{ $: { rgb: \"00000000\" } }] }] }\n : {}),\n ...(positions.includes(\"top\") ? { top: [{ $: { style: \"thin\" }, color: [{ $: { rgb: \"00000000\" } }] }] } : {}),\n ...(positions.includes(\"bottom\")\n ? { bottom: [{ $: { style: \"thin\" }, color: [{ $: { rgb: \"00000000\" } }] }] }\n : {}),\n };\n }\n\n private _applyBorderPosition(border: ExcelXmlStyleDataBorder, position: ExcelBorderPosition, enabled: boolean): void {\n if (enabled) {\n const existing = border[position];\n if (existing == null) {\n border[position] = [{ $: { style: \"thin\" }, color: [{ $: { rgb: \"00000000\" } }] }];\n } else if (existing[0].color == null) {\n existing[0].color = [{ $: { rgb: \"00000000\" } }];\n } else {\n existing[0].color[0].$.rgb = \"00000000\";\n }\n } else {\n delete border[position];\n }\n }\n\n private _getSameOrCreateXf(xfItem: ExcelXmlStyleDataXf): string {\n const prevSameXf = this.data.styleSheet.cellXfs[0].xf.single((item) => objEqual(item, xfItem));\n\n if (prevSameXf != null) {\n return this.data.styleSheet.cellXfs[0].xf.indexOf(prevSameXf).toString();\n } else {\n this.data.styleSheet.cellXfs[0].xf.push(xfItem);\n this.data.styleSheet.cellXfs[0].$.count = this.data.styleSheet.cellXfs[0].xf.length.toString();\n return (this.data.styleSheet.cellXfs[0].xf.length - 1).toString();\n }\n }\n\n private _getSameOrCreateFill(fillItem: ExcelXmlStyleDataFill): string {\n const prevSameFill = this.data.styleSheet.fills[0].fill.single((item) => objEqual(item, fillItem));\n\n if (prevSameFill != null) {\n return this.data.styleSheet.fills[0].fill.indexOf(prevSameFill).toString();\n } else {\n this.data.styleSheet.fills[0].fill.push(fillItem);\n this.data.styleSheet.fills[0].$.count = this.data.styleSheet.fills[0].fill.length.toString();\n return (this.data.styleSheet.fills[0].fill.length - 1).toString();\n }\n }\n\n private _getSameOrCreateBorder(borderItem: ExcelXmlStyleDataBorder): string {\n const prevSameBorder = this.data.styleSheet.borders[0].border.single((item) => objEqual(item, borderItem));\n\n if (prevSameBorder != null) {\n return this.data.styleSheet.borders[0].border.indexOf(prevSameBorder).toString();\n } else {\n this.data.styleSheet.borders[0].border.push(borderItem);\n this.data.styleSheet.borders[0].$.count = this.data.styleSheet.borders[0].border.length.toString();\n return (this.data.styleSheet.borders[0].border.length - 1).toString();\n }\n }\n\n //#endregion\n}\n"],
5
4
  "mappings": "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",
6
5
  "names": []
7
6
  }
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/xml/excel-xml-unknown.ts"],
4
- "sourcesContent": ["import type { ExcelXml } from \"../types\";\n\n/**\n * \uC54C \uC218 \uC5C6\uB294 \uD615\uC2DD\uC758 Excel XML \uB370\uC774\uD130\uB97C \uBCF4\uC874\uD558\uB294 \uD074\uB798\uC2A4.\n * \uC6D0\uBCF8 \uB370\uC774\uD130\uB97C \uC190\uC2E4 \uC5C6\uC774 \uC720\uC9C0\uD55C\uB2E4.\n */\nexport class ExcelXmlUnknown implements ExcelXml {\n constructor(public readonly data: Record<string, unknown>) {}\n\n cleanup(): void {}\n}\n"],
5
4
  "mappings": "AAMO,MAAM,gBAAoC;AAAA,EAC/C,YAA4B,MAA+B;AAA/B;AAAA,EAAgC;AAAA,EAE5D,UAAgB;AAAA,EAAC;AACnB;",
6
5
  "names": []
7
6
  }
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/xml/excel-xml-workbook.ts"],
4
- "sourcesContent": ["import \"@simplysm/core-common\";\nimport { numParseInt } from \"@simplysm/core-common\";\nimport type { ExcelXml, ExcelXmlWorkbookData } from \"../types\";\n\n/**\n * xl/workbook.xml \uD30C\uC77C\uC744 \uAD00\uB9AC\uD558\uB294 \uD074\uB798\uC2A4.\n * \uC6CC\uD06C\uC2DC\uD2B8 \uBAA9\uB85D\uACFC \uAD00\uACC4 ID\uB97C \uCC98\uB9AC\uD55C\uB2E4.\n */\nexport class ExcelXmlWorkbook implements ExcelXml {\n data: ExcelXmlWorkbookData;\n\n constructor(data?: ExcelXmlWorkbookData) {\n if (data === undefined) {\n this.data = {\n workbook: {\n $: {\n \"xmlns\": \"http://schemas.openxmlformats.org/spreadsheetml/2006/main\",\n \"xmlns:r\": \"http://schemas.openxmlformats.org/officeDocument/2006/relationships\",\n },\n },\n };\n } else {\n this.data = data;\n }\n }\n\n get lastWsRelId(): number | undefined {\n const sheets = this.data.workbook.sheets?.[0].sheet;\n if (!sheets || sheets.length === 0) return undefined;\n const maxSheet = sheets.orderByDesc((sheet) => numParseInt(sheet.$[\"r:id\"])!).first();\n return maxSheet ? numParseInt(maxSheet.$[\"r:id\"]) : undefined;\n }\n\n get sheetNames(): string[] {\n return this.data.workbook.sheets?.[0].sheet.map((item) => item.$.name) ?? [];\n }\n\n addWorksheet(name: string): this {\n const replacedName = this._getReplacedName(name);\n\n const newWsRelId = (this.lastWsRelId ?? 0) + 1;\n\n this.data.workbook.sheets = this.data.workbook.sheets ?? [{ sheet: [] }];\n this.data.workbook.sheets[0].sheet.push({\n $: {\n \"name\": replacedName,\n \"sheetId\": newWsRelId.toString(),\n \"r:id\": `rId${newWsRelId}`,\n },\n });\n\n return this;\n }\n\n cleanup(): void {\n const result = {} as ExcelXmlWorkbookData[\"workbook\"];\n\n // \uC21C\uC11C \uC815\uB82C (\"sheets\"\uAE30\uC900 \uC55E\uB4A4\uB85C, \uB098\uBA38\uC9C0\uB294 \uC6D0\uB798\uC704\uCE58\uB300\uB85C)\n\n const workbookRec = this.data.workbook as Record<string, unknown>;\n const resultRec = result as Record<string, unknown>;\n\n for (const key of Object.keys(this.data.workbook)) {\n if (key === \"bookViews\") continue;\n\n if (key === \"sheets\") {\n if (this.data.workbook.bookViews != null) {\n result.bookViews = this.data.workbook.bookViews;\n }\n result.sheets = this.data.workbook.sheets;\n } else {\n resultRec[key] = workbookRec[key];\n }\n }\n\n this.data.workbook = result;\n }\n\n initializeView(): void {\n this.data.workbook.bookViews = this.data.workbook.bookViews ?? [{ workbookView: [{}] }];\n }\n\n getWsRelIdByName(name: string): number | undefined {\n return numParseInt((this.data.workbook.sheets?.[0].sheet ?? []).single((item) => item.$.name === name)?.$[\"r:id\"]);\n }\n\n getWsRelIdByIndex(index: number): number | undefined {\n return numParseInt(this.data.workbook.sheets?.[0].sheet[index]?.$[\"r:id\"]);\n }\n\n getWorksheetNameById(id: number): string | undefined {\n return this._getSheetDataById(id)?.$.name;\n }\n\n setWorksheetNameById(id: number, newName: string): void {\n const sheetData = this._getSheetDataById(id);\n if (sheetData == null) {\n throw new Error(`\uC6CC\uD06C\uC2DC\uD2B8 ID ${id}\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4`);\n }\n const replacedName = this._getReplacedName(newName);\n sheetData.$.name = replacedName;\n }\n\n private _getSheetDataById(id: number) {\n return (this.data.workbook.sheets?.[0].sheet ?? []).single((item) => numParseInt(item.$[\"r:id\"]) === id);\n }\n\n private _getReplacedName(name: string): string {\n //-- \uC2DC\uD2B8\uBA85\uCE6D \uC0AC\uC6A9\uBD88\uAC00 \uD14D\uC2A4\uD2B8\uB97C \"_\"\uB85C \uBCC0\uD658\n return name.replace(/[:\\\\/?*\\[\\]']/g, \"_\");\n }\n}\n"],
5
4
  "mappings": "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",
6
5
  "names": []
7
6
  }
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/xml/excel-xml-worksheet.ts"],
4
- "sourcesContent": ["import type {\n ExcelAddressRangePoint,\n ExcelCellData,\n ExcelCellType,\n ExcelRowData,\n ExcelXml,\n ExcelXmlWorksheetData,\n} from \"../types\";\nimport { ExcelUtils } from \"../utils/excel-utils\";\nimport { numParseInt, objClone } from \"@simplysm/core-common\";\nimport \"@simplysm/core-common\";\n\ninterface RowInfo {\n data: ExcelRowData;\n cellMap: Map<number, ExcelCellData>;\n}\n\n/**\n * xl/worksheets/sheet*.xml \uD30C\uC77C\uC744 \uAD00\uB9AC\uD558\uB294 \uD074\uB798\uC2A4.\n * \uC140 \uB370\uC774\uD130, \uBCD1\uD569, \uC5F4 \uB108\uBE44, \uD589 \uB192\uC774 \uB4F1\uC744 \uCC98\uB9AC\uD55C\uB2E4.\n */\nexport class ExcelXmlWorksheet implements ExcelXml {\n data: ExcelXmlWorksheetData;\n\n private readonly _dataMap: Map<number, RowInfo>;\n\n constructor(data?: ExcelXmlWorksheetData) {\n if (data === undefined) {\n this.data = {\n worksheet: {\n $: {\n xmlns: \"http://schemas.openxmlformats.org/spreadsheetml/2006/main\",\n },\n dimension: [\n {\n $: {\n ref: \"A1\",\n },\n },\n ],\n sheetData: [{}],\n },\n };\n } else {\n this.data = data;\n }\n\n this._dataMap = (this.data.worksheet.sheetData[0].row ?? []).toMap(\n (row) => ExcelUtils.parseRowAddrCode(row.$.r),\n (row) => ({\n data: row,\n cellMap: (row.c ?? []).toMap(\n (cell) => ExcelUtils.parseColAddrCode(cell.$.r),\n (cell) => cell,\n ),\n }),\n );\n }\n\n get range(): ExcelAddressRangePoint {\n let maxRow = 0;\n let maxCol = 0;\n\n for (const [rowIdx, info] of this._dataMap.entries()) {\n if (rowIdx > maxRow) maxRow = rowIdx;\n\n for (const col of info.cellMap.keys()) {\n if (col > maxCol) maxCol = col;\n }\n }\n\n return {\n s: { r: 0, c: 0 },\n e: { r: maxRow, c: maxCol },\n };\n }\n\n setCellType(addr: { r: number; c: number }, type: ExcelCellType | undefined): void {\n const cellData = this._getOrCreateCellData(addr);\n if (type != null) {\n cellData.$.t = type;\n } else {\n delete cellData.$.t;\n }\n }\n\n getCellType(addr: { r: number; c: number }): ExcelCellType | undefined {\n return this._getCellData(addr)?.$.t as ExcelCellType | undefined;\n }\n\n setCellVal(addr: { r: number; c: number }, val: string | undefined): void {\n const cellData = this._getOrCreateCellData(addr);\n if (val === undefined) {\n delete cellData.v;\n } else {\n cellData.v = [val];\n }\n }\n\n getCellVal(addr: { r: number; c: number }): string | undefined {\n const cellData = this._getCellData(addr);\n const val = cellData?.v?.[0] ?? cellData?.is?.[0]?.t?.[0]?._;\n return typeof val === \"string\" ? val : undefined;\n }\n\n setCellFormula(addr: { r: number; c: number }, val: string | undefined): void {\n const cellData = this._getOrCreateCellData(addr);\n if (val === undefined) {\n delete cellData.f;\n } else {\n cellData.f = [val];\n }\n }\n\n getCellFormula(addr: { r: number; c: number }): string | undefined {\n const val = this._getCellData(addr)?.f?.[0];\n return typeof val === \"string\" ? val : undefined;\n }\n\n getCellStyleId(addr: { r: number; c: number }): string | undefined {\n return this._getCellData(addr)?.$.s;\n }\n\n setCellStyleId(addr: { r: number; c: number }, styleId: string | undefined): void {\n if (styleId != null) {\n this._getOrCreateCellData(addr).$.s = styleId;\n } else {\n delete this._getOrCreateCellData(addr).$.s;\n }\n }\n\n deleteCell(addr: { r: number; c: number }): void {\n // ROW \uC5C6\uC73C\uBA74 \uBB34\uD6A8\n const rowInfo = this._dataMap.get(addr.r);\n if (rowInfo == null) return;\n\n // CELL \uC5C6\uC73C\uBA74 \uBB34\uD6A8\n const cellData = rowInfo.cellMap.get(addr.c);\n if (cellData == null) return;\n\n // CELL \uC0AD\uC81C\n const cellsData = rowInfo.data.c!;\n const cellIndex = cellsData.indexOf(cellData);\n if (cellIndex !== -1) cellsData.splice(cellIndex, 1);\n rowInfo.cellMap.delete(addr.c);\n\n // \uB9C8\uC9C0\uB9C9 CELL\uC774\uBA74 ROW\uB3C4 \uC0AD\uC81C\n if (rowInfo.cellMap.size === 0) {\n this._deleteRow(addr.r);\n }\n }\n\n setMergeCells(startAddr: { r: number; c: number }, endAddr: { r: number; c: number }): void {\n const mergeCells = (this.data.worksheet.mergeCells = this.data.worksheet.mergeCells ?? [\n {\n $: { count: \"0\" },\n mergeCell: [],\n },\n ]);\n\n const newRange = { s: startAddr, e: endAddr };\n\n // \uBA38\uC9C0 \uACB9\uCE68 \uCCB4\uD06C\n const existingMergeCells = mergeCells[0].mergeCell;\n for (const mergeCell of existingMergeCells) {\n const existingRange = ExcelUtils.parseRangeAddrCode(mergeCell.$.ref);\n\n if (\n newRange.s.r <= existingRange.e.r &&\n newRange.e.r >= existingRange.s.r &&\n newRange.s.c <= existingRange.e.c &&\n newRange.e.c >= existingRange.s.c\n ) {\n throw new Error(\n `\uBCD1\uD569 \uC140\uC774 \uAE30\uC874 \uBCD1\uD569 \uBC94\uC704(${mergeCell.$.ref})\uC640 \uACB9\uCE69\uB2C8\uB2E4: ${ExcelUtils.stringifyRangeAddr(newRange)}`,\n );\n }\n }\n\n mergeCells[0].mergeCell.push({ $: { ref: ExcelUtils.stringifyRangeAddr(newRange) } });\n mergeCells[0].$.count = mergeCells[0].mergeCell.length.toString();\n\n // \uC2DC\uC791\uC140\uC678 \uBAA8\uB4E0\uC140 \uC0AD\uC81C\n for (let r = startAddr.r; r <= endAddr.r; r++) {\n for (let c = startAddr.c; c <= endAddr.c; c++) {\n const currentAddr = { r, c };\n if (currentAddr.r !== startAddr.r || currentAddr.c !== startAddr.c) {\n this.deleteCell(currentAddr);\n }\n }\n }\n }\n\n getMergeCells(): { s: { r: number; c: number }; e: { r: number; c: number } }[] {\n const mergeCells = this.data.worksheet.mergeCells;\n if (mergeCells === undefined) return [];\n return mergeCells[0].mergeCell.map((item) => ExcelUtils.parseRangeAddrCode(item.$.ref));\n }\n\n removeMergeCells(fromAddr: { r: number; c: number }, toAddr: { r: number; c: number }): void {\n if (this.data.worksheet.mergeCells == null) return;\n\n const range = { s: fromAddr, e: toAddr };\n\n const filteredMergeCells = this.data.worksheet.mergeCells[0].mergeCell.filter((item) => {\n const rangeAddr = ExcelUtils.parseRangeAddrCode(item.$.ref);\n return !(\n rangeAddr.s.r >= range.s.r &&\n rangeAddr.e.r <= range.e.r &&\n rangeAddr.s.c >= range.s.c &&\n rangeAddr.e.c <= range.e.c\n );\n });\n\n if (filteredMergeCells.length === 0) {\n delete this.data.worksheet.mergeCells;\n } else {\n this.data.worksheet.mergeCells[0].mergeCell = filteredMergeCells;\n this.data.worksheet.mergeCells[0].$.count = filteredMergeCells.length.toString();\n }\n }\n\n /**\n * \uD2B9\uC815 \uC5F4\uC758 \uB108\uBE44\uB97C \uC124\uC815\uD55C\uB2E4.\n *\n * @internal\n * \uC678\uBD80\uC5D0\uC11C\uB294 ExcelCol.setWidth()\uB97C \uC0AC\uC6A9\uD55C\uB2E4.\n *\n * @param colIndex \uC5F4 \uC778\uB371\uC2A4 (1-based, \uBB38\uC790\uC5F4)\n * @param width \uC124\uC815\uD560 \uB108\uBE44\n */\n setColWidth(colIndex: string, width: string): void {\n const colIndexNumber = numParseInt(colIndex);\n if (colIndexNumber == null) {\n throw new Error(`\uC798\uBABB\uB41C \uC5F4 \uC778\uB371\uC2A4: ${colIndex}`);\n }\n\n const cols = this.data.worksheet.cols?.[0];\n\n // \uB300\uC0C1 \uC5F4\uC744 \uD3EC\uD568\uD558\uB294 \uAE30\uC874 \uBC94\uC704 \uCC3E\uAE30\n const col = cols\n ? cols.col.single(\n (item) =>\n (numParseInt(item.$.min) ?? 0) <= colIndexNumber && (numParseInt(item.$.max) ?? 0) >= colIndexNumber,\n )\n : undefined;\n\n if (col != null && cols != null) {\n if (col.$.min === col.$.max) {\n // \uAE30\uC874 \uBC94\uC704\uAC00 \uB2E8\uC77C \uC5F4\uC778 \uACBD\uC6B0: \uD574\uB2F9 \uC5F4\uC758 \uC18D\uC131\uB9CC \uBCC0\uACBD\n col.$.bestFit = \"1\";\n col.$.customWidth = \"1\";\n col.$.width = width;\n } else {\n // \uAE30\uC874 \uBC94\uC704\uAC00 \uC5EC\uB7EC \uC5F4\uC778 \uACBD\uC6B0: \uBC94\uC704\uB97C \uBD84\uD560\uD558\uC5EC \uB300\uC0C1 \uC5F4\uB9CC \uC0C8 width \uC801\uC6A9\n // \uC608: \uAE30\uC874 [1~5, width=10], \uB300\uC0C1=3, \uC0C8 width=20\n // \u2192 [1~2, width=10], [3, width=20], [4~5, width=10]\n const minNumber = numParseInt(col.$.min) ?? 0;\n const maxNumber = numParseInt(col.$.max) ?? 0;\n\n let insertIndex = cols.col.indexOf(col);\n\n // \uC55E\uCABD \uBC94\uC704 \uC0DD\uC131 (min ~ colIndex-1): \uC6D0\uBCF8 \uC18D\uC131 \uC720\uC9C0\n if (minNumber < colIndexNumber) {\n cols.col.splice(insertIndex, 0, {\n $: {\n ...col.$,\n min: col.$.min,\n max: (colIndexNumber - 1).toString(),\n },\n });\n insertIndex++;\n }\n\n // \uB300\uC0C1 \uC5F4 \uC0DD\uC131 (colIndex): \uC0C8 width \uC801\uC6A9\n cols.col.splice(insertIndex, 0, {\n $: {\n min: colIndex,\n max: colIndex,\n bestFit: \"1\",\n customWidth: \"1\",\n width: width,\n },\n });\n insertIndex++;\n\n // \uB4A4\uCABD \uBC94\uC704 \uC0DD\uC131 (colIndex+1 ~ max): \uC6D0\uBCF8 \uC18D\uC131 \uC720\uC9C0\n if (maxNumber > colIndexNumber) {\n cols.col.splice(insertIndex, 0, {\n $: {\n ...col.$,\n min: (colIndexNumber + 1).toString(),\n max: col.$.max,\n },\n });\n }\n\n // \uC6D0\uBCF8 \uBC94\uC704 \uC0AD\uC81C\n const colIndex2 = cols.col.indexOf(col);\n if (colIndex2 !== -1) cols.col.splice(colIndex2, 1);\n }\n } else {\n // \uAE30\uC874 \uBC94\uC704 \uC5C6\uC74C: \uC0C8 \uBC94\uC704 \uC0DD\uC131\n this.data.worksheet.cols = this.data.worksheet.cols ?? [{ col: [] }];\n this.data.worksheet.cols[0].col.push({\n $: {\n min: colIndex,\n max: colIndex,\n bestFit: \"1\",\n customWidth: \"1\",\n width: width,\n },\n });\n }\n }\n\n setZoom(percent: number): void {\n this.data.worksheet.sheetViews = this.data.worksheet.sheetViews ?? [\n { sheetView: [{ $: { workbookViewId: \"0\" } }] },\n ];\n\n this.data.worksheet.sheetViews[0].sheetView[0].$.zoomScale = percent.toString();\n }\n\n setFix(point: { r?: number; c?: number }): void {\n this.data.worksheet.sheetViews = this.data.worksheet.sheetViews ?? [\n { sheetView: [{ $: { workbookViewId: \"0\" } }] },\n ];\n\n this.data.worksheet.sheetViews[0].sheetView[0].pane = [\n {\n $: {\n ...(point.c != null\n ? {\n xSplit: (point.c + 1).toString(),\n }\n : {}),\n ...(point.r != null\n ? {\n ySplit: (point.r + 1).toString(),\n }\n : {}),\n topLeftCell: ExcelUtils.stringifyAddr({\n r: (point.r ?? -1) + 1,\n c: (point.c ?? -1) + 1,\n }),\n activePane: point.r == null ? \"topRight\" : point.c == null ? \"bottomLeft\" : \"bottomRight\",\n state: \"frozen\",\n },\n },\n ];\n }\n\n copyRow(sourceR: number, targetR: number): void {\n // \uCD9C\uBC1C\uC9C0ROW \uB370\uC774\uD130 \uBCF5\uC81C\n const sourceRowInfo = this._dataMap.get(sourceR);\n\n if (sourceRowInfo != null) {\n // rowData \uBCF5\uC81C\n const newRowData: ExcelRowData = objClone(sourceRowInfo.data);\n\n // ROW \uC8FC\uC18C \uBCC0\uACBD\n newRowData.$.r = ExcelUtils.stringifyRowAddr(targetR);\n\n // \uAC01 CELL \uC8FC\uC18C \uBCC0\uACBD\n if (newRowData.c != null) {\n for (const cellData of newRowData.c) {\n const colAddr = ExcelUtils.parseColAddrCode(cellData.$.r);\n cellData.$.r = ExcelUtils.stringifyAddr({ r: targetR, c: colAddr });\n }\n }\n\n this._replaceRowData(targetR, newRowData);\n } else {\n this._deleteRow(targetR);\n }\n\n // \uC18C\uC2A4 \uD589\uC758 \uBCD1\uD569 \uC140 \uC815\uBCF4\uB97C \uBA3C\uC800 \uBCF5\uC0AC\uD558\uC5EC \uC800\uC7A5\n const sourceMergeCells = this.getMergeCells()\n .filter((mc) => mc.s.r <= sourceR && mc.e.r >= sourceR)\n .map((mc) => ({ s: { ...mc.s }, e: { ...mc.e } }));\n\n // \uD0C0\uAC9F \uD589\uC758 \uAE30\uC874 \uBCD1\uD569 \uC140 \uC81C\uAC70\n for (const mergeCell of this.getMergeCells()) {\n if (mergeCell.s.r <= targetR && mergeCell.e.r >= targetR) {\n this.removeMergeCells(mergeCell.s, mergeCell.e);\n }\n }\n\n // \uC800\uC7A5\uB41C \uC18C\uC2A4 \uBCD1\uD569 \uC815\uBCF4\uB85C \uD0C0\uAC9F\uC5D0 \uBCF5\uC0AC\n for (const mergeCell of sourceMergeCells) {\n const rowDiff = targetR - sourceR;\n const newStartAddr = { r: mergeCell.s.r + rowDiff, c: mergeCell.s.c };\n const newEndAddr = { r: mergeCell.e.r + rowDiff, c: mergeCell.e.c };\n this.setMergeCells(newStartAddr, newEndAddr);\n }\n }\n\n copyCell(sourceAddr: { r: number; c: number }, targetAddr: { r: number; c: number }): void {\n const sourceCellData = this._getCellData(sourceAddr);\n\n if (sourceCellData != null) {\n const newCellData = objClone(sourceCellData);\n newCellData.$.r = ExcelUtils.stringifyAddr(targetAddr);\n this._replaceCellData(targetAddr, newCellData);\n } else {\n this.deleteCell(targetAddr);\n }\n }\n\n cleanup(): void {\n const result = {} as ExcelXmlWorksheetData[\"worksheet\"];\n\n // \uC21C\uC11C \uC815\uB82C (\"sheetData\"\uAE30\uC900 \uC55E\uB4A4\uB85C, \uB098\uBA38\uC9C0\uB294 \uC6D0\uB798\uC704\uCE58\uB300\uB85C)\n\n for (const key of Object.keys(this.data.worksheet)) {\n if (key === \"mergeCells\") continue;\n if (key === \"cols\") continue;\n if (key === \"sheetViews\") continue;\n if (key === \"sheetFormatPr\") continue;\n\n if (key === \"sheetData\") {\n if (this.data.worksheet.sheetViews != null) {\n result.sheetViews = this.data.worksheet.sheetViews;\n }\n if (this.data.worksheet.sheetFormatPr != null) {\n result.sheetFormatPr = this.data.worksheet.sheetFormatPr;\n }\n if (this.data.worksheet.cols != null) {\n result.cols = this.data.worksheet.cols;\n }\n result.sheetData = this.data.worksheet.sheetData;\n\n if (this.data.worksheet.mergeCells != null) {\n result.mergeCells = this.data.worksheet.mergeCells;\n }\n } else {\n const worksheetRec = this.data.worksheet as Record<string, unknown>;\n const resultRec = result as Record<string, unknown>;\n resultRec[key] = worksheetRec[key];\n }\n }\n\n // ROW \uC815\uB82C\n const rowsData = (result.sheetData[0].row = result.sheetData[0].row ?? []);\n rowsData.sort((a, b) => (numParseInt(a.$.r) ?? 0) - (numParseInt(b.$.r) ?? 0));\n\n // CELL \uC815\uB82C\n for (const rowData of rowsData) {\n const cellsData = rowData.c;\n if (cellsData == null) continue;\n cellsData.sort((a, b) => ExcelUtils.parseCellAddrCode(a.$.r).c - ExcelUtils.parseCellAddrCode(b.$.r).c);\n }\n\n // Dimension \uAC12 \uC801\uC6A9\n if (result.dimension != null) {\n result.dimension[0].$.ref = ExcelUtils.stringifyRangeAddr(this.range);\n } else {\n result.dimension = [{ $: { ref: ExcelUtils.stringifyRangeAddr(this.range) } }];\n }\n\n this.data.worksheet = result;\n }\n\n private _getCellData(addr: { r: number; c: number }): ExcelCellData | undefined {\n return this._dataMap.get(addr.r)?.cellMap.get(addr.c);\n }\n\n private _getOrCreateCellData(addr: { r: number; c: number }): ExcelCellData {\n // ROW \uC5C6\uC73C\uBA74 \uB9CC\uB4E4\uAE30\n const rowInfo = this._getOrCreateRowInfo(addr.r);\n\n // CELL \uC5C6\uC73C\uBA74 \uB9CC\uB4E4\uAE30\n let cellData = rowInfo.cellMap.get(addr.c);\n if (cellData === undefined) {\n rowInfo.data.c = rowInfo.data.c ?? [];\n\n cellData = { $: { r: ExcelUtils.stringifyAddr(addr) }, v: [\"\"] };\n rowInfo.data.c.push(cellData);\n rowInfo.cellMap.set(addr.c, cellData);\n }\n\n return cellData;\n }\n\n private _getOrCreateRowInfo(r: number): RowInfo {\n const rowInfo = this._dataMap.get(r);\n if (rowInfo == null) {\n return this._replaceRowData(r, { $: { r: ExcelUtils.stringifyRowAddr(r) }, c: [] });\n }\n return rowInfo;\n }\n\n private _replaceRowData(r: number, rowData: ExcelRowData): RowInfo {\n this._deleteRow(r);\n\n // sheet\uC5D0 \uAE30\uB85D\n this.data.worksheet.sheetData[0].row = this.data.worksheet.sheetData[0].row ?? [];\n this.data.worksheet.sheetData[0].row.push(rowData);\n\n // cache\uC5D0 \uAE30\uB85D\n const rowInfo = {\n data: rowData,\n cellMap: (rowData.c ?? []).toMap(\n (cell) => ExcelUtils.parseColAddrCode(cell.$.r),\n (cell) => cell,\n ),\n };\n this._dataMap.set(r, rowInfo);\n\n return rowInfo;\n }\n\n private _replaceCellData(addr: { r: number; c: number }, cellData: ExcelCellData): void {\n this.deleteCell(addr);\n\n // ROW\n const targetRowInfo = this._getOrCreateRowInfo(addr.r);\n\n // sheet\uC5D0 \uAE30\uB85D\n targetRowInfo.data.c = targetRowInfo.data.c ?? [];\n targetRowInfo.data.c.push(cellData);\n\n // cache\uC5D0 \uAE30\uB85D\n targetRowInfo.cellMap.set(addr.c, cellData);\n }\n\n private _deleteRow(r: number): void {\n const targetRowInfo = this._dataMap.get(r);\n if (targetRowInfo != null) {\n const rows = this.data.worksheet.sheetData[0].row;\n if (rows) {\n const rowIndex = rows.indexOf(targetRowInfo.data);\n if (rowIndex !== -1) rows.splice(rowIndex, 1);\n }\n }\n this._dataMap.delete(r);\n\n // ROW\uAC00 \uD558\uB098\uB3C4 \uC5C6\uC73C\uBA74 XML\uC758 row\uBD80\uBD84 \uC790\uCCB4\uB97C \uC0AD\uC81C\n if (this.data.worksheet.sheetData[0].row?.length === 0) {\n delete this.data.worksheet.sheetData[0].row;\n }\n }\n}\n"],
5
4
  "mappings": "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",
6
5
  "names": []
7
6
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@simplysm/excel",
3
3
  "sideEffects": false,
4
- "version": "13.0.0-beta.46",
4
+ "version": "13.0.0-beta.47",
5
5
  "description": "Excel 파일 처리 라이브러리",
6
6
  "author": "김석래",
7
7
  "repository": {
@@ -14,11 +14,12 @@
14
14
  "main": "./dist/index.js",
15
15
  "types": "./dist/index.d.ts",
16
16
  "files": [
17
- "dist"
17
+ "dist",
18
+ "src"
18
19
  ],
19
20
  "dependencies": {
20
21
  "mime": "^4.1.0",
21
22
  "zod": "^4.3.6",
22
- "@simplysm/core-common": "13.0.0-beta.46"
23
+ "@simplysm/core-common": "13.0.0-beta.47"
23
24
  }
24
25
  }