@simplysm/excel 13.0.99 → 14.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/dist/excel-cell.d.ts +28 -28
  2. package/dist/excel-cell.d.ts.map +1 -1
  3. package/dist/excel-cell.js +273 -264
  4. package/dist/excel-cell.js.map +1 -6
  5. package/dist/excel-col.d.ts +4 -4
  6. package/dist/excel-col.d.ts.map +1 -1
  7. package/dist/excel-col.js +33 -35
  8. package/dist/excel-col.js.map +1 -6
  9. package/dist/excel-row.d.ts +3 -3
  10. package/dist/excel-row.d.ts.map +1 -1
  11. package/dist/excel-row.js +28 -30
  12. package/dist/excel-row.js.map +1 -6
  13. package/dist/excel-workbook.d.ts +23 -23
  14. package/dist/excel-workbook.d.ts.map +1 -1
  15. package/dist/excel-workbook.js +151 -125
  16. package/dist/excel-workbook.js.map +1 -6
  17. package/dist/excel-worksheet.d.ts +32 -32
  18. package/dist/excel-worksheet.d.ts.map +1 -1
  19. package/dist/excel-worksheet.js +281 -253
  20. package/dist/excel-worksheet.js.map +1 -6
  21. package/dist/excel-wrapper.d.ts +7 -7
  22. package/dist/excel-wrapper.d.ts.map +1 -1
  23. package/dist/excel-wrapper.js +190 -226
  24. package/dist/excel-wrapper.js.map +1 -6
  25. package/dist/index.js +4 -1
  26. package/dist/index.js.map +1 -6
  27. package/dist/types.d.ts +13 -13
  28. package/dist/types.d.ts.map +1 -1
  29. package/dist/types.js +3 -1
  30. package/dist/types.js.map +1 -6
  31. package/dist/utils/excel-utils.d.ts +23 -23
  32. package/dist/utils/excel-utils.d.ts.map +1 -1
  33. package/dist/utils/excel-utils.js +183 -151
  34. package/dist/utils/excel-utils.js.map +1 -6
  35. package/dist/utils/zip-cache.d.ts +6 -6
  36. package/dist/utils/zip-cache.js +78 -60
  37. package/dist/utils/zip-cache.js.map +1 -6
  38. package/dist/xml/excel-xml-content-type.d.ts +2 -2
  39. package/dist/xml/excel-xml-content-type.js +55 -53
  40. package/dist/xml/excel-xml-content-type.js.map +1 -6
  41. package/dist/xml/excel-xml-drawing.d.ts +2 -2
  42. package/dist/xml/excel-xml-drawing.js +74 -73
  43. package/dist/xml/excel-xml-drawing.js.map +1 -6
  44. package/dist/xml/excel-xml-relationship.d.ts +2 -2
  45. package/dist/xml/excel-xml-relationship.js +67 -67
  46. package/dist/xml/excel-xml-relationship.js.map +1 -6
  47. package/dist/xml/excel-xml-shared-string.d.ts +2 -2
  48. package/dist/xml/excel-xml-shared-string.js +57 -55
  49. package/dist/xml/excel-xml-shared-string.js.map +1 -6
  50. package/dist/xml/excel-xml-style.d.ts +2 -2
  51. package/dist/xml/excel-xml-style.js +311 -295
  52. package/dist/xml/excel-xml-style.js.map +1 -6
  53. package/dist/xml/excel-xml-unknown.d.ts +2 -2
  54. package/dist/xml/excel-xml-unknown.js +11 -10
  55. package/dist/xml/excel-xml-unknown.js.map +1 -6
  56. package/dist/xml/excel-xml-workbook.d.ts +2 -2
  57. package/dist/xml/excel-xml-workbook.js +87 -90
  58. package/dist/xml/excel-xml-workbook.js.map +1 -6
  59. package/dist/xml/excel-xml-worksheet.d.ts +6 -6
  60. package/dist/xml/excel-xml-worksheet.js +450 -393
  61. package/dist/xml/excel-xml-worksheet.js.map +1 -6
  62. package/package.json +5 -7
  63. package/src/excel-cell.ts +36 -36
  64. package/src/excel-col.ts +4 -4
  65. package/src/excel-row.ts +3 -3
  66. package/src/excel-workbook.ts +38 -38
  67. package/src/excel-worksheet.ts +69 -51
  68. package/src/excel-wrapper.ts +55 -50
  69. package/src/index.ts +3 -3
  70. package/src/types.ts +17 -17
  71. package/src/utils/excel-utils.ts +47 -41
  72. package/src/utils/zip-cache.ts +6 -6
  73. package/src/xml/excel-xml-content-type.ts +3 -3
  74. package/src/xml/excel-xml-drawing.ts +2 -2
  75. package/src/xml/excel-xml-relationship.ts +3 -3
  76. package/src/xml/excel-xml-shared-string.ts +2 -2
  77. package/src/xml/excel-xml-style.ts +11 -11
  78. package/src/xml/excel-xml-unknown.ts +2 -2
  79. package/src/xml/excel-xml-workbook.ts +5 -5
  80. package/src/xml/excel-xml-worksheet.ts +43 -43
  81. package/README.md +0 -119
  82. package/docs/core-classes.md +0 -541
  83. package/docs/types.md +0 -297
  84. package/docs/utilities.md +0 -128
  85. package/docs/wrapper.md +0 -100
  86. package/tests/excel-cell.spec.ts +0 -393
  87. package/tests/excel-col.spec.ts +0 -81
  88. package/tests/excel-row.spec.ts +0 -61
  89. package/tests/excel-workbook.spec.ts +0 -205
  90. package/tests/excel-worksheet.spec.ts +0 -469
  91. package/tests/excel-wrapper.spec.ts +0 -273
  92. package/tests/fixtures/logo.png +0 -0
  93. package/tests/fixtures//354/264/210/352/270/260/355/231/224.xlsx +0 -0
  94. package/tests/image-insert.spec.ts +0 -190
  95. package/tests/utils/excel-utils.spec.ts +0 -198
@@ -5,273 +5,301 @@ import { ExcelCol } from "./excel-col.js";
5
5
  import { ExcelRow } from "./excel-row.js";
6
6
  import { ExcelXmlDrawing } from "./xml/excel-xml-drawing.js";
7
7
  import { ExcelXmlRelationship } from "./xml/excel-xml-relationship.js";
8
- class ExcelWorksheet {
9
- constructor(_zipCache, _relId, _targetFileName) {
10
- this._zipCache = _zipCache;
11
- this._relId = _relId;
12
- this._targetFileName = _targetFileName;
13
- }
14
- _rowMap = /* @__PURE__ */ new Map();
15
- _colMap = /* @__PURE__ */ new Map();
16
- //#region Name Methods
17
- /** Return worksheet name */
18
- async getName() {
19
- const wbXmlData = await this._getWbData();
20
- const name = wbXmlData.getWorksheetNameById(this._relId);
21
- if (name == null) {
22
- throw new Error(`Cannot find name for worksheet ID ${this._relId}`);
8
+ /**
9
+ * Excel 워크시트를 나타내는 클래스.
10
+ * 셀 접근, 행/열 복사, 데이터 테이블 처리, 이미지 삽입 기능을 제공한다.
11
+ */
12
+ export class ExcelWorksheet {
13
+ _zipCache;
14
+ _relId;
15
+ _targetFileName;
16
+ _rowMap = new Map();
17
+ _colMap = new Map();
18
+ constructor(_zipCache, _relId, _targetFileName) {
19
+ this._zipCache = _zipCache;
20
+ this._relId = _relId;
21
+ this._targetFileName = _targetFileName;
23
22
  }
24
- return name;
25
- }
26
- /** Rename worksheet */
27
- async setName(newName) {
28
- const wbXmlData = await this._getWbData();
29
- wbXmlData.setWorksheetNameById(this._relId, newName);
30
- }
31
- //#endregion
32
- //#region Cell Access Methods
33
- /** Return row object (0-based) */
34
- row(r) {
35
- return this._rowMap.getOrCreate(r, new ExcelRow(this._zipCache, this._targetFileName, r));
36
- }
37
- /** Return cell object (0-based row/column) */
38
- cell(r, c) {
39
- return this.row(r).cell(c);
40
- }
41
- /** Return column object (0-based) */
42
- col(c) {
43
- return this._colMap.getOrCreate(c, new ExcelCol(this._zipCache, this._targetFileName, c));
44
- }
45
- //#endregion
46
- //#region Copy Methods
47
- /** Copy style from source row to target row */
48
- async copyRowStyle(srcR, targetR) {
49
- const range = await this.getRange();
50
- for (let c = range.s.c; c <= range.e.c; c++) {
51
- await this.copyCellStyle({ r: srcR, c }, { r: targetR, c });
23
+ //#region Name Methods
24
+ /** 워크시트 이름 반환 */
25
+ async getName() {
26
+ const wbXmlData = await this._getWbData();
27
+ const name = wbXmlData.getWorksheetNameById(this._relId);
28
+ if (name == null) {
29
+ throw new Error(`워크시트 ID ${this._relId}의 이름을 찾을 수 없습니다`);
30
+ }
31
+ return name;
32
+ }
33
+ /** 워크시트 이름 변경 */
34
+ async setName(newName) {
35
+ const wbXmlData = await this._getWbData();
36
+ wbXmlData.setWorksheetNameById(this._relId, newName);
37
+ }
38
+ //#endregion
39
+ //#region Cell Access Methods
40
+ /** 객체 반환 (0 기반) */
41
+ row(r) {
42
+ return this._rowMap.getOrCreate(r, new ExcelRow(this._zipCache, this._targetFileName, r));
43
+ }
44
+ /** 셀 객체 반환 (0 기반 행/열) */
45
+ cell(r, c) {
46
+ return this.row(r).cell(c);
47
+ }
48
+ /** 객체 반환 (0 기반) */
49
+ col(c) {
50
+ return this._colMap.getOrCreate(c, new ExcelCol(this._zipCache, this._targetFileName, c));
52
51
  }
53
- }
54
- /** Copy style from source cell to target cell */
55
- async copyCellStyle(srcAddr, targetAddr) {
56
- const wsData = await this._getWsData();
57
- const styleId = wsData.getCellStyleId(srcAddr);
58
- if (styleId != null) {
59
- wsData.setCellStyleId(targetAddr, styleId);
52
+ //#endregion
53
+ //#region Copy Methods
54
+ /** 원본 행에서 대상 행으로 스타일 복사 */
55
+ async copyRowStyle(srcR, targetR) {
56
+ const range = await this.getRange();
57
+ for (let c = range.s.c; c <= range.e.c; c++) {
58
+ await this.copyCellStyle({ r: srcR, c: c }, { r: targetR, c: c });
59
+ }
60
+ }
61
+ /** 원본 셀에서 대상 셀로 스타일 복사 */
62
+ async copyCellStyle(srcAddr, targetAddr) {
63
+ const wsData = await this._getWsData();
64
+ const styleId = wsData.getCellStyleId(srcAddr);
65
+ if (styleId != null) {
66
+ wsData.setCellStyleId(targetAddr, styleId);
67
+ }
60
68
  }
61
- }
62
- /** Copy source row to target row (overwrite) */
63
- async copyRow(srcR, targetR) {
64
- const wsData = await this._getWsData();
65
- wsData.copyRow(srcR, targetR);
66
- }
67
- /** Copy source cell to target cell */
68
- async copyCell(srcAddr, targetAddr) {
69
- const wsData = await this._getWsData();
70
- wsData.copyCell(srcAddr, targetAddr);
71
- }
72
- /**
73
- * Insert-copy the source row at the target position.
74
- * Existing rows at and below the target are shifted down by one.
75
- * @param srcR Source row index to copy (0-based)
76
- * @param targetR Target row index to insert at (0-based)
77
- */
78
- async insertCopyRow(srcR, targetR) {
79
- const wsData = await this._getWsData();
80
- const range = wsData.range;
81
- wsData.shiftMergeCells(targetR, 1);
82
- const adjustedSrcR = srcR >= targetR ? srcR + 1 : srcR;
83
- for (let r = range.e.r; r >= targetR; r--) {
84
- wsData.copyRow(r, r + 1, { skipMerge: true });
69
+ /** 원본 행을 대상 행으로 복사 (덮어쓰기) */
70
+ async copyRow(srcR, targetR) {
71
+ const wsData = await this._getWsData();
72
+ wsData.copyRow(srcR, targetR);
85
73
  }
86
- wsData.copyRow(adjustedSrcR, targetR);
87
- }
88
- //#endregion
89
- //#region Range Methods
90
- /** Return data range of the worksheet */
91
- async getRange() {
92
- const xml = await this._getWsData();
93
- return xml.range;
94
- }
95
- /** Return all cells as a 2D array */
96
- async getCells() {
97
- const xml = await this._getWsData();
98
- const range = xml.range;
99
- const promises = [];
100
- for (let r = range.s.r; r <= range.e.r; r++) {
101
- promises.push(this.row(r).getCells());
74
+ /** 원본 셀을 대상 셀로 복사 */
75
+ async copyCell(srcAddr, targetAddr) {
76
+ const wsData = await this._getWsData();
77
+ wsData.copyCell(srcAddr, targetAddr);
102
78
  }
103
- return Promise.all(promises);
104
- }
105
- //#endregion
106
- //#region Data Methods
107
- /**
108
- * Return worksheet data as a table (record array).
109
- * @param opt.headerRowIndex Header row index (default: first row)
110
- * @param opt.checkEndColIndex Column index to determine data end. Data ends when this column is empty.
111
- * @param opt.usableHeaderNameFn Function to filter usable headers
112
- */
113
- async getDataTable(opt) {
114
- const result = [];
115
- const headerMap = /* @__PURE__ */ new Map();
116
- const xml = await this._getWsData();
117
- const range = xml.range;
118
- const startRow = (opt == null ? void 0 : opt.headerRowIndex) ?? range.s.r;
119
- for (let c = range.s.c; c <= range.e.c; c++) {
120
- const headerName = await this.cell(startRow, c).getValue();
121
- if (typeof headerName === "string") {
122
- if ((opt == null ? void 0 : opt.usableHeaderNameFn) == null || opt.usableHeaderNameFn(headerName)) {
123
- headerMap.set(headerName, c);
79
+ /**
80
+ * 원본 행을 대상 위치에 삽입 복사한다.
81
+ * 대상 위치 이하의 기존 행은 한 칸 아래로 밀린다.
82
+ * @param srcR 복사할 원본 행 인덱스 (0 기반)
83
+ * @param targetR 삽입할 대상 행 인덱스 (0 기반)
84
+ */
85
+ async insertCopyRow(srcR, targetR) {
86
+ const wsData = await this._getWsData();
87
+ const range = wsData.range;
88
+ // targetR 이하의 병합 셀을 1칸 아래로 이동
89
+ // 삽입 지점을 관통하는 다중행 병합은 자동으로 1행 확장됨
90
+ wsData.shiftMergeCells(targetR, 1);
91
+ // srcR >= targetR인 경우, srcR의 이동된 위치를 보정
92
+ const adjustedSrcR = srcR >= targetR ? srcR + 1 : srcR;
93
+ // 기존 행을 아래로 이동 (덮어쓰기 방지를 위해 아래에서 위로)
94
+ // 병합 셀은 위에서 이미 이동했으므로 skipMerge: true 사용
95
+ for (let r = range.e.r; r >= targetR; r--) {
96
+ wsData.copyRow(r, r + 1, { skipMerge: true });
124
97
  }
125
- }
98
+ // 원본 행을 대상 위치에 복사 (병합은 skipMerge로 건너뜀)
99
+ wsData.copyRow(adjustedSrcR, targetR, { skipMerge: true });
100
+ // 원본 행의 단일행 병합만 대상 행에 복사
101
+ // (다중행 병합은 shiftMergeCells에서 이미 확장 처리됨)
102
+ const allMergeCells = wsData.getMergeCells();
103
+ const sourceMergeCells = allMergeCells.filter((mc) => mc.s.r === adjustedSrcR && mc.e.r === adjustedSrcR);
104
+ for (const mergeCell of sourceMergeCells) {
105
+ const newStartAddr = { r: targetR, c: mergeCell.s.c };
106
+ const newEndAddr = { r: targetR, c: mergeCell.e.c };
107
+ wsData.setMergeCells(newStartAddr, newEndAddr);
108
+ }
109
+ }
110
+ //#endregion
111
+ //#region Range Methods
112
+ /** 워크시트의 데이터 범위 반환 */
113
+ async getRange() {
114
+ const xml = await this._getWsData();
115
+ return xml.range;
126
116
  }
127
- for (let r = startRow + 1; r <= range.e.r; r++) {
128
- if ((opt == null ? void 0 : opt.checkEndColIndex) !== void 0 && await this.cell(r, opt.checkEndColIndex).getValue() === void 0) {
129
- break;
130
- }
131
- const record = {};
132
- for (const header of headerMap.keys()) {
133
- const c = headerMap.get(header);
134
- record[header] = await this.cell(r, c).getValue();
135
- }
136
- result.push(record);
117
+ /** 모든 셀을 2차원 배열로 반환 */
118
+ async getCells() {
119
+ const xml = await this._getWsData();
120
+ const range = xml.range;
121
+ const promises = [];
122
+ for (let r = range.s.r; r <= range.e.r; r++) {
123
+ promises.push(this.row(r).getCells());
124
+ }
125
+ return Promise.all(promises);
137
126
  }
138
- return result;
139
- }
140
- /**
141
- * Write 2D array data to the worksheet
142
- * @param matrix 2D array data (row-major, index 0 is the first row)
143
- */
144
- async setDataMatrix(matrix) {
145
- for (let r = 0; r < matrix.length; r++) {
146
- for (let c = 0; c < matrix[r].length; c++) {
147
- await this.cell(r, c).setValue(matrix[r][c]);
148
- }
127
+ //#endregion
128
+ //#region Data Methods
129
+ /**
130
+ * 워크시트 데이터를 테이블(레코드 배열)로 반환한다.
131
+ * @param opt.headerRowIndex 헤더 인덱스 (기본값: 번째 )
132
+ * @param opt.checkEndColIndex 데이터 끝을 판단할 열 인덱스. 이 열이 비어있으면 데이터가 끝난 것으로 판단한다.
133
+ * @param opt.usableHeaderNameFn 사용 가능한 헤더를 필터링하는 함수
134
+ */
135
+ async getDataTable(opt) {
136
+ const result = [];
137
+ const headerMap = new Map();
138
+ const xml = await this._getWsData();
139
+ const range = xml.range;
140
+ const startRow = opt?.headerRowIndex ?? range.s.r;
141
+ for (let c = range.s.c; c <= range.e.c; c++) {
142
+ const headerName = await this.cell(startRow, c).getValue();
143
+ if (typeof headerName === "string") {
144
+ if (opt?.usableHeaderNameFn == null || opt.usableHeaderNameFn(headerName)) {
145
+ if (headerMap.has(headerName)) {
146
+ throw new Error(`중복된 헤더: "${headerName}" (열 ${headerMap.get(headerName)}과 열 ${c})`);
147
+ }
148
+ headerMap.set(headerName, c);
149
+ }
150
+ }
151
+ }
152
+ for (let r = startRow + 1; r <= range.e.r; r++) {
153
+ if (opt?.checkEndColIndex !== undefined &&
154
+ (await this.cell(r, opt.checkEndColIndex).getValue()) === undefined) {
155
+ break;
156
+ }
157
+ const record = {};
158
+ for (const header of headerMap.keys()) {
159
+ const c = headerMap.get(header);
160
+ record[header] = await this.cell(r, c).getValue();
161
+ }
162
+ result.push(record);
163
+ }
164
+ return result;
149
165
  }
150
- }
151
- /**
152
- * Write record array to the worksheet
153
- * @param records Record array. Headers are auto-generated in the first row, data follows in subsequent rows.
154
- */
155
- async setRecords(records) {
156
- const headers = records.flatMap((item) => Object.keys(item)).distinct().filter((item) => !str.isNullOrEmpty(item));
157
- for (let c = 0; c < headers.length; c++) {
158
- await this.cell(0, c).setValue(headers[c]);
166
+ /**
167
+ * 2차원 배열 데이터를 워크시트에 쓰기
168
+ * @param matrix 2차원 배열 데이터 (행 우선, 인덱스 0이 첫 번째 행)
169
+ */
170
+ async setDataMatrix(matrix) {
171
+ for (let r = 0; r < matrix.length; r++) {
172
+ for (let c = 0; c < matrix[r].length; c++) {
173
+ await this.cell(r, c).setValue(matrix[r][c]);
174
+ }
175
+ }
159
176
  }
160
- for (let r = 1; r < records.length + 1; r++) {
161
- for (let c = 0; c < headers.length; c++) {
162
- await this.cell(r, c).setValue(records[r - 1][headers[c]]);
163
- }
177
+ /**
178
+ * 레코드 배열을 워크시트에 쓰기
179
+ * @param records 레코드 배열. 첫 번째 행에 헤더가 자동 생성되고, 이후 행에 데이터가 기록된다.
180
+ */
181
+ async setRecords(records) {
182
+ const headers = records
183
+ .flatMap((item) => Object.keys(item))
184
+ .distinct()
185
+ .filter((item) => !str.isNullOrEmpty(item));
186
+ for (let c = 0; c < headers.length; c++) {
187
+ await this.cell(0, c).setValue(headers[c]);
188
+ }
189
+ for (let r = 1; r < records.length + 1; r++) {
190
+ for (let c = 0; c < headers.length; c++) {
191
+ await this.cell(r, c).setValue(records[r - 1][headers[c]]);
192
+ }
193
+ }
164
194
  }
165
- }
166
- //#endregion
167
- //#region View Methods
168
- /** Set worksheet zoom scale (percent) */
169
- async setZoom(percent) {
170
- const wbXml = await this._getWbData();
171
- wbXml.initializeView();
172
- const wsXml = await this._getWsData();
173
- wsXml.setZoom(percent);
174
- }
175
- /** Set freeze panes for rows/columns */
176
- async freezeAt(point) {
177
- const wbXml = await this._getWbData();
178
- wbXml.initializeView();
179
- const wsXml = await this._getWsData();
180
- wsXml.freezeAt(point);
181
- }
182
- //#endregion
183
- //#region Image Methods
184
- /**
185
- * Insert an image into the worksheet.
186
- * @param opts.bytes Image binary data
187
- * @param opts.ext Image extension (png, jpg, etc.)
188
- * @param opts.from Image start position (0-based row/column index, rOff/cOff in EMU offset)
189
- * @param opts.to Image end position (if omitted, inserted at from position with original size)
190
- */
191
- async addImage(opts) {
192
- var _a;
193
- const mimeType = mime.getType(opts.ext);
194
- if (mimeType == null) {
195
- throw new Error(`Cannot determine MIME type for extension '${opts.ext}'`);
195
+ //#endregion
196
+ //#region View Methods
197
+ /** 워크시트 확대/축소 비율 설정 (퍼센트) */
198
+ async setZoom(percent) {
199
+ const wbXml = await this._getWbData();
200
+ wbXml.initializeView();
201
+ const wsXml = await this._getWsData();
202
+ wsXml.setZoom(percent);
196
203
  }
197
- let mediaIndex = 1;
198
- while (await this._zipCache.get(`xl/media/image${mediaIndex}.${opts.ext}`) !== void 0) {
199
- mediaIndex++;
204
+ /** 행/열 고정 설정 */
205
+ async freezeAt(point) {
206
+ const wbXml = await this._getWbData();
207
+ wbXml.initializeView();
208
+ const wsXml = await this._getWsData();
209
+ wsXml.freezeAt(point);
200
210
  }
201
- const mediaPath = `xl/media/image${mediaIndex}.${opts.ext}`;
202
- this._zipCache.set(mediaPath, opts.bytes);
203
- const typeXml = await this._zipCache.get("[Content_Types].xml");
204
- typeXml.add(`/xl/media/image${mediaIndex}.${opts.ext}`, mimeType);
205
- const wsXml = await this._getWsData();
206
- const sheetRelsPath = `xl/worksheets/_rels/${this._targetFileName}.rels`;
207
- let sheetRels = await this._zipCache.get(sheetRelsPath);
208
- let drawingIndex;
209
- let drawingPath;
210
- let drawing;
211
- let drawingRels;
212
- if (sheetRels != null) {
213
- const existingDrawingRel = (_a = sheetRels.data.Relationships.Relationship) == null ? void 0 : _a.find(
214
- (r) => r.$.Type === "http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing"
215
- );
216
- if (existingDrawingRel != null) {
217
- const match = existingDrawingRel.$.Target.match(/drawing(\d+)\.xml$/);
218
- if (match != null) {
219
- drawingIndex = parseInt(match[1], 10);
220
- drawingPath = `xl/drawings/drawing${drawingIndex}.xml`;
221
- drawing = await this._zipCache.get(drawingPath);
222
- drawingRels = await this._zipCache.get(
223
- `xl/drawings/_rels/drawing${drawingIndex}.xml.rels`
224
- );
211
+ //#endregion
212
+ //#region Image Methods
213
+ /**
214
+ * 워크시트에 이미지를 삽입한다.
215
+ * @param opts.bytes 이미지 바이너리 데이터
216
+ * @param opts.ext 이미지 확장자 (png, jpg 등)
217
+ * @param opts.from 이미지 시작 위치 (0 기반 행/열 인덱스, rOff/cOff는 EMU 오프셋)
218
+ * @param opts.to 이미지 끝 위치 (생략 시 from 위치에 원본 크기로 삽입)
219
+ */
220
+ async addImage(opts) {
221
+ const mimeType = mime.getType(opts.ext);
222
+ if (mimeType == null) {
223
+ throw new Error(`확장자 '${opts.ext}'에 대한 MIME 타입을 결정할 없습니다`);
224
+ }
225
+ // 1. 미디어 파일명 결정 및 저장
226
+ let mediaIndex = 1;
227
+ while ((await this._zipCache.get(`xl/media/image${mediaIndex}.${opts.ext}`)) !== undefined) {
228
+ mediaIndex++;
229
+ }
230
+ const mediaPath = `xl/media/image${mediaIndex}.${opts.ext}`;
231
+ this._zipCache.set(mediaPath, opts.bytes);
232
+ // 2. [Content_Types].xml 갱신
233
+ const typeXml = (await this._zipCache.get("[Content_Types].xml"));
234
+ typeXml.add(`/xl/media/image${mediaIndex}.${opts.ext}`, mimeType);
235
+ // 3. 워크시트의 기존 drawing 확인
236
+ const wsXml = await this._getWsData();
237
+ const sheetRelsPath = `xl/worksheets/_rels/${this._targetFileName}.rels`;
238
+ let sheetRels = (await this._zipCache.get(sheetRelsPath));
239
+ // 기존 drawing 찾기
240
+ let drawingIndex;
241
+ let drawingPath;
242
+ let drawing;
243
+ let drawingRels;
244
+ if (sheetRels != null) {
245
+ const existingDrawingRel = sheetRels.data.Relationships.Relationship?.find((r) => r.$.Type ===
246
+ "http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing");
247
+ if (existingDrawingRel != null) {
248
+ // 기존 drawing 경로에서 인덱스 추출
249
+ const match = existingDrawingRel.$.Target.match(/drawing(\d+)\.xml$/);
250
+ if (match != null) {
251
+ drawingIndex = parseInt(match[1], 10);
252
+ drawingPath = `xl/drawings/drawing${drawingIndex}.xml`;
253
+ drawing = (await this._zipCache.get(drawingPath));
254
+ drawingRels = (await this._zipCache.get(`xl/drawings/_rels/drawing${drawingIndex}.xml.rels`));
255
+ }
256
+ }
225
257
  }
226
- }
258
+ // 4. 기존 drawing이 없으면 새로 생성
259
+ if (drawingIndex == null || drawingPath == null || drawing == null) {
260
+ drawingIndex = 1;
261
+ while ((await this._zipCache.get(`xl/drawings/drawing${drawingIndex}.xml`)) !== undefined) {
262
+ drawingIndex++;
263
+ }
264
+ drawingPath = `xl/drawings/drawing${drawingIndex}.xml`;
265
+ drawing = new ExcelXmlDrawing();
266
+ // [Content_Types].xml에 drawing 타입 추가
267
+ typeXml.add("/" + drawingPath, "application/vnd.openxmlformats-officedocument.drawing+xml");
268
+ // 워크시트 rels에 drawing 추가
269
+ sheetRels = sheetRels ?? new ExcelXmlRelationship();
270
+ const sheetRelNum = sheetRels.addAndGetId(`../drawings/drawing${drawingIndex}.xml`, "http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing");
271
+ const drawingRelIdOnWorksheet = `rId${sheetRelNum}`;
272
+ this._zipCache.set(sheetRelsPath, sheetRels);
273
+ // 워크시트 XML에 drawing 추가
274
+ wsXml.data.worksheet.$["xmlns:r"] =
275
+ wsXml.data.worksheet.$["xmlns:r"] ??
276
+ "http://schemas.openxmlformats.org/officeDocument/2006/relationships";
277
+ wsXml.data.worksheet.drawing = wsXml.data.worksheet.drawing ?? [];
278
+ wsXml.data.worksheet.drawing.push({ $: { "r:id": drawingRelIdOnWorksheet } });
279
+ this._zipCache.set(`xl/worksheets/${this._targetFileName}`, wsXml);
280
+ }
281
+ // 5. drawing rels 준비 (없으면 생성)
282
+ drawingRels = drawingRels ?? new ExcelXmlRelationship();
283
+ const mediaFileName = mediaPath.slice(3);
284
+ const drawingTarget = `../${mediaFileName}`;
285
+ const relNum = drawingRels.addAndGetId(drawingTarget, "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image");
286
+ this._zipCache.set(`xl/drawings/_rels/drawing${drawingIndex}.xml.rels`, drawingRels);
287
+ // 6. drawing에 이미지 추가
288
+ const blipRelId = `rId${relNum}`;
289
+ drawing.addPicture({
290
+ from: opts.from,
291
+ to: opts.to ?? { r: opts.from.r + 1, c: opts.from.c + 1 },
292
+ blipRelId: blipRelId,
293
+ });
294
+ this._zipCache.set(drawingPath, drawing);
295
+ }
296
+ //#endregion
297
+ //#region Private Methods
298
+ async _getWsData() {
299
+ return (await this._zipCache.get(`xl/worksheets/${this._targetFileName}`));
227
300
  }
228
- if (drawingIndex == null || drawingPath == null || drawing == null) {
229
- drawingIndex = 1;
230
- while (await this._zipCache.get(`xl/drawings/drawing${drawingIndex}.xml`) !== void 0) {
231
- drawingIndex++;
232
- }
233
- drawingPath = `xl/drawings/drawing${drawingIndex}.xml`;
234
- drawing = new ExcelXmlDrawing();
235
- typeXml.add("/" + drawingPath, "application/vnd.openxmlformats-officedocument.drawing+xml");
236
- sheetRels = sheetRels ?? new ExcelXmlRelationship();
237
- const sheetRelNum = sheetRels.addAndGetId(
238
- `../drawings/drawing${drawingIndex}.xml`,
239
- "http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing"
240
- );
241
- const drawingRelIdOnWorksheet = `rId${sheetRelNum}`;
242
- this._zipCache.set(sheetRelsPath, sheetRels);
243
- wsXml.data.worksheet.$["xmlns:r"] = wsXml.data.worksheet.$["xmlns:r"] ?? "http://schemas.openxmlformats.org/officeDocument/2006/relationships";
244
- wsXml.data.worksheet.drawing = wsXml.data.worksheet.drawing ?? [];
245
- wsXml.data.worksheet.drawing.push({ $: { "r:id": drawingRelIdOnWorksheet } });
246
- this._zipCache.set(`xl/worksheets/${this._targetFileName}`, wsXml);
301
+ async _getWbData() {
302
+ return (await this._zipCache.get("xl/workbook.xml"));
247
303
  }
248
- drawingRels = drawingRels ?? new ExcelXmlRelationship();
249
- const mediaFileName = mediaPath.slice(3);
250
- const drawingTarget = `../${mediaFileName}`;
251
- const relNum = drawingRels.addAndGetId(
252
- drawingTarget,
253
- "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image"
254
- );
255
- this._zipCache.set(`xl/drawings/_rels/drawing${drawingIndex}.xml.rels`, drawingRels);
256
- const blipRelId = `rId${relNum}`;
257
- drawing.addPicture({
258
- from: opts.from,
259
- to: opts.to ?? { r: opts.from.r + 1, c: opts.from.c + 1 },
260
- blipRelId
261
- });
262
- this._zipCache.set(drawingPath, drawing);
263
- }
264
- //#endregion
265
- //#region Private Methods
266
- async _getWsData() {
267
- return await this._zipCache.get(`xl/worksheets/${this._targetFileName}`);
268
- }
269
- async _getWbData() {
270
- return await this._zipCache.get("xl/workbook.xml");
271
- }
272
- //#endregion
273
304
  }
274
- export {
275
- ExcelWorksheet
276
- };
277
- //# sourceMappingURL=excel-worksheet.js.map
305
+ //# sourceMappingURL=excel-worksheet.js.map
@@ -1,6 +1 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/excel-worksheet.ts"],
4
- "mappings": "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",
5
- "names": []
6
- }
1
+ {"version":3,"file":"excel-worksheet.js","sourceRoot":"","sources":["..\\src\\excel-worksheet.ts"],"names":[],"mappings":"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"}
@@ -2,28 +2,28 @@ import type { Bytes } from "@simplysm/core-common";
2
2
  import { type z } from "zod";
3
3
  import { ExcelWorkbook } from "./excel-workbook";
4
4
  /**
5
- * Zod schema-based Excel wrapper
5
+ * Zod 스키마 기반 Excel 래퍼
6
6
  *
7
- * Infers type information from schema to provide type-safe read/write
7
+ * 스키마에서 타입 정보를 추론하여 타입 안전한 읽기/쓰기를 제공한다
8
8
  */
9
9
  export declare class ExcelWrapper<TSchema extends z.ZodObject<z.ZodRawShape>> {
10
10
  private readonly _schema;
11
11
  /**
12
- * @param _schema Zod schema (defines record structure, use `.describe()` to specify Excel header names)
12
+ * @param _schema Zod 스키마 (레코드 구조를 정의하며, `.describe()`로 Excel 헤더 이름을 지정)
13
13
  */
14
14
  constructor(_schema: TSchema);
15
15
  /**
16
- * Read Excel file into record array
16
+ * Excel 파일을 레코드 배열로 읽기
17
17
  */
18
18
  read(file: Bytes | Blob, wsNameOrIndex?: string | number, options?: {
19
19
  excludes?: (keyof z.infer<TSchema>)[];
20
20
  }): Promise<z.infer<TSchema>[]>;
21
21
  /**
22
- * Record array to Excel workbook
22
+ * 레코드 배열을 Excel 워크북으로 변환
23
23
  *
24
24
  * @remarks
25
- * The caller is responsible for managing the returned workbook's resources.
26
- * Use `await using` or call `close()` after use.
25
+ * 반환된 워크북의 리소스 관리는 호출자의 책임이다.
26
+ * `await using`을 사용하거나 사용 `close()`를 호출해야 한다.
27
27
  *
28
28
  * @example
29
29
  * ```typescript