@simplysm/excel 14.0.30 → 14.0.32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/excel-workbook.d.ts +0 -8
- package/dist/excel-workbook.d.ts.map +1 -1
- package/dist/excel-workbook.js +0 -10
- package/dist/excel-workbook.js.map +1 -1
- package/dist/excel-wrapper.d.ts +7 -3
- package/dist/excel-wrapper.d.ts.map +1 -1
- package/dist/excel-wrapper.js +49 -40
- package/dist/excel-wrapper.js.map +1 -1
- package/package.json +2 -2
- package/src/excel-workbook.ts +0 -11
- package/src/excel-wrapper.ts +50 -43
package/dist/excel-workbook.d.ts
CHANGED
|
@@ -17,13 +17,6 @@ import { ZipCache } from "./utils/zip-cache";
|
|
|
17
17
|
*
|
|
18
18
|
* @example
|
|
19
19
|
* ```typescript
|
|
20
|
-
* // await using 사용 (권장)
|
|
21
|
-
* await using wb = new ExcelWorkbook(bytes);
|
|
22
|
-
* const ws = await wb.getWorksheet(0);
|
|
23
|
-
* // ... 작업 수행
|
|
24
|
-
* // 스코프 종료 시 리소스 자동 해제
|
|
25
|
-
*
|
|
26
|
-
* // 또는 try-finally 사용
|
|
27
20
|
* const wb = new ExcelWorkbook(bytes);
|
|
28
21
|
* try {
|
|
29
22
|
* const ws = await wb.getWorksheet(0);
|
|
@@ -61,6 +54,5 @@ export declare class ExcelWorkbook {
|
|
|
61
54
|
* 이미 닫힌 워크북에 대해 호출해도 안전하다 (no-op).
|
|
62
55
|
*/
|
|
63
56
|
close(): Promise<void>;
|
|
64
|
-
[Symbol.asyncDispose](): Promise<void>;
|
|
65
57
|
}
|
|
66
58
|
//# sourceMappingURL=excel-workbook.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"excel-workbook.d.ts","sourceRoot":"","sources":["../src/excel-workbook.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAO7C
|
|
1
|
+
{"version":3,"file":"excel-workbook.d.ts","sourceRoot":"","sources":["../src/excel-workbook.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAO7C;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,aAAa;IACxB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqC;IAC5D,OAAO,CAAC,SAAS,CAAS;IAE1B;;OAEG;gBACS,GAAG,CAAC,EAAE,IAAI,GAAG,KAAK;IA+B9B,OAAO,CAAC,gBAAgB;IAMxB,yBAAyB;IACnB,iBAAiB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAM5C,sBAAsB;IAChB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAgCzD,+BAA+B;IACzB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAyCzE,wBAAwB;IAClB,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC;IAK/B,uBAAuB;IACjB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAY7B;;;;;;;OAOG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAU7B"}
|
package/dist/excel-workbook.js
CHANGED
|
@@ -20,13 +20,6 @@ import { ExcelXmlWorksheet as ExcelXmlWorksheetClass } from "./xml/excel-xml-wor
|
|
|
20
20
|
*
|
|
21
21
|
* @example
|
|
22
22
|
* ```typescript
|
|
23
|
-
* // await using 사용 (권장)
|
|
24
|
-
* await using wb = new ExcelWorkbook(bytes);
|
|
25
|
-
* const ws = await wb.getWorksheet(0);
|
|
26
|
-
* // ... 작업 수행
|
|
27
|
-
* // 스코프 종료 시 리소스 자동 해제
|
|
28
|
-
*
|
|
29
|
-
* // 또는 try-finally 사용
|
|
30
23
|
* const wb = new ExcelWorkbook(bytes);
|
|
31
24
|
* try {
|
|
32
25
|
* const ws = await wb.getWorksheet(0);
|
|
@@ -158,8 +151,5 @@ export class ExcelWorkbook {
|
|
|
158
151
|
this._wsMap.clear();
|
|
159
152
|
await this.zipCache.close();
|
|
160
153
|
}
|
|
161
|
-
async [Symbol.asyncDispose]() {
|
|
162
|
-
await this.close();
|
|
163
|
-
}
|
|
164
154
|
}
|
|
165
155
|
//# sourceMappingURL=excel-workbook.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"excel-workbook.js","sourceRoot":"","sources":["../src/excel-workbook.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAEpE,OAAO,EAAE,gBAAgB,IAAI,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACrF,OAAO,EAAE,iBAAiB,IAAI,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAExF
|
|
1
|
+
{"version":3,"file":"excel-workbook.js","sourceRoot":"","sources":["../src/excel-workbook.ts"],"names":[],"mappings":"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"}
|
package/dist/excel-wrapper.d.ts
CHANGED
|
@@ -23,12 +23,16 @@ export declare class ExcelWrapper<TSchema extends z.ZodObject<z.ZodRawShape>> {
|
|
|
23
23
|
*
|
|
24
24
|
* @remarks
|
|
25
25
|
* 반환된 워크북의 리소스 관리는 호출자의 책임이다.
|
|
26
|
-
*
|
|
26
|
+
* 사용 후 `close()`를 호출해야 한다.
|
|
27
27
|
*
|
|
28
28
|
* @example
|
|
29
29
|
* ```typescript
|
|
30
|
-
*
|
|
31
|
-
*
|
|
30
|
+
* const wb = await wrapper.write("Sheet1", records);
|
|
31
|
+
* try {
|
|
32
|
+
* const bytes = await wb.toBytes();
|
|
33
|
+
* } finally {
|
|
34
|
+
* await wb.close();
|
|
35
|
+
* }
|
|
32
36
|
* ```
|
|
33
37
|
*/
|
|
34
38
|
write(wsName: string, records: Partial<z.infer<TSchema>>[], options?: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"excel-wrapper.d.ts","sourceRoot":"","sources":["../src/excel-wrapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAEnD,OAAO,EACL,KAAK,CAAC,EAOP,MAAM,KAAK,CAAC;AACb,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGjD;;;;GAIG;AACH,qBAAa,YAAY,CAAC,OAAO,SAAS,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC;IAItD,OAAO,CAAC,QAAQ,CAAC,OAAO;IAHpC;;OAEG;gBAC0B,OAAO,EAAE,OAAO;IAE7C;;OAEG;IACG,IAAI,CACR,IAAI,EAAE,KAAK,GAAG,IAAI,EAClB,aAAa,GAAE,MAAM,GAAG,MAAU,EAClC,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,CAAA;KAAE,GAClD,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"excel-wrapper.d.ts","sourceRoot":"","sources":["../src/excel-wrapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAEnD,OAAO,EACL,KAAK,CAAC,EAOP,MAAM,KAAK,CAAC;AACb,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGjD;;;;GAIG;AACH,qBAAa,YAAY,CAAC,OAAO,SAAS,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC;IAItD,OAAO,CAAC,QAAQ,CAAC,OAAO;IAHpC;;OAEG;gBAC0B,OAAO,EAAE,OAAO;IAE7C;;OAEG;IACG,IAAI,CACR,IAAI,EAAE,KAAK,GAAG,IAAI,EAClB,aAAa,GAAE,MAAM,GAAG,MAAU,EAClC,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,CAAA;KAAE,GAClD,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;IA6D9B;;;;;;;;;;;;;;;;OAgBG;IACG,KAAK,CACT,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,EACpC,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,CAAA;KAAE,GAClD,OAAO,CAAC,aAAa,CAAC;IA0DzB,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,yBAAyB;IAQjC,OAAO,CAAC,aAAa;IA+BrB,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,oBAAoB;IAmB5B,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,UAAU;CAMnB"}
|
package/dist/excel-wrapper.js
CHANGED
|
@@ -18,58 +18,67 @@ export class ExcelWrapper {
|
|
|
18
18
|
* Excel 파일을 레코드 배열로 읽기
|
|
19
19
|
*/
|
|
20
20
|
async read(file, wsNameOrIndex = 0, options) {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
const reverseMap = this._getReverseDisplayNameMap(excludes);
|
|
34
|
-
const shape = this._schema.shape;
|
|
35
|
-
const result = [];
|
|
36
|
-
for (const row of rawData) {
|
|
37
|
-
const record = {};
|
|
38
|
-
let hasNonNullValue = false;
|
|
39
|
-
for (const [displayName, fieldKey] of reverseMap) {
|
|
40
|
-
const rawValue = row[displayName];
|
|
41
|
-
const fieldSchema = shape[fieldKey];
|
|
42
|
-
if (rawValue != null && rawValue !== "") {
|
|
43
|
-
hasNonNullValue = true;
|
|
44
|
-
}
|
|
45
|
-
record[fieldKey] = this._convertValue(rawValue, fieldSchema);
|
|
46
|
-
}
|
|
47
|
-
if (!hasNonNullValue) {
|
|
48
|
-
continue;
|
|
21
|
+
const wb = new ExcelWorkbook(file);
|
|
22
|
+
try {
|
|
23
|
+
const excludes = options?.excludes;
|
|
24
|
+
const ws = await wb.getWorksheet(wsNameOrIndex);
|
|
25
|
+
const wsName = await ws.getName();
|
|
26
|
+
const displayNameMap = this._getDisplayNameMap(excludes);
|
|
27
|
+
const displayNames = Object.values(displayNameMap);
|
|
28
|
+
const rawData = await ws.getDataTable({
|
|
29
|
+
usableHeaderNameFn: (headerName) => displayNames.includes(headerName),
|
|
30
|
+
});
|
|
31
|
+
if (rawData.length === 0) {
|
|
32
|
+
throw new Error(`[${wsName}] Excel 파일에서 데이터를 찾을 수 없습니다. (기대하는 헤더: ${displayNames.join(", ")})`);
|
|
49
33
|
}
|
|
50
|
-
|
|
51
|
-
const
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
34
|
+
const reverseMap = this._getReverseDisplayNameMap(excludes);
|
|
35
|
+
const shape = this._schema.shape;
|
|
36
|
+
const result = [];
|
|
37
|
+
for (const row of rawData) {
|
|
38
|
+
const record = {};
|
|
39
|
+
let hasNonNullValue = false;
|
|
40
|
+
for (const [displayName, fieldKey] of reverseMap) {
|
|
41
|
+
const rawValue = row[displayName];
|
|
42
|
+
const fieldSchema = shape[fieldKey];
|
|
43
|
+
if (rawValue != null && rawValue !== "") {
|
|
44
|
+
hasNonNullValue = true;
|
|
45
|
+
}
|
|
46
|
+
record[fieldKey] = this._convertValue(rawValue, fieldSchema);
|
|
47
|
+
}
|
|
48
|
+
if (!hasNonNullValue) {
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
// Zod 스키마로 유효성 검사
|
|
52
|
+
const parseResult = this._schema.safeParse(record);
|
|
53
|
+
if (!parseResult.success) {
|
|
54
|
+
const errors = parseResult.error.issues
|
|
55
|
+
.map((issue) => `${issue.path.join(".")}: ${issue.message}`)
|
|
56
|
+
.join(", ");
|
|
57
|
+
throw new Error(`[${wsName}] 데이터 유효성 검사 실패: ${errors}`);
|
|
58
|
+
}
|
|
59
|
+
result.push(parseResult.data);
|
|
57
60
|
}
|
|
58
|
-
result
|
|
61
|
+
return result;
|
|
62
|
+
}
|
|
63
|
+
finally {
|
|
64
|
+
await wb.close();
|
|
59
65
|
}
|
|
60
|
-
return result;
|
|
61
66
|
}
|
|
62
67
|
/**
|
|
63
68
|
* 레코드 배열을 Excel 워크북으로 변환
|
|
64
69
|
*
|
|
65
70
|
* @remarks
|
|
66
71
|
* 반환된 워크북의 리소스 관리는 호출자의 책임이다.
|
|
67
|
-
*
|
|
72
|
+
* 사용 후 `close()`를 호출해야 한다.
|
|
68
73
|
*
|
|
69
74
|
* @example
|
|
70
75
|
* ```typescript
|
|
71
|
-
*
|
|
72
|
-
*
|
|
76
|
+
* const wb = await wrapper.write("Sheet1", records);
|
|
77
|
+
* try {
|
|
78
|
+
* const bytes = await wb.toBytes();
|
|
79
|
+
* } finally {
|
|
80
|
+
* await wb.close();
|
|
81
|
+
* }
|
|
73
82
|
* ```
|
|
74
83
|
*/
|
|
75
84
|
async write(wsName, records, options) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"excel-wrapper.js","sourceRoot":"","sources":["../src/excel-wrapper.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,EAEL,UAAU,EACV,UAAU,EACV,WAAW,EACX,SAAS,EACT,WAAW,EACX,SAAS,GACV,MAAM,KAAK,CAAC;AACb,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGjD;;;;GAIG;AACH,MAAM,OAAO,YAAY;IAIM;IAH7B;;OAEG;IACH,YAA6B,OAAgB;QAAhB,YAAO,GAAP,OAAO,CAAS;IAAG,CAAC;IAEjD;;OAEG;IACH,KAAK,CAAC,IAAI,CACR,IAAkB,EAClB,gBAAiC,CAAC,EAClC,OAAmD;QAEnD,
|
|
1
|
+
{"version":3,"file":"excel-wrapper.js","sourceRoot":"","sources":["../src/excel-wrapper.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@simplysm/excel",
|
|
3
|
-
"version": "14.0.
|
|
3
|
+
"version": "14.0.32",
|
|
4
4
|
"description": "심플리즘 패키지 - 엑셀 (neutral)",
|
|
5
5
|
"author": "심플리즘",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -23,6 +23,6 @@
|
|
|
23
23
|
"dependencies": {
|
|
24
24
|
"mime": "^4.1.0",
|
|
25
25
|
"zod": "^4.3.6",
|
|
26
|
-
"@simplysm/core-common": "14.0.
|
|
26
|
+
"@simplysm/core-common": "14.0.32"
|
|
27
27
|
}
|
|
28
28
|
}
|
package/src/excel-workbook.ts
CHANGED
|
@@ -23,13 +23,6 @@ import { ExcelXmlWorksheet as ExcelXmlWorksheetClass } from "./xml/excel-xml-wor
|
|
|
23
23
|
*
|
|
24
24
|
* @example
|
|
25
25
|
* ```typescript
|
|
26
|
-
* // await using 사용 (권장)
|
|
27
|
-
* await using wb = new ExcelWorkbook(bytes);
|
|
28
|
-
* const ws = await wb.getWorksheet(0);
|
|
29
|
-
* // ... 작업 수행
|
|
30
|
-
* // 스코프 종료 시 리소스 자동 해제
|
|
31
|
-
*
|
|
32
|
-
* // 또는 try-finally 사용
|
|
33
26
|
* const wb = new ExcelWorkbook(bytes);
|
|
34
27
|
* try {
|
|
35
28
|
* const ws = await wb.getWorksheet(0);
|
|
@@ -202,9 +195,5 @@ export class ExcelWorkbook {
|
|
|
202
195
|
await this.zipCache.close();
|
|
203
196
|
}
|
|
204
197
|
|
|
205
|
-
async [Symbol.asyncDispose](): Promise<void> {
|
|
206
|
-
await this.close();
|
|
207
|
-
}
|
|
208
|
-
|
|
209
198
|
//#endregion
|
|
210
199
|
}
|
package/src/excel-wrapper.ts
CHANGED
|
@@ -31,61 +31,64 @@ export class ExcelWrapper<TSchema extends z.ZodObject<z.ZodRawShape>> {
|
|
|
31
31
|
wsNameOrIndex: string | number = 0,
|
|
32
32
|
options?: { excludes?: (keyof z.infer<TSchema>)[] },
|
|
33
33
|
): Promise<z.infer<TSchema>[]> {
|
|
34
|
-
|
|
34
|
+
const wb = new ExcelWorkbook(file);
|
|
35
|
+
try {
|
|
36
|
+
const excludes = options?.excludes as string[] | undefined;
|
|
35
37
|
|
|
36
|
-
|
|
38
|
+
const ws = await wb.getWorksheet(wsNameOrIndex);
|
|
39
|
+
const wsName = await ws.getName();
|
|
37
40
|
|
|
38
|
-
|
|
39
|
-
|
|
41
|
+
const displayNameMap = this._getDisplayNameMap(excludes);
|
|
42
|
+
const displayNames = Object.values(displayNameMap);
|
|
43
|
+
const rawData = await ws.getDataTable({
|
|
44
|
+
usableHeaderNameFn: (headerName) => displayNames.includes(headerName),
|
|
45
|
+
});
|
|
40
46
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
47
|
+
if (rawData.length === 0) {
|
|
48
|
+
throw new Error(
|
|
49
|
+
`[${wsName}] Excel 파일에서 데이터를 찾을 수 없습니다. (기대하는 헤더: ${displayNames.join(", ")})`,
|
|
50
|
+
);
|
|
51
|
+
}
|
|
46
52
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
);
|
|
51
|
-
}
|
|
53
|
+
const reverseMap = this._getReverseDisplayNameMap(excludes);
|
|
54
|
+
const shape = this._schema.shape;
|
|
55
|
+
const result: z.infer<TSchema>[] = [];
|
|
52
56
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
57
|
+
for (const row of rawData) {
|
|
58
|
+
const record: Record<string, unknown> = {};
|
|
59
|
+
let hasNonNullValue = false;
|
|
56
60
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
61
|
+
for (const [displayName, fieldKey] of reverseMap) {
|
|
62
|
+
const rawValue = row[displayName];
|
|
63
|
+
const fieldSchema = shape[fieldKey] as z.ZodType;
|
|
60
64
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
65
|
+
if (rawValue != null && rawValue !== "") {
|
|
66
|
+
hasNonNullValue = true;
|
|
67
|
+
}
|
|
64
68
|
|
|
65
|
-
|
|
66
|
-
hasNonNullValue = true;
|
|
69
|
+
record[fieldKey] = this._convertValue(rawValue, fieldSchema);
|
|
67
70
|
}
|
|
68
71
|
|
|
69
|
-
|
|
70
|
-
|
|
72
|
+
if (!hasNonNullValue) {
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
71
75
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
76
|
+
// Zod 스키마로 유효성 검사
|
|
77
|
+
const parseResult = this._schema.safeParse(record);
|
|
78
|
+
if (!parseResult.success) {
|
|
79
|
+
const errors = parseResult.error.issues
|
|
80
|
+
.map((issue) => `${issue.path.join(".")}: ${issue.message}`)
|
|
81
|
+
.join(", ");
|
|
82
|
+
throw new Error(`[${wsName}] 데이터 유효성 검사 실패: ${errors}`);
|
|
83
|
+
}
|
|
75
84
|
|
|
76
|
-
|
|
77
|
-
const parseResult = this._schema.safeParse(record);
|
|
78
|
-
if (!parseResult.success) {
|
|
79
|
-
const errors = parseResult.error.issues
|
|
80
|
-
.map((issue) => `${issue.path.join(".")}: ${issue.message}`)
|
|
81
|
-
.join(", ");
|
|
82
|
-
throw new Error(`[${wsName}] 데이터 유효성 검사 실패: ${errors}`);
|
|
85
|
+
result.push(parseResult.data);
|
|
83
86
|
}
|
|
84
87
|
|
|
85
|
-
result
|
|
88
|
+
return result;
|
|
89
|
+
} finally {
|
|
90
|
+
await wb.close();
|
|
86
91
|
}
|
|
87
|
-
|
|
88
|
-
return result;
|
|
89
92
|
}
|
|
90
93
|
|
|
91
94
|
/**
|
|
@@ -93,12 +96,16 @@ export class ExcelWrapper<TSchema extends z.ZodObject<z.ZodRawShape>> {
|
|
|
93
96
|
*
|
|
94
97
|
* @remarks
|
|
95
98
|
* 반환된 워크북의 리소스 관리는 호출자의 책임이다.
|
|
96
|
-
*
|
|
99
|
+
* 사용 후 `close()`를 호출해야 한다.
|
|
97
100
|
*
|
|
98
101
|
* @example
|
|
99
102
|
* ```typescript
|
|
100
|
-
*
|
|
101
|
-
*
|
|
103
|
+
* const wb = await wrapper.write("Sheet1", records);
|
|
104
|
+
* try {
|
|
105
|
+
* const bytes = await wb.toBytes();
|
|
106
|
+
* } finally {
|
|
107
|
+
* await wb.close();
|
|
108
|
+
* }
|
|
102
109
|
* ```
|
|
103
110
|
*/
|
|
104
111
|
async write(
|