@simplysm/excel 13.0.0-beta.7 → 13.0.2

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 (167) hide show
  1. package/README.md +15 -0
  2. package/dist/excel-cell.d.ts.map +1 -0
  3. package/dist/excel-cell.js +3 -3
  4. package/dist/excel-cell.js.map +0 -1
  5. package/dist/excel-col.d.ts.map +1 -0
  6. package/dist/excel-col.js +1 -1
  7. package/dist/excel-col.js.map +0 -1
  8. package/dist/excel-row.d.ts.map +1 -0
  9. package/dist/excel-row.js +1 -1
  10. package/dist/excel-row.js.map +0 -1
  11. package/dist/excel-workbook.d.ts.map +1 -0
  12. package/dist/excel-workbook.js +6 -6
  13. package/dist/excel-workbook.js.map +0 -1
  14. package/dist/excel-worksheet.d.ts.map +1 -0
  15. package/dist/excel-worksheet.js +4 -4
  16. package/dist/excel-worksheet.js.map +0 -1
  17. package/dist/excel-wrapper.d.ts.map +1 -0
  18. package/dist/excel-wrapper.js +1 -1
  19. package/dist/excel-wrapper.js.map +0 -1
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +8 -8
  22. package/dist/index.js.map +0 -1
  23. package/dist/types.d.ts.map +1 -0
  24. package/dist/types.js.map +0 -1
  25. package/dist/utils/excel-utils.d.ts.map +1 -0
  26. package/dist/utils/excel-utils.js.map +0 -1
  27. package/dist/utils/zip-cache.d.ts.map +1 -0
  28. package/dist/utils/zip-cache.js +8 -8
  29. package/dist/utils/zip-cache.js.map +0 -1
  30. package/dist/xml/excel-xml-content-type.d.ts.map +1 -0
  31. package/dist/xml/excel-xml-content-type.js.map +0 -1
  32. package/dist/xml/excel-xml-drawing.d.ts.map +1 -0
  33. package/dist/xml/excel-xml-drawing.js.map +0 -1
  34. package/dist/xml/excel-xml-relationship.d.ts.map +1 -0
  35. package/dist/xml/excel-xml-relationship.js.map +0 -1
  36. package/dist/xml/excel-xml-shared-string.d.ts.map +1 -0
  37. package/dist/xml/excel-xml-shared-string.js.map +0 -1
  38. package/dist/xml/excel-xml-style.d.ts.map +1 -0
  39. package/dist/xml/excel-xml-style.js.map +0 -1
  40. package/dist/xml/excel-xml-unknown.d.ts.map +1 -0
  41. package/dist/xml/excel-xml-unknown.js.map +0 -1
  42. package/dist/xml/excel-xml-workbook.d.ts.map +1 -0
  43. package/dist/xml/excel-xml-workbook.js.map +0 -1
  44. package/dist/xml/excel-xml-worksheet.d.ts.map +1 -0
  45. package/dist/xml/excel-xml-worksheet.js +1 -1
  46. package/dist/xml/excel-xml-worksheet.js.map +0 -1
  47. package/package.json +6 -5
  48. package/src/excel-cell.ts +326 -0
  49. package/src/excel-col.ts +43 -0
  50. package/src/excel-row.ts +37 -0
  51. package/src/excel-workbook.ts +206 -0
  52. package/src/excel-worksheet.ts +380 -0
  53. package/src/excel-wrapper.ts +219 -0
  54. package/src/index.ts +13 -0
  55. package/src/types.ts +396 -0
  56. package/src/utils/excel-utils.ts +201 -0
  57. package/src/utils/zip-cache.ts +103 -0
  58. package/src/xml/excel-xml-content-type.ts +64 -0
  59. package/src/xml/excel-xml-drawing.ts +87 -0
  60. package/src/xml/excel-xml-relationship.ts +86 -0
  61. package/src/xml/excel-xml-shared-string.ts +80 -0
  62. package/src/xml/excel-xml-style.ts +393 -0
  63. package/src/xml/excel-xml-unknown.ts +11 -0
  64. package/src/xml/excel-xml-workbook.ts +112 -0
  65. package/src/xml/excel-xml-worksheet.ts +544 -0
  66. package/dist/core-common/src/common.types.d.ts +0 -74
  67. package/dist/core-common/src/common.types.d.ts.map +0 -1
  68. package/dist/core-common/src/env.d.ts +0 -6
  69. package/dist/core-common/src/env.d.ts.map +0 -1
  70. package/dist/core-common/src/errors/argument-error.d.ts +0 -25
  71. package/dist/core-common/src/errors/argument-error.d.ts.map +0 -1
  72. package/dist/core-common/src/errors/not-implemented-error.d.ts +0 -29
  73. package/dist/core-common/src/errors/not-implemented-error.d.ts.map +0 -1
  74. package/dist/core-common/src/errors/sd-error.d.ts +0 -27
  75. package/dist/core-common/src/errors/sd-error.d.ts.map +0 -1
  76. package/dist/core-common/src/errors/timeout-error.d.ts +0 -31
  77. package/dist/core-common/src/errors/timeout-error.d.ts.map +0 -1
  78. package/dist/core-common/src/extensions/arr-ext.d.ts +0 -15
  79. package/dist/core-common/src/extensions/arr-ext.d.ts.map +0 -1
  80. package/dist/core-common/src/extensions/arr-ext.helpers.d.ts +0 -19
  81. package/dist/core-common/src/extensions/arr-ext.helpers.d.ts.map +0 -1
  82. package/dist/core-common/src/extensions/arr-ext.types.d.ts +0 -215
  83. package/dist/core-common/src/extensions/arr-ext.types.d.ts.map +0 -1
  84. package/dist/core-common/src/extensions/map-ext.d.ts +0 -57
  85. package/dist/core-common/src/extensions/map-ext.d.ts.map +0 -1
  86. package/dist/core-common/src/extensions/set-ext.d.ts +0 -36
  87. package/dist/core-common/src/extensions/set-ext.d.ts.map +0 -1
  88. package/dist/core-common/src/features/debounce-queue.d.ts +0 -53
  89. package/dist/core-common/src/features/debounce-queue.d.ts.map +0 -1
  90. package/dist/core-common/src/features/event-emitter.d.ts +0 -66
  91. package/dist/core-common/src/features/event-emitter.d.ts.map +0 -1
  92. package/dist/core-common/src/features/serial-queue.d.ts +0 -47
  93. package/dist/core-common/src/features/serial-queue.d.ts.map +0 -1
  94. package/dist/core-common/src/index.d.ts +0 -32
  95. package/dist/core-common/src/index.d.ts.map +0 -1
  96. package/dist/core-common/src/types/date-only.d.ts +0 -152
  97. package/dist/core-common/src/types/date-only.d.ts.map +0 -1
  98. package/dist/core-common/src/types/date-time.d.ts +0 -96
  99. package/dist/core-common/src/types/date-time.d.ts.map +0 -1
  100. package/dist/core-common/src/types/lazy-gc-map.d.ts +0 -80
  101. package/dist/core-common/src/types/lazy-gc-map.d.ts.map +0 -1
  102. package/dist/core-common/src/types/time.d.ts +0 -68
  103. package/dist/core-common/src/types/time.d.ts.map +0 -1
  104. package/dist/core-common/src/types/uuid.d.ts +0 -35
  105. package/dist/core-common/src/types/uuid.d.ts.map +0 -1
  106. package/dist/core-common/src/utils/bytes.d.ts +0 -51
  107. package/dist/core-common/src/utils/bytes.d.ts.map +0 -1
  108. package/dist/core-common/src/utils/date-format.d.ts +0 -90
  109. package/dist/core-common/src/utils/date-format.d.ts.map +0 -1
  110. package/dist/core-common/src/utils/json.d.ts +0 -34
  111. package/dist/core-common/src/utils/json.d.ts.map +0 -1
  112. package/dist/core-common/src/utils/num.d.ts +0 -60
  113. package/dist/core-common/src/utils/num.d.ts.map +0 -1
  114. package/dist/core-common/src/utils/obj.d.ts +0 -258
  115. package/dist/core-common/src/utils/obj.d.ts.map +0 -1
  116. package/dist/core-common/src/utils/path.d.ts +0 -23
  117. package/dist/core-common/src/utils/path.d.ts.map +0 -1
  118. package/dist/core-common/src/utils/primitive.d.ts +0 -18
  119. package/dist/core-common/src/utils/primitive.d.ts.map +0 -1
  120. package/dist/core-common/src/utils/str.d.ts +0 -103
  121. package/dist/core-common/src/utils/str.d.ts.map +0 -1
  122. package/dist/core-common/src/utils/template-strings.d.ts +0 -84
  123. package/dist/core-common/src/utils/template-strings.d.ts.map +0 -1
  124. package/dist/core-common/src/utils/transferable.d.ts +0 -47
  125. package/dist/core-common/src/utils/transferable.d.ts.map +0 -1
  126. package/dist/core-common/src/utils/wait.d.ts +0 -19
  127. package/dist/core-common/src/utils/wait.d.ts.map +0 -1
  128. package/dist/core-common/src/utils/xml.d.ts +0 -36
  129. package/dist/core-common/src/utils/xml.d.ts.map +0 -1
  130. package/dist/core-common/src/zip/sd-zip.d.ts +0 -80
  131. package/dist/core-common/src/zip/sd-zip.d.ts.map +0 -1
  132. package/dist/excel/src/excel-cell.d.ts.map +0 -1
  133. package/dist/excel/src/excel-col.d.ts.map +0 -1
  134. package/dist/excel/src/excel-row.d.ts.map +0 -1
  135. package/dist/excel/src/excel-workbook.d.ts.map +0 -1
  136. package/dist/excel/src/excel-worksheet.d.ts.map +0 -1
  137. package/dist/excel/src/excel-wrapper.d.ts.map +0 -1
  138. package/dist/excel/src/index.d.ts.map +0 -1
  139. package/dist/excel/src/types.d.ts.map +0 -1
  140. package/dist/excel/src/utils/excel-utils.d.ts.map +0 -1
  141. package/dist/excel/src/utils/zip-cache.d.ts.map +0 -1
  142. package/dist/excel/src/xml/excel-xml-content-type.d.ts.map +0 -1
  143. package/dist/excel/src/xml/excel-xml-drawing.d.ts.map +0 -1
  144. package/dist/excel/src/xml/excel-xml-relationship.d.ts.map +0 -1
  145. package/dist/excel/src/xml/excel-xml-shared-string.d.ts.map +0 -1
  146. package/dist/excel/src/xml/excel-xml-style.d.ts.map +0 -1
  147. package/dist/excel/src/xml/excel-xml-unknown.d.ts.map +0 -1
  148. package/dist/excel/src/xml/excel-xml-workbook.d.ts.map +0 -1
  149. package/dist/excel/src/xml/excel-xml-worksheet.d.ts.map +0 -1
  150. /package/dist/{excel/src/excel-cell.d.ts → excel-cell.d.ts} +0 -0
  151. /package/dist/{excel/src/excel-col.d.ts → excel-col.d.ts} +0 -0
  152. /package/dist/{excel/src/excel-row.d.ts → excel-row.d.ts} +0 -0
  153. /package/dist/{excel/src/excel-workbook.d.ts → excel-workbook.d.ts} +0 -0
  154. /package/dist/{excel/src/excel-worksheet.d.ts → excel-worksheet.d.ts} +0 -0
  155. /package/dist/{excel/src/excel-wrapper.d.ts → excel-wrapper.d.ts} +0 -0
  156. /package/dist/{excel/src/index.d.ts → index.d.ts} +0 -0
  157. /package/dist/{excel/src/types.d.ts → types.d.ts} +0 -0
  158. /package/dist/{excel/src/utils → utils}/excel-utils.d.ts +0 -0
  159. /package/dist/{excel/src/utils → utils}/zip-cache.d.ts +0 -0
  160. /package/dist/{excel/src/xml → xml}/excel-xml-content-type.d.ts +0 -0
  161. /package/dist/{excel/src/xml → xml}/excel-xml-drawing.d.ts +0 -0
  162. /package/dist/{excel/src/xml → xml}/excel-xml-relationship.d.ts +0 -0
  163. /package/dist/{excel/src/xml → xml}/excel-xml-shared-string.d.ts +0 -0
  164. /package/dist/{excel/src/xml → xml}/excel-xml-style.d.ts +0 -0
  165. /package/dist/{excel/src/xml → xml}/excel-xml-unknown.d.ts +0 -0
  166. /package/dist/{excel/src/xml → xml}/excel-xml-workbook.d.ts +0 -0
  167. /package/dist/{excel/src/xml → xml}/excel-xml-worksheet.d.ts +0 -0
@@ -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": "AAUA,OAAO;AACP,SAAS,aAAa,UAAU,gBAAgB;AAezC,MAAM,cAAkC;AAAA,EAC7C;AAAA,EAEA,YAAY,MAA0B;AACpC,QAAI,SAAS,QAAW;AACtB,WAAK,OAAO;AAAA,QACV,YAAY;AAAA,UACV,GAAG;AAAA,YACD,OAAO;AAAA,UACT;AAAA,UACA,OAAO;AAAA,YACL;AAAA,cACE,GAAG,EAAE,OAAO,IAAI;AAAA,cAChB,MAAM,CAAC,CAAC,CAAC;AAAA,YACX;AAAA,UACF;AAAA,UACA,OAAO;AAAA,YACL;AAAA,cACE,GAAG,EAAE,OAAO,IAAI;AAAA,cAChB,MAAM;AAAA,gBACJ,EAAE,aAAa,CAAC,EAAE,GAAG,EAAE,aAAa,OAAO,EAAE,CAAC,EAAE;AAAA,gBAChD,EAAE,aAAa,CAAC,EAAE,GAAG,EAAE,aAAa,UAAU,EAAE,CAAC,EAAE;AAAA,cACrD;AAAA,YACF;AAAA,UACF;AAAA,UACA,SAAS;AAAA,YACP;AAAA,cACE,GAAG,EAAE,OAAO,IAAI;AAAA,cAChB,QAAQ,CAAC,CAAC,CAAC;AAAA,YACb;AAAA,UACF;AAAA,UACA,SAAS;AAAA,YACP;AAAA,cACE,GAAG,EAAE,OAAO,IAAI;AAAA,cAChB,IAAI,CAAC,EAAE,GAAG,EAAE,UAAU,IAAI,EAAE,CAAC;AAAA,YAC/B;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK,OAAO;AAAA,IACd;AAAA,EACF;AAAA,EAEA,IAAI,OAA2B;AAC7B,UAAM,QAA6B,EAAE,GAAG,CAAC,EAAE;AAE3C,QAAI,MAAM,aAAa,QAAW;AAChC,YAAM,EAAE,WAAW,MAAM;AAAA,IAC3B;AAEA,QAAI,MAAM,eAAe,QAAW;AAClC,YAAM,EAAE,WAAW,KAAK,eAAe,MAAM,UAAU;AACvD,YAAM,EAAE,oBAAoB;AAAA,IAC9B;AAEA,QAAI,MAAM,eAAe,QAAW;AAClC,YAAM,UAAiC;AAAA,QACrC,aAAa;AAAA,UACX;AAAA,YACE,GAAG,EAAE,aAAa,QAAQ;AAAA,YAC1B,SAAS,CAAC,EAAE,GAAG,EAAE,KAAK,MAAM,WAAW,YAAY,EAAE,EAAE,CAAC;AAAA,UAC1D;AAAA,QACF;AAAA,MACF;AAEA,YAAM,EAAE,YAAY;AACpB,YAAM,EAAE,SAAS,KAAK,qBAAqB,OAAO;AAAA,IACpD;AAEA,QAAI,MAAM,WAAW,QAAW;AAC9B,YAAM,YAAY,KAAK,2BAA2B,MAAM,MAAM;AAC9D,YAAM,EAAE,cAAc;AACtB,YAAM,EAAE,WAAW,KAAK,uBAAuB,SAAS;AAAA,IAC1D;AAEA,SAAK,gBAAgB,OAAO,KAAK;AAEjC,WAAO,KAAK,mBAAmB,KAAK;AAAA,EACtC;AAAA,EAEA,aAAa,IAAY,OAA2B;AAClD,UAAM,QAAQ,YAAY,EAAE;AAC5B,QAAI,SAAS,MAAM;AACjB,YAAM,IAAI,MAAM,6CAAe,EAAE,EAAE;AAAA,IACrC;AACA,UAAM,UAAU,KAAK,KAAK,WAAW,QAAQ,CAAC,EAAE;AAChD,QAAI,QAAQ,KAAK,SAAS,QAAQ,QAAQ;AACxC,YAAM,IAAI,MAAM,gEAAmB,EAAE,qBAAW,QAAQ,SAAS,CAAC,GAAG;AAAA,IACvE;AACA,UAAM,SAAS,QAAQ,KAAK;AAC5B,UAAM,UAAU,SAAS,MAAM;AAE/B,QAAI,MAAM,aAAa,QAAW;AAChC,cAAQ,EAAE,WAAW,MAAM;AAAA,IAC7B;AAEA,QAAI,MAAM,eAAe,QAAW;AAClC,cAAQ,EAAE,WAAW,KAAK,eAAe,MAAM,UAAU;AACzD,cAAQ,EAAE,oBAAoB;AAAA,IAChC;AAEA,QAAI,MAAM,eAAe,QAAW;AAClC,YAAM,YAAY,QAAQ,EAAE,WAAW,SAAY,YAAY,QAAQ,EAAE,MAAM,IAAI;AACnF,YAAM,WAAW,cAAc,SAAY,KAAK,KAAK,WAAW,MAAM,CAAC,EAAE,KAAK,SAAS,IAAI;AAE3F,UAAI,YAAY,MAAM;AACpB,cAAM,YAAY,SAAS,QAAQ;AACnC,kBAAU,YAAY,CAAC,EAAE,EAAE,cAAc;AAEzC,YAAI,UAAU,YAAY,CAAC,EAAE,WAAW,MAAM;AAC5C,oBAAU,YAAY,CAAC,EAAE,UAAU,CAAC,EAAE,GAAG,EAAE,KAAK,MAAM,WAAW,EAAE,CAAC;AAAA,QACtE,OAAO;AACL,oBAAU,YAAY,CAAC,EAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,MAAM;AAAA,QACpD;AAEA,gBAAQ,EAAE,YAAY;AACtB,gBAAQ,EAAE,SAAS,KAAK,qBAAqB,SAAS;AAAA,MACxD,OAAO;AACL,cAAM,UAAiC;AAAA,UACrC,aAAa;AAAA,YACX;AAAA,cACE,GAAG,EAAE,aAAa,QAAQ;AAAA,cAC1B,SAAS,CAAC,EAAE,GAAG,EAAE,KAAK,MAAM,WAAW,YAAY,EAAE,EAAE,CAAC;AAAA,YAC1D;AAAA,UACF;AAAA,QACF;AACA,gBAAQ,EAAE,YAAY;AACtB,gBAAQ,EAAE,SAAS,KAAK,qBAAqB,OAAO;AAAA,MACtD;AAAA,IACF;AAEA,QAAI,MAAM,WAAW,QAAW;AAC9B,YAAM,cAAc,QAAQ,EAAE,aAAa,SAAY,YAAY,QAAQ,EAAE,QAAQ,IAAI;AACzF,YAAM,aAAa,gBAAgB,SAAY,KAAK,KAAK,WAAW,QAAQ,CAAC,EAAE,OAAO,WAAW,IAAI;AAErG,UAAI,cAAc,MAAM;AACtB,cAAM,cAAc,SAAS,UAAU;AACvC,aAAK,qBAAqB,aAAa,QAAQ,MAAM,OAAO,SAAS,MAAM,CAAC;AAC5E,aAAK,qBAAqB,aAAa,SAAS,MAAM,OAAO,SAAS,OAAO,CAAC;AAC9E,aAAK,qBAAqB,aAAa,OAAO,MAAM,OAAO,SAAS,KAAK,CAAC;AAC1E,aAAK,qBAAqB,aAAa,UAAU,MAAM,OAAO,SAAS,QAAQ,CAAC;AAEhF,gBAAQ,EAAE,cAAc;AACxB,gBAAQ,EAAE,WAAW,KAAK,uBAAuB,WAAW;AAAA,MAC9D,OAAO;AACL,cAAM,YAAY,KAAK,2BAA2B,MAAM,MAAM;AAC9D,gBAAQ,EAAE,cAAc;AACxB,gBAAQ,EAAE,WAAW,KAAK,uBAAuB,SAAS;AAAA,MAC5D;AAAA,IACF;AAEA,SAAK,gBAAgB,SAAS,KAAK;AAEnC,WAAO,KAAK,mBAAmB,OAAO;AAAA,EACxC;AAAA,EAEA,IAAI,IAAwB;AAvL9B;AAwLI,UAAM,QAAQ,YAAY,EAAE;AAC5B,QAAI,SAAS,MAAM;AACjB,YAAM,IAAI,MAAM,6CAAe,EAAE,EAAE;AAAA,IACrC;AACA,UAAM,KAAK,KAAK,KAAK,WAAW,QAAQ,CAAC,EAAE,GAAG,KAAK;AAEnD,UAAM,SAAqB,CAAC;AAE5B,QAAI,OAAO,QAAW;AACpB,aAAO,WAAW,GAAG,EAAE;AAEvB,UAAI,GAAG,EAAE,WAAW,QAAW;AAC7B,cAAM,YAAY,YAAY,GAAG,EAAE,MAAM;AACzC,YAAI,aAAa,MAAM;AACrB,gBAAM,OAAO,KAAK,KAAK,WAAW,MAAM,CAAC,EAAE,KAAK,SAAS;AACzD,cAAI,QAAQ,MAAM;AAChB,kBAAM,IAAI;AAAA,cACR,kDAAoB,GAAG,EAAE,MAAM,qBAAW,KAAK,KAAK,WAAW,MAAM,CAAC,EAAE,KAAK,SAAS,CAAC;AAAA,YACzF;AAAA,UACF;AACA,iBAAO,cAAa,UAAK,YAAY,CAAC,EAAE,YAApB,mBAA8B,GAAG,EAAE;AAAA,QACzD;AAAA,MACF;AAEA,UAAI,GAAG,EAAE,aAAa,QAAW;AAC/B,cAAM,cAAc,YAAY,GAAG,EAAE,QAAQ;AAC7C,YAAI,eAAe,MAAM;AACvB,gBAAM,IAAI,MAAM,iCAAkB,GAAG,EAAE,QAAQ,EAAE;AAAA,QACnD;AACA,cAAM,SAAS,KAAK,KAAK,WAAW,QAAQ,CAAC,EAAE,OAAO,WAAW;AACjE,YAAI,UAAU,MAAM;AAClB,gBAAM,IAAI;AAAA,YACR,oDAAsB,GAAG,EAAE,QAAQ,qBAAW,KAAK,KAAK,WAAW,QAAQ,CAAC,EAAE,OAAO,SAAS,CAAC;AAAA,UACjG;AAAA,QACF;AACA,YAAI,OAAO,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,SAAS,QAAQ,OAAO,UAAU,MAAM;AAC9F,iBAAO,SAAS,CAAC;AACjB,cAAI,OAAO,QAAQ,MAAM;AACvB,mBAAO,OAAO,KAAK,MAAM;AAAA,UAC3B;AACA,cAAI,OAAO,SAAS,MAAM;AACxB,mBAAO,OAAO,KAAK,OAAO;AAAA,UAC5B;AACA,cAAI,OAAO,OAAO,MAAM;AACtB,mBAAO,OAAO,KAAK,KAAK;AAAA,UAC1B;AACA,cAAI,OAAO,UAAU,MAAM;AACzB,mBAAO,OAAO,KAAK,QAAQ;AAAA,UAC7B;AAAA,QACF;AAAA,MACF;AAEA,aAAO,iBAAgB,QAAG,cAAH,mBAAe,GAAG,EAAE;AAC3C,aAAO,mBAAkB,QAAG,cAAH,mBAAe,GAAG,EAAE;AAAA,IAC/C;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,cAAc,UAAsC;AAnPtD;AAoPI,YAAQ,kBAAK,KAAK,WAAW,YAArB,mBAA+B,GAAG,WAAU,CAAC,GAAG,OAAO,CAAC,SAAS,KAAK,EAAE,aAAa,QAAQ,MAA7F,mBAAgG,EACrG;AAAA,EACL;AAAA,EAEA,UAAgB;AACd,UAAM,SAAS,CAAC;AAIhB,QAAI,KAAK,KAAK,WAAW,WAAW,MAAM;AACxC,aAAO,UAAU,KAAK,KAAK,WAAW;AAAA,IACxC;AAEA,UAAM,gBAAgB,KAAK,KAAK;AAChC,UAAM,YAAY;AAClB,eAAW,OAAO,OAAO,KAAK,aAAa,GAAG;AAC5C,UAAI,QAAQ,UAAW;AAEvB,gBAAU,GAAG,IAAI,cAAc,GAAG;AAAA,IACpC;AAEA,SAAK,KAAK,aAAa;AAAA,EACzB;AAAA;AAAA,EAIQ,eAAe,YAA4B;AA9QrD;AAgRI,UAAM,kBAAkB,kBAAK,KAAK,WAAW,YAArB,mBAA+B,GAAG,WAAU,CAAC,GAAG;AAAA,MACtE,CAAC,SAAS,KAAK,EAAE,eAAe;AAAA,IAClC,MAFwB,mBAErB,EAAE;AACL,QAAI,kBAAkB,MAAM;AAC1B,aAAO;AAAA,IACT;AAEA,SAAK,KAAK,WAAW,UAAU,KAAK,KAAK,WAAW,WAAW;AAAA,MAC7D;AAAA,QACE,GAAG,EAAE,OAAO,IAAI;AAAA,QAChB,QAAQ,CAAC;AAAA,MACX;AAAA,IACF;AAEA,SAAK,KAAK,WAAW,QAAQ,CAAC,EAAE,SAAS,KAAK,KAAK,WAAW,QAAQ,CAAC,EAAE,UAAU,CAAC;AAGpF,UAAM,UAAU,KAAK,KAAK,WAAW,QAAQ,CAAC,EAAE;AAChD,UAAM,UACJ,QAAQ,SAAS,IAAI,QAAQ,YAAY,CAAC,SAAS,YAAY,KAAK,EAAE,QAAQ,KAAK,GAAG,EAAE,MAAM,IAAI;AACpG,UAAM,QAAQ,UAAW,YAAY,QAAQ,EAAE,QAAQ,KAAK,MAAO;AACnE,UAAM,gBAAgB,QAAQ,GAAG,SAAS;AAC1C,SAAK,KAAK,WAAW,QAAQ,CAAC,EAAE,OAAO,KAAK;AAAA,MAC1C,GAAG;AAAA,QACD,UAAU;AAAA,QACV,YAAY;AAAA,MACd;AAAA,IACF,CAAC;AACD,SAAK,KAAK,WAAW,QAAQ,CAAC,EAAE,EAAE,UAC/B,YAAY,KAAK,KAAK,WAAW,QAAQ,CAAC,EAAE,EAAE,KAAK,KAAK,KAAK,GAC9D,SAAS;AAEX,WAAO;AAAA,EACT;AAAA,EAEQ,gBAAgB,IAAyB,OAAyB;AACxE,QAAI,MAAM,kBAAkB,QAAW;AACrC,SAAG,EAAE,iBAAiB;AACtB,UAAI,GAAG,aAAa,MAAM;AACxB,WAAG,YAAY,CAAC,EAAE,GAAG,EAAE,UAAU,MAAM,cAAc,EAAE,CAAC;AAAA,MAC1D,OAAO;AACL,WAAG,UAAU,CAAC,EAAE,EAAE,WAAW,MAAM;AAAA,MACrC;AAAA,IACF;AAEA,QAAI,MAAM,oBAAoB,QAAW;AACvC,SAAG,EAAE,iBAAiB;AACtB,UAAI,GAAG,aAAa,MAAM;AACxB,WAAG,YAAY,CAAC,EAAE,GAAG,EAAE,YAAY,MAAM,gBAAgB,EAAE,CAAC;AAAA,MAC9D,OAAO;AACL,WAAG,UAAU,CAAC,EAAE,EAAE,aAAa,MAAM;AAAA,MACvC;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,2BAA2B,WAA2D;AAC5F,WAAO;AAAA,MACL,GAAI,UAAU,SAAS,MAAM,IAAI,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,OAAO,OAAO,GAAG,OAAO,CAAC,EAAE,GAAG,EAAE,KAAK,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC;AAAA,MAC9G,GAAI,UAAU,SAAS,OAAO,IAC1B,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,OAAO,OAAO,GAAG,OAAO,CAAC,EAAE,GAAG,EAAE,KAAK,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,IACzE,CAAC;AAAA,MACL,GAAI,UAAU,SAAS,KAAK,IAAI,EAAE,KAAK,CAAC,EAAE,GAAG,EAAE,OAAO,OAAO,GAAG,OAAO,CAAC,EAAE,GAAG,EAAE,KAAK,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC;AAAA,MAC5G,GAAI,UAAU,SAAS,QAAQ,IAC3B,EAAE,QAAQ,CAAC,EAAE,GAAG,EAAE,OAAO,OAAO,GAAG,OAAO,CAAC,EAAE,GAAG,EAAE,KAAK,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,IAC1E,CAAC;AAAA,IACP;AAAA,EACF;AAAA,EAEQ,qBAAqB,QAAiC,UAA+B,SAAwB;AACnH,QAAI,SAAS;AACX,YAAM,WAAW,OAAO,QAAQ;AAChC,UAAI,YAAY,MAAM;AACpB,eAAO,QAAQ,IAAI,CAAC,EAAE,GAAG,EAAE,OAAO,OAAO,GAAG,OAAO,CAAC,EAAE,GAAG,EAAE,KAAK,WAAW,EAAE,CAAC,EAAE,CAAC;AAAA,MACnF,WAAW,SAAS,CAAC,EAAE,SAAS,MAAM;AACpC,iBAAS,CAAC,EAAE,QAAQ,CAAC,EAAE,GAAG,EAAE,KAAK,WAAW,EAAE,CAAC;AAAA,MACjD,OAAO;AACL,iBAAS,CAAC,EAAE,MAAM,CAAC,EAAE,EAAE,MAAM;AAAA,MAC/B;AAAA,IACF,OAAO;AACL,aAAO,OAAO,QAAQ;AAAA,IACxB;AAAA,EACF;AAAA,EAEQ,mBAAmB,QAAqC;AAC9D,UAAM,aAAa,KAAK,KAAK,WAAW,QAAQ,CAAC,EAAE,GAAG,OAAO,CAAC,SAAS,SAAS,MAAM,MAAM,CAAC;AAE7F,QAAI,cAAc,MAAM;AACtB,aAAO,KAAK,KAAK,WAAW,QAAQ,CAAC,EAAE,GAAG,QAAQ,UAAU,EAAE,SAAS;AAAA,IACzE,OAAO;AACL,WAAK,KAAK,WAAW,QAAQ,CAAC,EAAE,GAAG,KAAK,MAAM;AAC9C,WAAK,KAAK,WAAW,QAAQ,CAAC,EAAE,EAAE,QAAQ,KAAK,KAAK,WAAW,QAAQ,CAAC,EAAE,GAAG,OAAO,SAAS;AAC7F,cAAQ,KAAK,KAAK,WAAW,QAAQ,CAAC,EAAE,GAAG,SAAS,GAAG,SAAS;AAAA,IAClE;AAAA,EACF;AAAA,EAEQ,qBAAqB,UAAyC;AACpE,UAAM,eAAe,KAAK,KAAK,WAAW,MAAM,CAAC,EAAE,KAAK,OAAO,CAAC,SAAS,SAAS,MAAM,QAAQ,CAAC;AAEjG,QAAI,gBAAgB,MAAM;AACxB,aAAO,KAAK,KAAK,WAAW,MAAM,CAAC,EAAE,KAAK,QAAQ,YAAY,EAAE,SAAS;AAAA,IAC3E,OAAO;AACL,WAAK,KAAK,WAAW,MAAM,CAAC,EAAE,KAAK,KAAK,QAAQ;AAChD,WAAK,KAAK,WAAW,MAAM,CAAC,EAAE,EAAE,QAAQ,KAAK,KAAK,WAAW,MAAM,CAAC,EAAE,KAAK,OAAO,SAAS;AAC3F,cAAQ,KAAK,KAAK,WAAW,MAAM,CAAC,EAAE,KAAK,SAAS,GAAG,SAAS;AAAA,IAClE;AAAA,EACF;AAAA,EAEQ,uBAAuB,YAA6C;AAC1E,UAAM,iBAAiB,KAAK,KAAK,WAAW,QAAQ,CAAC,EAAE,OAAO,OAAO,CAAC,SAAS,SAAS,MAAM,UAAU,CAAC;AAEzG,QAAI,kBAAkB,MAAM;AAC1B,aAAO,KAAK,KAAK,WAAW,QAAQ,CAAC,EAAE,OAAO,QAAQ,cAAc,EAAE,SAAS;AAAA,IACjF,OAAO;AACL,WAAK,KAAK,WAAW,QAAQ,CAAC,EAAE,OAAO,KAAK,UAAU;AACtD,WAAK,KAAK,WAAW,QAAQ,CAAC,EAAE,EAAE,QAAQ,KAAK,KAAK,WAAW,QAAQ,CAAC,EAAE,OAAO,OAAO,SAAS;AACjG,cAAQ,KAAK,KAAK,WAAW,QAAQ,CAAC,EAAE,OAAO,SAAS,GAAG,SAAS;AAAA,IACtE;AAAA,EACF;AAAA;AAGF;",
6
5
  "names": []
7
6
  }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"excel-xml-unknown.d.ts","sourceRoot":"","sources":["../../src/xml/excel-xml-unknown.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC;;;GAGG;AACH,qBAAa,eAAgB,YAAW,QAAQ;aAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;gBAA7B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAEzD,OAAO,IAAI,IAAI;CAChB"}
@@ -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
  }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"excel-xml-workbook.d.ts","sourceRoot":"","sources":["../../src/xml/excel-xml-workbook.ts"],"names":[],"mappings":"AAAA,OAAO,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAE/D;;;GAGG;AACH,qBAAa,gBAAiB,YAAW,QAAQ;IAC/C,IAAI,EAAE,oBAAoB,CAAC;gBAEf,IAAI,CAAC,EAAE,oBAAoB;IAevC,IAAI,WAAW,IAAI,MAAM,GAAG,SAAS,CAKpC;IAED,IAAI,UAAU,IAAI,MAAM,EAAE,CAEzB;IAED,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAiBhC,OAAO,IAAI,IAAI;IAwBf,cAAc,IAAI,IAAI;IAItB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIlD,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIpD,oBAAoB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIpD,oBAAoB,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IASvD,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,gBAAgB;CAIzB"}
@@ -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
  }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"excel-xml-worksheet.d.ts","sourceRoot":"","sources":["../../src/xml/excel-xml-worksheet.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { ExcelUtils } from "../utils/excel-utils";
1
+ import { ExcelUtils } from "../utils/excel-utils.js";
2
2
  import { numParseInt, objClone } from "@simplysm/core-common";
3
3
  import "@simplysm/core-common";
4
4
  class ExcelXmlWorksheet {
@@ -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": "AAQA,SAAS,kBAAkB;AAC3B,SAAS,aAAa,gBAAgB;AACtC,OAAO;AAWA,MAAM,kBAAsC;AAAA,EACjD;AAAA,EAEiB;AAAA,EAEjB,YAAY,MAA8B;AACxC,QAAI,SAAS,QAAW;AACtB,WAAK,OAAO;AAAA,QACV,WAAW;AAAA,UACT,GAAG;AAAA,YACD,OAAO;AAAA,UACT;AAAA,UACA,WAAW;AAAA,YACT;AAAA,cACE,GAAG;AAAA,gBACD,KAAK;AAAA,cACP;AAAA,YACF;AAAA,UACF;AAAA,UACA,WAAW,CAAC,CAAC,CAAC;AAAA,QAChB;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK,OAAO;AAAA,IACd;AAEA,SAAK,YAAY,KAAK,KAAK,UAAU,UAAU,CAAC,EAAE,OAAO,CAAC,GAAG;AAAA,MAC3D,CAAC,QAAQ,WAAW,iBAAiB,IAAI,EAAE,CAAC;AAAA,MAC5C,CAAC,SAAS;AAAA,QACR,MAAM;AAAA,QACN,UAAU,IAAI,KAAK,CAAC,GAAG;AAAA,UACrB,CAAC,SAAS,WAAW,iBAAiB,KAAK,EAAE,CAAC;AAAA,UAC9C,CAAC,SAAS;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,IAAI,QAAgC;AAClC,QAAI,SAAS;AACb,QAAI,SAAS;AAEb,eAAW,CAAC,QAAQ,IAAI,KAAK,KAAK,SAAS,QAAQ,GAAG;AACpD,UAAI,SAAS,OAAQ,UAAS;AAE9B,iBAAW,OAAO,KAAK,QAAQ,KAAK,GAAG;AACrC,YAAI,MAAM,OAAQ,UAAS;AAAA,MAC7B;AAAA,IACF;AAEA,WAAO;AAAA,MACL,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,MAChB,GAAG,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,IAC5B;AAAA,EACF;AAAA,EAEA,YAAY,MAAgC,MAAuC;AACjF,UAAM,WAAW,KAAK,qBAAqB,IAAI;AAC/C,QAAI,QAAQ,MAAM;AAChB,eAAS,EAAE,IAAI;AAAA,IACjB,OAAO;AACL,aAAO,SAAS,EAAE;AAAA,IACpB;AAAA,EACF;AAAA,EAEA,YAAY,MAA2D;AAtFzE;AAuFI,YAAO,UAAK,aAAa,IAAI,MAAtB,mBAAyB,EAAE;AAAA,EACpC;AAAA,EAEA,WAAW,MAAgC,KAA+B;AACxE,UAAM,WAAW,KAAK,qBAAqB,IAAI;AAC/C,QAAI,QAAQ,QAAW;AACrB,aAAO,SAAS;AAAA,IAClB,OAAO;AACL,eAAS,IAAI,CAAC,GAAG;AAAA,IACnB;AAAA,EACF;AAAA,EAEA,WAAW,MAAoD;AAnGjE;AAoGI,UAAM,WAAW,KAAK,aAAa,IAAI;AACvC,UAAM,QAAM,0CAAU,MAAV,mBAAc,SAAM,4DAAU,OAAV,mBAAe,OAAf,mBAAmB,MAAnB,mBAAuB,OAAvB,mBAA2B;AAC3D,WAAO,OAAO,QAAQ,WAAW,MAAM;AAAA,EACzC;AAAA,EAEA,eAAe,MAAgC,KAA+B;AAC5E,UAAM,WAAW,KAAK,qBAAqB,IAAI;AAC/C,QAAI,QAAQ,QAAW;AACrB,aAAO,SAAS;AAAA,IAClB,OAAO;AACL,eAAS,IAAI,CAAC,GAAG;AAAA,IACnB;AAAA,EACF;AAAA,EAEA,eAAe,MAAoD;AAlHrE;AAmHI,UAAM,OAAM,gBAAK,aAAa,IAAI,MAAtB,mBAAyB,MAAzB,mBAA6B;AACzC,WAAO,OAAO,QAAQ,WAAW,MAAM;AAAA,EACzC;AAAA,EAEA,eAAe,MAAoD;AAvHrE;AAwHI,YAAO,UAAK,aAAa,IAAI,MAAtB,mBAAyB,EAAE;AAAA,EACpC;AAAA,EAEA,eAAe,MAAgC,SAAmC;AAChF,QAAI,WAAW,MAAM;AACnB,WAAK,qBAAqB,IAAI,EAAE,EAAE,IAAI;AAAA,IACxC,OAAO;AACL,aAAO,KAAK,qBAAqB,IAAI,EAAE,EAAE;AAAA,IAC3C;AAAA,EACF;AAAA,EAEA,WAAW,MAAsC;AAE/C,UAAM,UAAU,KAAK,SAAS,IAAI,KAAK,CAAC;AACxC,QAAI,WAAW,KAAM;AAGrB,UAAM,WAAW,QAAQ,QAAQ,IAAI,KAAK,CAAC;AAC3C,QAAI,YAAY,KAAM;AAGtB,UAAM,YAAY,QAAQ,KAAK;AAC/B,UAAM,YAAY,UAAU,QAAQ,QAAQ;AAC5C,QAAI,cAAc,GAAI,WAAU,OAAO,WAAW,CAAC;AACnD,YAAQ,QAAQ,OAAO,KAAK,CAAC;AAG7B,QAAI,QAAQ,QAAQ,SAAS,GAAG;AAC9B,WAAK,WAAW,KAAK,CAAC;AAAA,IACxB;AAAA,EACF;AAAA,EAEA,cAAc,WAAqC,SAAyC;AAC1F,UAAM,aAAc,KAAK,KAAK,UAAU,aAAa,KAAK,KAAK,UAAU,cAAc;AAAA,MACrF;AAAA,QACE,GAAG,EAAE,OAAO,IAAI;AAAA,QAChB,WAAW,CAAC;AAAA,MACd;AAAA,IACF;AAEA,UAAM,WAAW,EAAE,GAAG,WAAW,GAAG,QAAQ;AAG5C,UAAM,qBAAqB,WAAW,CAAC,EAAE;AACzC,eAAW,aAAa,oBAAoB;AAC1C,YAAM,gBAAgB,WAAW,mBAAmB,UAAU,EAAE,GAAG;AAEnE,UACE,SAAS,EAAE,KAAK,cAAc,EAAE,KAChC,SAAS,EAAE,KAAK,cAAc,EAAE,KAChC,SAAS,EAAE,KAAK,cAAc,EAAE,KAChC,SAAS,EAAE,KAAK,cAAc,EAAE,GAChC;AACA,cAAM,IAAI;AAAA,UACR,oEAAkB,UAAU,EAAE,GAAG,qCAAY,WAAW,mBAAmB,QAAQ,CAAC;AAAA,QACtF;AAAA,MACF;AAAA,IACF;AAEA,eAAW,CAAC,EAAE,UAAU,KAAK,EAAE,GAAG,EAAE,KAAK,WAAW,mBAAmB,QAAQ,EAAE,EAAE,CAAC;AACpF,eAAW,CAAC,EAAE,EAAE,QAAQ,WAAW,CAAC,EAAE,UAAU,OAAO,SAAS;AAGhE,aAAS,IAAI,UAAU,GAAG,KAAK,QAAQ,GAAG,KAAK;AAC7C,eAAS,IAAI,UAAU,GAAG,KAAK,QAAQ,GAAG,KAAK;AAC7C,cAAM,cAAc,EAAE,GAAG,EAAE;AAC3B,YAAI,YAAY,MAAM,UAAU,KAAK,YAAY,MAAM,UAAU,GAAG;AAClE,eAAK,WAAW,WAAW;AAAA,QAC7B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,gBAAgF;AAC9E,UAAM,aAAa,KAAK,KAAK,UAAU;AACvC,QAAI,eAAe,OAAW,QAAO,CAAC;AACtC,WAAO,WAAW,CAAC,EAAE,UAAU,IAAI,CAAC,SAAS,WAAW,mBAAmB,KAAK,EAAE,GAAG,CAAC;AAAA,EACxF;AAAA,EAEA,iBAAiB,UAAoC,QAAwC;AAC3F,QAAI,KAAK,KAAK,UAAU,cAAc,KAAM;AAE5C,UAAM,QAAQ,EAAE,GAAG,UAAU,GAAG,OAAO;AAEvC,UAAM,qBAAqB,KAAK,KAAK,UAAU,WAAW,CAAC,EAAE,UAAU,OAAO,CAAC,SAAS;AACtF,YAAM,YAAY,WAAW,mBAAmB,KAAK,EAAE,GAAG;AAC1D,aAAO,EACL,UAAU,EAAE,KAAK,MAAM,EAAE,KACzB,UAAU,EAAE,KAAK,MAAM,EAAE,KACzB,UAAU,EAAE,KAAK,MAAM,EAAE,KACzB,UAAU,EAAE,KAAK,MAAM,EAAE;AAAA,IAE7B,CAAC;AAED,QAAI,mBAAmB,WAAW,GAAG;AACnC,aAAO,KAAK,KAAK,UAAU;AAAA,IAC7B,OAAO;AACL,WAAK,KAAK,UAAU,WAAW,CAAC,EAAE,YAAY;AAC9C,WAAK,KAAK,UAAU,WAAW,CAAC,EAAE,EAAE,QAAQ,mBAAmB,OAAO,SAAS;AAAA,IACjF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,YAAY,UAAkB,OAAqB;AAvOrD;AAwOI,UAAM,iBAAiB,YAAY,QAAQ;AAC3C,QAAI,kBAAkB,MAAM;AAC1B,YAAM,IAAI,MAAM,iDAAc,QAAQ,EAAE;AAAA,IAC1C;AAEA,UAAM,QAAO,UAAK,KAAK,UAAU,SAApB,mBAA2B;AAGxC,UAAM,MAAM,OACR,KAAK,IAAI;AAAA,MACP,CAAC,UACE,YAAY,KAAK,EAAE,GAAG,KAAK,MAAM,mBAAmB,YAAY,KAAK,EAAE,GAAG,KAAK,MAAM;AAAA,IAC1F,IACA;AAEJ,QAAI,OAAO,QAAQ,QAAQ,MAAM;AAC/B,UAAI,IAAI,EAAE,QAAQ,IAAI,EAAE,KAAK;AAE3B,YAAI,EAAE,UAAU;AAChB,YAAI,EAAE,cAAc;AACpB,YAAI,EAAE,QAAQ;AAAA,MAChB,OAAO;AAIL,cAAM,YAAY,YAAY,IAAI,EAAE,GAAG,KAAK;AAC5C,cAAM,YAAY,YAAY,IAAI,EAAE,GAAG,KAAK;AAE5C,YAAI,cAAc,KAAK,IAAI,QAAQ,GAAG;AAGtC,YAAI,YAAY,gBAAgB;AAC9B,eAAK,IAAI,OAAO,aAAa,GAAG;AAAA,YAC9B,GAAG;AAAA,cACD,GAAG,IAAI;AAAA,cACP,KAAK,IAAI,EAAE;AAAA,cACX,MAAM,iBAAiB,GAAG,SAAS;AAAA,YACrC;AAAA,UACF,CAAC;AACD;AAAA,QACF;AAGA,aAAK,IAAI,OAAO,aAAa,GAAG;AAAA,UAC9B,GAAG;AAAA,YACD,KAAK;AAAA,YACL,KAAK;AAAA,YACL,SAAS;AAAA,YACT,aAAa;AAAA,YACb;AAAA,UACF;AAAA,QACF,CAAC;AACD;AAGA,YAAI,YAAY,gBAAgB;AAC9B,eAAK,IAAI,OAAO,aAAa,GAAG;AAAA,YAC9B,GAAG;AAAA,cACD,GAAG,IAAI;AAAA,cACP,MAAM,iBAAiB,GAAG,SAAS;AAAA,cACnC,KAAK,IAAI,EAAE;AAAA,YACb;AAAA,UACF,CAAC;AAAA,QACH;AAGA,cAAM,YAAY,KAAK,IAAI,QAAQ,GAAG;AACtC,YAAI,cAAc,GAAI,MAAK,IAAI,OAAO,WAAW,CAAC;AAAA,MACpD;AAAA,IACF,OAAO;AAEL,WAAK,KAAK,UAAU,OAAO,KAAK,KAAK,UAAU,QAAQ,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC;AACnE,WAAK,KAAK,UAAU,KAAK,CAAC,EAAE,IAAI,KAAK;AAAA,QACnC,GAAG;AAAA,UACD,KAAK;AAAA,UACL,KAAK;AAAA,UACL,SAAS;AAAA,UACT,aAAa;AAAA,UACb;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,QAAQ,SAAuB;AAC7B,SAAK,KAAK,UAAU,aAAa,KAAK,KAAK,UAAU,cAAc;AAAA,MACjE,EAAE,WAAW,CAAC,EAAE,GAAG,EAAE,gBAAgB,IAAI,EAAE,CAAC,EAAE;AAAA,IAChD;AAEA,SAAK,KAAK,UAAU,WAAW,CAAC,EAAE,UAAU,CAAC,EAAE,EAAE,YAAY,QAAQ,SAAS;AAAA,EAChF;AAAA,EAEA,OAAO,OAAyC;AAC9C,SAAK,KAAK,UAAU,aAAa,KAAK,KAAK,UAAU,cAAc;AAAA,MACjE,EAAE,WAAW,CAAC,EAAE,GAAG,EAAE,gBAAgB,IAAI,EAAE,CAAC,EAAE;AAAA,IAChD;AAEA,SAAK,KAAK,UAAU,WAAW,CAAC,EAAE,UAAU,CAAC,EAAE,OAAO;AAAA,MACpD;AAAA,QACE,GAAG;AAAA,UACD,GAAI,MAAM,KAAK,OACX;AAAA,YACE,SAAS,MAAM,IAAI,GAAG,SAAS;AAAA,UACjC,IACA,CAAC;AAAA,UACL,GAAI,MAAM,KAAK,OACX;AAAA,YACE,SAAS,MAAM,IAAI,GAAG,SAAS;AAAA,UACjC,IACA,CAAC;AAAA,UACL,aAAa,WAAW,cAAc;AAAA,YACpC,IAAI,MAAM,KAAK,MAAM;AAAA,YACrB,IAAI,MAAM,KAAK,MAAM;AAAA,UACvB,CAAC;AAAA,UACD,YAAY,MAAM,KAAK,OAAO,aAAa,MAAM,KAAK,OAAO,eAAe;AAAA,UAC5E,OAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,QAAQ,SAAiB,SAAuB;AAE9C,UAAM,gBAAgB,KAAK,SAAS,IAAI,OAAO;AAE/C,QAAI,iBAAiB,MAAM;AAEzB,YAAM,aAA2B,SAAS,cAAc,IAAI;AAG5D,iBAAW,EAAE,IAAI,WAAW,iBAAiB,OAAO;AAGpD,UAAI,WAAW,KAAK,MAAM;AACxB,mBAAW,YAAY,WAAW,GAAG;AACnC,gBAAM,UAAU,WAAW,iBAAiB,SAAS,EAAE,CAAC;AACxD,mBAAS,EAAE,IAAI,WAAW,cAAc,EAAE,GAAG,SAAS,GAAG,QAAQ,CAAC;AAAA,QACpE;AAAA,MACF;AAEA,WAAK,gBAAgB,SAAS,UAAU;AAAA,IAC1C,OAAO;AACL,WAAK,WAAW,OAAO;AAAA,IACzB;AAGA,UAAM,mBAAmB,KAAK,cAAc,EACzC,OAAO,CAAC,OAAO,GAAG,EAAE,KAAK,WAAW,GAAG,EAAE,KAAK,OAAO,EACrD,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE;AAGnD,eAAW,aAAa,KAAK,cAAc,GAAG;AAC5C,UAAI,UAAU,EAAE,KAAK,WAAW,UAAU,EAAE,KAAK,SAAS;AACxD,aAAK,iBAAiB,UAAU,GAAG,UAAU,CAAC;AAAA,MAChD;AAAA,IACF;AAGA,eAAW,aAAa,kBAAkB;AACxC,YAAM,UAAU,UAAU;AAC1B,YAAM,eAAe,EAAE,GAAG,UAAU,EAAE,IAAI,SAAS,GAAG,UAAU,EAAE,EAAE;AACpE,YAAM,aAAa,EAAE,GAAG,UAAU,EAAE,IAAI,SAAS,GAAG,UAAU,EAAE,EAAE;AAClE,WAAK,cAAc,cAAc,UAAU;AAAA,IAC7C;AAAA,EACF;AAAA,EAEA,SAAS,YAAsC,YAA4C;AACzF,UAAM,iBAAiB,KAAK,aAAa,UAAU;AAEnD,QAAI,kBAAkB,MAAM;AAC1B,YAAM,cAAc,SAAS,cAAc;AAC3C,kBAAY,EAAE,IAAI,WAAW,cAAc,UAAU;AACrD,WAAK,iBAAiB,YAAY,WAAW;AAAA,IAC/C,OAAO;AACL,WAAK,WAAW,UAAU;AAAA,IAC5B;AAAA,EACF;AAAA,EAEA,UAAgB;AACd,UAAM,SAAS,CAAC;AAIhB,eAAW,OAAO,OAAO,KAAK,KAAK,KAAK,SAAS,GAAG;AAClD,UAAI,QAAQ,aAAc;AAC1B,UAAI,QAAQ,OAAQ;AACpB,UAAI,QAAQ,aAAc;AAC1B,UAAI,QAAQ,gBAAiB;AAE7B,UAAI,QAAQ,aAAa;AACvB,YAAI,KAAK,KAAK,UAAU,cAAc,MAAM;AAC1C,iBAAO,aAAa,KAAK,KAAK,UAAU;AAAA,QAC1C;AACA,YAAI,KAAK,KAAK,UAAU,iBAAiB,MAAM;AAC7C,iBAAO,gBAAgB,KAAK,KAAK,UAAU;AAAA,QAC7C;AACA,YAAI,KAAK,KAAK,UAAU,QAAQ,MAAM;AACpC,iBAAO,OAAO,KAAK,KAAK,UAAU;AAAA,QACpC;AACA,eAAO,YAAY,KAAK,KAAK,UAAU;AAEvC,YAAI,KAAK,KAAK,UAAU,cAAc,MAAM;AAC1C,iBAAO,aAAa,KAAK,KAAK,UAAU;AAAA,QAC1C;AAAA,MACF,OAAO;AACL,cAAM,eAAe,KAAK,KAAK;AAC/B,cAAM,YAAY;AAClB,kBAAU,GAAG,IAAI,aAAa,GAAG;AAAA,MACnC;AAAA,IACF;AAGA,UAAM,WAAY,OAAO,UAAU,CAAC,EAAE,MAAM,OAAO,UAAU,CAAC,EAAE,OAAO,CAAC;AACxE,aAAS,KAAK,CAAC,GAAG,OAAO,YAAY,EAAE,EAAE,CAAC,KAAK,MAAM,YAAY,EAAE,EAAE,CAAC,KAAK,EAAE;AAG7E,eAAW,WAAW,UAAU;AAC9B,YAAM,YAAY,QAAQ;AAC1B,UAAI,aAAa,KAAM;AACvB,gBAAU,KAAK,CAAC,GAAG,MAAM,WAAW,kBAAkB,EAAE,EAAE,CAAC,EAAE,IAAI,WAAW,kBAAkB,EAAE,EAAE,CAAC,EAAE,CAAC;AAAA,IACxG;AAGA,QAAI,OAAO,aAAa,MAAM;AAC5B,aAAO,UAAU,CAAC,EAAE,EAAE,MAAM,WAAW,mBAAmB,KAAK,KAAK;AAAA,IACtE,OAAO;AACL,aAAO,YAAY,CAAC,EAAE,GAAG,EAAE,KAAK,WAAW,mBAAmB,KAAK,KAAK,EAAE,EAAE,CAAC;AAAA,IAC/E;AAEA,SAAK,KAAK,YAAY;AAAA,EACxB;AAAA,EAEQ,aAAa,MAA2D;AAhdlF;AAidI,YAAO,UAAK,SAAS,IAAI,KAAK,CAAC,MAAxB,mBAA2B,QAAQ,IAAI,KAAK;AAAA,EACrD;AAAA,EAEQ,qBAAqB,MAA+C;AAE1E,UAAM,UAAU,KAAK,oBAAoB,KAAK,CAAC;AAG/C,QAAI,WAAW,QAAQ,QAAQ,IAAI,KAAK,CAAC;AACzC,QAAI,aAAa,QAAW;AAC1B,cAAQ,KAAK,IAAI,QAAQ,KAAK,KAAK,CAAC;AAEpC,iBAAW,EAAE,GAAG,EAAE,GAAG,WAAW,cAAc,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,EAAE;AAC/D,cAAQ,KAAK,EAAE,KAAK,QAAQ;AAC5B,cAAQ,QAAQ,IAAI,KAAK,GAAG,QAAQ;AAAA,IACtC;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,oBAAoB,GAAoB;AAC9C,UAAM,UAAU,KAAK,SAAS,IAAI,CAAC;AACnC,QAAI,WAAW,MAAM;AACnB,aAAO,KAAK,gBAAgB,GAAG,EAAE,GAAG,EAAE,GAAG,WAAW,iBAAiB,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC;AAAA,IACpF;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,gBAAgB,GAAW,SAAgC;AACjE,SAAK,WAAW,CAAC;AAGjB,SAAK,KAAK,UAAU,UAAU,CAAC,EAAE,MAAM,KAAK,KAAK,UAAU,UAAU,CAAC,EAAE,OAAO,CAAC;AAChF,SAAK,KAAK,UAAU,UAAU,CAAC,EAAE,IAAI,KAAK,OAAO;AAGjD,UAAM,UAAU;AAAA,MACd,MAAM;AAAA,MACN,UAAU,QAAQ,KAAK,CAAC,GAAG;AAAA,QACzB,CAAC,SAAS,WAAW,iBAAiB,KAAK,EAAE,CAAC;AAAA,QAC9C,CAAC,SAAS;AAAA,MACZ;AAAA,IACF;AACA,SAAK,SAAS,IAAI,GAAG,OAAO;AAE5B,WAAO;AAAA,EACT;AAAA,EAEQ,iBAAiB,MAAgC,UAA+B;AACtF,SAAK,WAAW,IAAI;AAGpB,UAAM,gBAAgB,KAAK,oBAAoB,KAAK,CAAC;AAGrD,kBAAc,KAAK,IAAI,cAAc,KAAK,KAAK,CAAC;AAChD,kBAAc,KAAK,EAAE,KAAK,QAAQ;AAGlC,kBAAc,QAAQ,IAAI,KAAK,GAAG,QAAQ;AAAA,EAC5C;AAAA,EAEQ,WAAW,GAAiB;AA/gBtC;AAghBI,UAAM,gBAAgB,KAAK,SAAS,IAAI,CAAC;AACzC,QAAI,iBAAiB,MAAM;AACzB,YAAM,OAAO,KAAK,KAAK,UAAU,UAAU,CAAC,EAAE;AAC9C,UAAI,MAAM;AACR,cAAM,WAAW,KAAK,QAAQ,cAAc,IAAI;AAChD,YAAI,aAAa,GAAI,MAAK,OAAO,UAAU,CAAC;AAAA,MAC9C;AAAA,IACF;AACA,SAAK,SAAS,OAAO,CAAC;AAGtB,UAAI,UAAK,KAAK,UAAU,UAAU,CAAC,EAAE,QAAjC,mBAAsC,YAAW,GAAG;AACtD,aAAO,KAAK,KAAK,UAAU,UAAU,CAAC,EAAE;AAAA,IAC1C;AAAA,EACF;AACF;",
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.7",
4
+ "version": "13.0.2",
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
- "@simplysm/core-common": "workspace:*",
21
21
  "mime": "^4.1.0",
22
- "zod": "^4.3.6"
22
+ "zod": "^4.3.6",
23
+ "@simplysm/core-common": "13.0.2"
23
24
  }
24
- }
25
+ }
@@ -0,0 +1,326 @@
1
+ import type { ExcelXmlWorksheet } from "./xml/excel-xml-worksheet";
2
+ import type { ExcelXmlContentType } from "./xml/excel-xml-content-type";
3
+ import type { ExcelXmlRelationship } from "./xml/excel-xml-relationship";
4
+ import type { ExcelXmlStyle, ExcelStyle } from "./xml/excel-xml-style";
5
+ import type { ExcelXmlSharedString } from "./xml/excel-xml-shared-string";
6
+ import type { ZipCache } from "./utils/zip-cache";
7
+ import type { ExcelAddressPoint, ExcelStyleOptions, ExcelValueType } from "./types";
8
+ import { DateOnly, DateTime, numParseFloat, numParseInt, strIsNullOrEmpty, Time } from "@simplysm/core-common";
9
+ import { ExcelXmlSharedString as ExcelXmlSharedStringClass } from "./xml/excel-xml-shared-string";
10
+ import { ExcelXmlStyle as ExcelXmlStyleClass } from "./xml/excel-xml-style";
11
+ import { ExcelUtils } from "./utils/excel-utils";
12
+
13
+ /**
14
+ * Excel 셀을 나타내는 클래스.
15
+ * 값 읽기/쓰기, 수식 설정, 스타일 설정, 셀 병합 등의 기능을 제공한다.
16
+ *
17
+ * @remarks
18
+ * ## 비동기 메서드 설계
19
+ *
20
+ * `getVal()`, `setVal()` 등 모든 셀 메서드가 `async`인 이유:
21
+ * - 셀 타입에 따라 필요한 XML만 선택적으로 로드한다
22
+ * - 문자열 셀: SharedStrings.xml 로드
23
+ * - 숫자 셀: SharedStrings 로드 안함
24
+ * - 스타일이 있는 셀: Styles.xml 로드
25
+ *
26
+ * 어떤 셀을 읽을지 미리 알 수 없기 때문에 동기 구조로는 구현할 수 없다.
27
+ * 동기 구조로 만들려면 모든 XML을 미리 로드해야 하므로 대용량 파일에서 메모리 문제가 발생한다.
28
+ */
29
+ export class ExcelCell {
30
+ /** 셀 주소 (0-based 행/열 인덱스) */
31
+ readonly addr: ExcelAddressPoint;
32
+
33
+ constructor(
34
+ private readonly _zipCache: ZipCache,
35
+ private readonly _targetFileName: string,
36
+ private readonly _r: number,
37
+ private readonly _c: number,
38
+ ) {
39
+ this.addr = { r: this._r, c: this._c };
40
+ }
41
+
42
+ //#region Value Methods
43
+
44
+ /** 셀에 수식 설정 (undefined: 수식 삭제) */
45
+ async setFormula(val: string | undefined): Promise<void> {
46
+ if (val === undefined) {
47
+ await this._deleteCell(this.addr);
48
+ } else {
49
+ const wsData = await this._getWsData();
50
+ wsData.setCellType(this.addr, "str");
51
+ wsData.setCellVal(this.addr, undefined);
52
+ wsData.setCellFormula(this.addr, val);
53
+ }
54
+ }
55
+
56
+ /** 셀의 수식 반환 */
57
+ async getFormula(): Promise<string | undefined> {
58
+ const wsData = await this._getWsData();
59
+ return wsData.getCellFormula(this.addr);
60
+ }
61
+
62
+ /** 셀 값 설정 (undefined: 셀 삭제) */
63
+ async setVal(val: ExcelValueType): Promise<void> {
64
+ if (val === undefined) {
65
+ await this._deleteCell(this.addr);
66
+ } else if (typeof val === "string") {
67
+ const wsData = await this._getWsData();
68
+ const ssData = await this._getOrCreateSsData();
69
+ const ssId = ssData.getIdByString(val);
70
+ if (ssId !== undefined) {
71
+ wsData.setCellType(this.addr, "s");
72
+ wsData.setCellVal(this.addr, ssId.toString());
73
+ } else {
74
+ const newSsId = ssData.add(val);
75
+ wsData.setCellType(this.addr, "s");
76
+ wsData.setCellVal(this.addr, newSsId.toString());
77
+ }
78
+ } else if (typeof val === "boolean") {
79
+ const wsData = await this._getWsData();
80
+ wsData.setCellType(this.addr, "b");
81
+ wsData.setCellVal(this.addr, val ? "1" : "0");
82
+ } else if (typeof val === "number") {
83
+ const wsData = await this._getWsData();
84
+ wsData.setCellType(this.addr, undefined);
85
+ wsData.setCellVal(this.addr, val.toString());
86
+ } else if (val instanceof DateOnly || val instanceof DateTime || val instanceof Time) {
87
+ const wsData = await this._getWsData();
88
+ wsData.setCellType(this.addr, undefined);
89
+ wsData.setCellVal(this.addr, ExcelUtils.convertTimeTickToNumber(val.tick).toString());
90
+
91
+ const numFmtName = val instanceof DateOnly ? "DateOnly" : val instanceof DateTime ? "DateTime" : "Time";
92
+ await this._setStyleInternal({ numFmtId: ExcelUtils.convertNumFmtNameToId(numFmtName).toString() });
93
+ } else {
94
+ throw new Error(`[${ExcelUtils.stringifyAddr(this.addr)}] 지원되지 않는 타입입니다: ${typeof val}`);
95
+ }
96
+ }
97
+
98
+ /** 셀 값 반환 */
99
+ async getVal(): Promise<ExcelValueType> {
100
+ const wsData = await this._getWsData();
101
+ const cellVal = wsData.getCellVal(this.addr);
102
+ if (cellVal === undefined || strIsNullOrEmpty(cellVal)) {
103
+ return undefined;
104
+ }
105
+
106
+ const cellType = wsData.getCellType(this.addr);
107
+ if (cellType === "s") {
108
+ const ssData = await this._getOrCreateSsData();
109
+ const ssId = numParseInt(cellVal);
110
+ if (ssId == null) {
111
+ throw new Error(`[${ExcelUtils.stringifyAddr(this.addr)}] SharedString ID 파싱 실패: ${cellVal}`);
112
+ }
113
+ return ssData.getStringById(ssId);
114
+ } else if (cellType === "str") {
115
+ return cellVal;
116
+ } else if (cellType === "inlineStr") {
117
+ return cellVal;
118
+ } else if (cellType === "b") {
119
+ return cellVal === "1";
120
+ } else if (cellType === "n") {
121
+ return parseFloat(cellVal);
122
+ } else if (cellType === "e") {
123
+ throw new Error(
124
+ `[${ExcelUtils.stringifyAddr(this.addr)}] 셀 타입 분석 실패: 셀에 에러 값이 포함되어 있습니다 (${cellVal})`,
125
+ );
126
+ } else {
127
+ // cellType === undefined: 숫자 또는 날짜/시간 타입
128
+ const cellStyleId = wsData.getCellStyleId(this.addr);
129
+ if (cellStyleId === undefined) {
130
+ return parseFloat(cellVal);
131
+ }
132
+
133
+ const styleData = await this._getStyleData();
134
+ if (styleData == null) {
135
+ return parseFloat(cellVal);
136
+ }
137
+
138
+ const numFmtId = styleData.get(cellStyleId).numFmtId;
139
+ if (numFmtId === undefined) {
140
+ return parseFloat(cellVal);
141
+ }
142
+
143
+ const numFmtCode = styleData.getNumFmtCode(numFmtId);
144
+ let numFmt;
145
+ if (numFmtCode !== undefined) {
146
+ numFmt = ExcelUtils.convertNumFmtCodeToName(numFmtCode);
147
+ } else {
148
+ const numFmtIdNum = numParseInt(numFmtId);
149
+ if (numFmtIdNum == null) {
150
+ throw new Error(`[${ExcelUtils.stringifyAddr(this.addr)}] numFmtId 파싱 실패: ${numFmtId}`);
151
+ }
152
+ numFmt = ExcelUtils.convertNumFmtIdToName(numFmtIdNum);
153
+ }
154
+
155
+ if (numFmt === "number") {
156
+ return parseFloat(cellVal);
157
+ } else if (numFmt === "string") {
158
+ return cellVal;
159
+ } else {
160
+ // DateOnly, DateTime, Time
161
+ const dateNum = numParseFloat(cellVal);
162
+ if (dateNum == null) {
163
+ throw new Error(`[${ExcelUtils.stringifyAddr(this.addr)}] 날짜 숫자 파싱 실패: ${cellVal}`);
164
+ }
165
+ const tick = ExcelUtils.convertNumberToTimeTick(dateNum);
166
+ if (numFmt === "DateOnly") {
167
+ return new DateOnly(tick);
168
+ } else if (numFmt === "DateTime") {
169
+ return new DateTime(tick);
170
+ } else {
171
+ return new Time(tick);
172
+ }
173
+ }
174
+ }
175
+ }
176
+
177
+ //#endregion
178
+
179
+ //#region Merge Methods
180
+
181
+ /**
182
+ * 현재 셀부터 지정된 끝 좌표까지 셀 병합
183
+ * @param r 병합 끝 행 인덱스 (0-based)
184
+ * @param c 병합 끝 열 인덱스 (0-based)
185
+ * @example
186
+ * // A1 셀에서 호출하면 A1:C3 범위 (3행 x 3열)를 병합
187
+ * await ws.cell(0, 0).merge(2, 2);
188
+ */
189
+ async merge(r: number, c: number): Promise<void> {
190
+ const wsData = await this._getWsData();
191
+ wsData.setMergeCells(this.addr, { r, c });
192
+ }
193
+
194
+ //#endregion
195
+
196
+ //#region Style Methods
197
+
198
+ /** 셀의 스타일 ID 반환 */
199
+ async getStyleId(): Promise<string | undefined> {
200
+ const wsData = await this._getWsData();
201
+ return wsData.getCellStyleId(this.addr);
202
+ }
203
+
204
+ /** 셀의 스타일 ID 설정 */
205
+ async setStyleId(styleId: string | undefined): Promise<void> {
206
+ const wsData = await this._getWsData();
207
+ wsData.setCellStyleId(this.addr, styleId);
208
+ }
209
+
210
+ /**
211
+ * 셀 스타일 설정
212
+ * @param opts 스타일 옵션
213
+ * @param opts.background 배경색 (ARGB 형식, 8자리 16진수. 예: "FFFF0000")
214
+ * @param opts.border 테두리 위치 배열 (예: ["left", "right", "top", "bottom"])
215
+ * @param opts.horizontalAlign 가로 정렬 ("left", "center", "right")
216
+ * @param opts.verticalAlign 세로 정렬 ("top", "center", "bottom")
217
+ * @param opts.numberFormat 숫자 형식 ("number", "DateOnly", "DateTime", "Time", "string")
218
+ */
219
+ async setStyle(opts: ExcelStyleOptions): Promise<void> {
220
+ const style: ExcelStyle = {};
221
+
222
+ if (opts.background != null) {
223
+ if (!/^[0-9A-F]{8}$/i.test(opts.background)) {
224
+ throw new Error("색상 형식이 잘못되었습니다. (형식: 00000000: alpha(역)+rgb)");
225
+ }
226
+ style.background = opts.background;
227
+ }
228
+
229
+ if (opts.border != null) {
230
+ style.border = opts.border;
231
+ }
232
+
233
+ if (opts.horizontalAlign != null) {
234
+ style.horizontalAlign = opts.horizontalAlign;
235
+ }
236
+
237
+ if (opts.verticalAlign != null) {
238
+ style.verticalAlign = opts.verticalAlign;
239
+ }
240
+
241
+ if (opts.numberFormat != null) {
242
+ style.numFmtId = ExcelUtils.convertNumFmtNameToId(opts.numberFormat).toString();
243
+ }
244
+
245
+ await this._setStyleInternal(style);
246
+ }
247
+
248
+ //#endregion
249
+
250
+ //#region Private Methods
251
+
252
+ private async _deleteCell(addr: ExcelAddressPoint): Promise<void> {
253
+ const wsData = await this._getWsData();
254
+ wsData.deleteCell(addr);
255
+ }
256
+
257
+ private async _getWsData(): Promise<ExcelXmlWorksheet> {
258
+ return (await this._zipCache.get(`xl/worksheets/${this._targetFileName}`)) as ExcelXmlWorksheet;
259
+ }
260
+
261
+ private async _setStyleInternal(style: ExcelStyle): Promise<void> {
262
+ const wsData = await this._getWsData();
263
+ const styleData = await this._getOrCreateStyleData();
264
+ let styleId = wsData.getCellStyleId(this.addr);
265
+ if (styleId == null) {
266
+ styleId = styleData.add(style);
267
+ } else {
268
+ styleId = styleData.addWithClone(styleId, style);
269
+ }
270
+ wsData.setCellStyleId(this.addr, styleId);
271
+ }
272
+
273
+ private async _getTypeData(): Promise<ExcelXmlContentType> {
274
+ return (await this._zipCache.get("[Content_Types].xml")) as ExcelXmlContentType;
275
+ }
276
+
277
+ private async _getSsData(): Promise<ExcelXmlSharedString | undefined> {
278
+ return (await this._zipCache.get("xl/sharedStrings.xml")) as ExcelXmlSharedString | undefined;
279
+ }
280
+
281
+ private async _getWbRelData(): Promise<ExcelXmlRelationship> {
282
+ return (await this._zipCache.get("xl/_rels/workbook.xml.rels")) as ExcelXmlRelationship;
283
+ }
284
+
285
+ private async _getStyleData(): Promise<ExcelXmlStyle | undefined> {
286
+ return (await this._zipCache.get("xl/styles.xml")) as ExcelXmlStyle | undefined;
287
+ }
288
+
289
+ private async _getOrCreateSsData(): Promise<ExcelXmlSharedString> {
290
+ let ssData = await this._getSsData();
291
+ if (ssData == null) {
292
+ ssData = new ExcelXmlSharedStringClass();
293
+ this._zipCache.set("xl/sharedStrings.xml", ssData);
294
+
295
+ const typeData = await this._getTypeData();
296
+ typeData.add(
297
+ "/xl/sharedStrings.xml",
298
+ "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml",
299
+ );
300
+
301
+ const wbRelData = await this._getWbRelData();
302
+ wbRelData.add(
303
+ "sharedStrings.xml",
304
+ "http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings",
305
+ );
306
+ }
307
+ return ssData;
308
+ }
309
+
310
+ private async _getOrCreateStyleData(): Promise<ExcelXmlStyle> {
311
+ let styleData = await this._getStyleData();
312
+ if (styleData == null) {
313
+ styleData = new ExcelXmlStyleClass();
314
+ this._zipCache.set("xl/styles.xml", styleData);
315
+
316
+ const typeData = await this._getTypeData();
317
+ typeData.add("/xl/styles.xml", "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml");
318
+
319
+ const wbRelData = await this._getWbRelData();
320
+ wbRelData.add("styles.xml", "http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles");
321
+ }
322
+ return styleData;
323
+ }
324
+
325
+ //#endregion
326
+ }
@@ -0,0 +1,43 @@
1
+ import "@simplysm/core-common";
2
+ import { ExcelCell } from "./excel-cell";
3
+ import type { ExcelXmlWorksheet } from "./xml/excel-xml-worksheet";
4
+ import type { ZipCache } from "./utils/zip-cache";
5
+
6
+ /** Excel 워크시트의 열을 나타내는 클래스. 셀 접근 및 열 너비 설정 기능을 제공한다. */
7
+ export class ExcelCol {
8
+ private readonly _cellMap = new Map<number, ExcelCell>();
9
+
10
+ constructor(
11
+ private readonly _zipCache: ZipCache,
12
+ private readonly _targetFileName: string,
13
+ private readonly _c: number,
14
+ ) {}
15
+
16
+ /** 행 인덱스에 해당하는 셀 반환 (0-based) */
17
+ cell(r: number): ExcelCell {
18
+ return this._cellMap.getOrCreate(r, new ExcelCell(this._zipCache, this._targetFileName, r, this._c));
19
+ }
20
+
21
+ /** 열의 모든 셀 반환 */
22
+ async getCells(): Promise<ExcelCell[]> {
23
+ const result: ExcelCell[] = [];
24
+ const wsData = await this._getWsData();
25
+ const range = wsData.range;
26
+
27
+ for (let r = range.s.r; r <= range.e.r; r++) {
28
+ result[r] = this.cell(r);
29
+ }
30
+
31
+ return result;
32
+ }
33
+
34
+ /** 열 너비 설정 */
35
+ async setWidth(size: number): Promise<void> {
36
+ const wsData = await this._getWsData();
37
+ wsData.setColWidth((this._c + 1).toString(), size.toString());
38
+ }
39
+
40
+ private async _getWsData(): Promise<ExcelXmlWorksheet> {
41
+ return (await this._zipCache.get(`xl/worksheets/${this._targetFileName}`)) as ExcelXmlWorksheet;
42
+ }
43
+ }
@@ -0,0 +1,37 @@
1
+ import "@simplysm/core-common";
2
+ import { ExcelCell } from "./excel-cell";
3
+ import type { ExcelXmlWorksheet } from "./xml/excel-xml-worksheet";
4
+ import type { ZipCache } from "./utils/zip-cache";
5
+
6
+ /** Excel 워크시트의 행을 나타내는 클래스. 셀 접근 기능을 제공한다. */
7
+ export class ExcelRow {
8
+ private readonly _cellMap = new Map<number, ExcelCell>();
9
+
10
+ constructor(
11
+ private readonly _zipCache: ZipCache,
12
+ private readonly _targetFileName: string,
13
+ private readonly _r: number,
14
+ ) {}
15
+
16
+ /** 열 인덱스에 해당하는 셀 반환 (0-based) */
17
+ cell(c: number): ExcelCell {
18
+ return this._cellMap.getOrCreate(c, new ExcelCell(this._zipCache, this._targetFileName, this._r, c));
19
+ }
20
+
21
+ /** 행의 모든 셀 반환 */
22
+ async getCells(): Promise<ExcelCell[]> {
23
+ const result: ExcelCell[] = [];
24
+ const wsData = await this._getWsData();
25
+ const range = wsData.range;
26
+
27
+ for (let c = range.s.c; c <= range.e.c; c++) {
28
+ result[c] = this.cell(c);
29
+ }
30
+
31
+ return result;
32
+ }
33
+
34
+ private async _getWsData(): Promise<ExcelXmlWorksheet> {
35
+ return (await this._zipCache.get(`xl/worksheets/${this._targetFileName}`)) as ExcelXmlWorksheet;
36
+ }
37
+ }