@simplysm/excel 13.0.0-beta.4 → 13.0.0-beta.44
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -0
- package/dist/excel-cell.d.ts.map +1 -0
- package/dist/excel-cell.js +3 -3
- package/dist/excel-col.d.ts.map +1 -0
- package/dist/excel-col.js +1 -1
- package/dist/excel-row.d.ts.map +1 -0
- package/dist/excel-row.js +1 -1
- package/dist/excel-workbook.d.ts.map +1 -0
- package/dist/excel-workbook.js +7 -7
- package/dist/excel-workbook.js.map +2 -2
- package/dist/excel-worksheet.d.ts.map +1 -0
- package/dist/excel-worksheet.js +4 -4
- package/dist/excel-wrapper.d.ts.map +1 -0
- package/dist/excel-wrapper.js +1 -1
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -8
- package/dist/types.d.ts.map +1 -0
- package/dist/utils/excel-utils.d.ts.map +1 -0
- package/dist/utils/zip-cache.d.ts.map +1 -0
- package/dist/utils/zip-cache.js +8 -8
- package/dist/xml/excel-xml-content-type.d.ts.map +1 -0
- package/dist/xml/excel-xml-drawing.d.ts.map +1 -0
- package/dist/xml/excel-xml-relationship.d.ts.map +1 -0
- package/dist/xml/excel-xml-shared-string.d.ts.map +1 -0
- package/dist/xml/excel-xml-style.d.ts.map +1 -0
- package/dist/xml/excel-xml-unknown.d.ts.map +1 -0
- package/dist/xml/excel-xml-workbook.d.ts.map +1 -0
- package/dist/xml/excel-xml-worksheet.d.ts.map +1 -0
- package/dist/xml/excel-xml-worksheet.js +1 -1
- package/package.json +7 -4
- package/.cache/typecheck-browser.tsbuildinfo +0 -1
- package/.cache/typecheck-node.tsbuildinfo +0 -1
- package/.cache/typecheck-tests-browser.tsbuildinfo +0 -1
- package/.cache/typecheck-tests-node.tsbuildinfo +0 -1
- package/dist/core-common/src/common.types.d.ts +0 -74
- package/dist/core-common/src/common.types.d.ts.map +0 -1
- package/dist/core-common/src/env.d.ts +0 -6
- package/dist/core-common/src/env.d.ts.map +0 -1
- package/dist/core-common/src/errors/argument-error.d.ts +0 -25
- package/dist/core-common/src/errors/argument-error.d.ts.map +0 -1
- package/dist/core-common/src/errors/not-implemented-error.d.ts +0 -29
- package/dist/core-common/src/errors/not-implemented-error.d.ts.map +0 -1
- package/dist/core-common/src/errors/sd-error.d.ts +0 -27
- package/dist/core-common/src/errors/sd-error.d.ts.map +0 -1
- package/dist/core-common/src/errors/timeout-error.d.ts +0 -31
- package/dist/core-common/src/errors/timeout-error.d.ts.map +0 -1
- package/dist/core-common/src/extensions/arr-ext.d.ts +0 -15
- package/dist/core-common/src/extensions/arr-ext.d.ts.map +0 -1
- package/dist/core-common/src/extensions/arr-ext.helpers.d.ts +0 -19
- package/dist/core-common/src/extensions/arr-ext.helpers.d.ts.map +0 -1
- package/dist/core-common/src/extensions/arr-ext.types.d.ts +0 -215
- package/dist/core-common/src/extensions/arr-ext.types.d.ts.map +0 -1
- package/dist/core-common/src/extensions/map-ext.d.ts +0 -57
- package/dist/core-common/src/extensions/map-ext.d.ts.map +0 -1
- package/dist/core-common/src/extensions/set-ext.d.ts +0 -36
- package/dist/core-common/src/extensions/set-ext.d.ts.map +0 -1
- package/dist/core-common/src/features/debounce-queue.d.ts +0 -53
- package/dist/core-common/src/features/debounce-queue.d.ts.map +0 -1
- package/dist/core-common/src/features/event-emitter.d.ts +0 -66
- package/dist/core-common/src/features/event-emitter.d.ts.map +0 -1
- package/dist/core-common/src/features/serial-queue.d.ts +0 -47
- package/dist/core-common/src/features/serial-queue.d.ts.map +0 -1
- package/dist/core-common/src/index.d.ts +0 -32
- package/dist/core-common/src/index.d.ts.map +0 -1
- package/dist/core-common/src/types/date-only.d.ts +0 -152
- package/dist/core-common/src/types/date-only.d.ts.map +0 -1
- package/dist/core-common/src/types/date-time.d.ts +0 -96
- package/dist/core-common/src/types/date-time.d.ts.map +0 -1
- package/dist/core-common/src/types/lazy-gc-map.d.ts +0 -80
- package/dist/core-common/src/types/lazy-gc-map.d.ts.map +0 -1
- package/dist/core-common/src/types/time.d.ts +0 -68
- package/dist/core-common/src/types/time.d.ts.map +0 -1
- package/dist/core-common/src/types/uuid.d.ts +0 -35
- package/dist/core-common/src/types/uuid.d.ts.map +0 -1
- package/dist/core-common/src/utils/bytes.d.ts +0 -51
- package/dist/core-common/src/utils/bytes.d.ts.map +0 -1
- package/dist/core-common/src/utils/date-format.d.ts +0 -90
- package/dist/core-common/src/utils/date-format.d.ts.map +0 -1
- package/dist/core-common/src/utils/json.d.ts +0 -34
- package/dist/core-common/src/utils/json.d.ts.map +0 -1
- package/dist/core-common/src/utils/num.d.ts +0 -60
- package/dist/core-common/src/utils/num.d.ts.map +0 -1
- package/dist/core-common/src/utils/obj.d.ts +0 -258
- package/dist/core-common/src/utils/obj.d.ts.map +0 -1
- package/dist/core-common/src/utils/path.d.ts +0 -23
- package/dist/core-common/src/utils/path.d.ts.map +0 -1
- package/dist/core-common/src/utils/primitive.d.ts +0 -18
- package/dist/core-common/src/utils/primitive.d.ts.map +0 -1
- package/dist/core-common/src/utils/str.d.ts +0 -103
- package/dist/core-common/src/utils/str.d.ts.map +0 -1
- package/dist/core-common/src/utils/template-strings.d.ts +0 -84
- package/dist/core-common/src/utils/template-strings.d.ts.map +0 -1
- package/dist/core-common/src/utils/transferable.d.ts +0 -47
- package/dist/core-common/src/utils/transferable.d.ts.map +0 -1
- package/dist/core-common/src/utils/wait.d.ts +0 -19
- package/dist/core-common/src/utils/wait.d.ts.map +0 -1
- package/dist/core-common/src/utils/xml.d.ts +0 -36
- package/dist/core-common/src/utils/xml.d.ts.map +0 -1
- package/dist/core-common/src/zip/sd-zip.d.ts +0 -80
- package/dist/core-common/src/zip/sd-zip.d.ts.map +0 -1
- package/dist/excel/src/excel-cell.d.ts.map +0 -1
- package/dist/excel/src/excel-col.d.ts.map +0 -1
- package/dist/excel/src/excel-row.d.ts.map +0 -1
- package/dist/excel/src/excel-workbook.d.ts.map +0 -1
- package/dist/excel/src/excel-worksheet.d.ts.map +0 -1
- package/dist/excel/src/excel-wrapper.d.ts.map +0 -1
- package/dist/excel/src/index.d.ts.map +0 -1
- package/dist/excel/src/types.d.ts.map +0 -1
- package/dist/excel/src/utils/excel-utils.d.ts.map +0 -1
- package/dist/excel/src/utils/zip-cache.d.ts.map +0 -1
- package/dist/excel/src/xml/excel-xml-content-type.d.ts.map +0 -1
- package/dist/excel/src/xml/excel-xml-drawing.d.ts.map +0 -1
- package/dist/excel/src/xml/excel-xml-relationship.d.ts.map +0 -1
- package/dist/excel/src/xml/excel-xml-shared-string.d.ts.map +0 -1
- package/dist/excel/src/xml/excel-xml-style.d.ts.map +0 -1
- package/dist/excel/src/xml/excel-xml-unknown.d.ts.map +0 -1
- package/dist/excel/src/xml/excel-xml-workbook.d.ts.map +0 -1
- package/dist/excel/src/xml/excel-xml-worksheet.d.ts.map +0 -1
- package/src/excel-cell.ts +0 -326
- package/src/excel-col.ts +0 -43
- package/src/excel-row.ts +0 -37
- package/src/excel-workbook.ts +0 -206
- package/src/excel-worksheet.ts +0 -380
- package/src/excel-wrapper.ts +0 -219
- package/src/index.ts +0 -13
- package/src/types.ts +0 -396
- package/src/utils/excel-utils.ts +0 -201
- package/src/utils/zip-cache.ts +0 -103
- package/src/xml/excel-xml-content-type.ts +0 -64
- package/src/xml/excel-xml-drawing.ts +0 -87
- package/src/xml/excel-xml-relationship.ts +0 -86
- package/src/xml/excel-xml-shared-string.ts +0 -80
- package/src/xml/excel-xml-style.ts +0 -393
- package/src/xml/excel-xml-unknown.ts +0 -11
- package/src/xml/excel-xml-workbook.ts +0 -112
- package/src/xml/excel-xml-worksheet.ts +0 -544
- package/tests/excel-cell.spec.ts +0 -407
- package/tests/excel-col.spec.ts +0 -112
- package/tests/excel-row.spec.ts +0 -71
- package/tests/excel-workbook.spec.ts +0 -166
- package/tests/excel-worksheet.spec.ts +0 -389
- package/tests/excel-wrapper.spec.ts +0 -275
- package/tests/fixtures/logo.png +0 -0
- package/tests/image-insert.spec.ts +0 -188
- package/tests/utils/excel-utils.spec.ts +0 -240
- /package/dist/{excel/src/excel-cell.d.ts → excel-cell.d.ts} +0 -0
- /package/dist/{excel/src/excel-col.d.ts → excel-col.d.ts} +0 -0
- /package/dist/{excel/src/excel-row.d.ts → excel-row.d.ts} +0 -0
- /package/dist/{excel/src/excel-workbook.d.ts → excel-workbook.d.ts} +0 -0
- /package/dist/{excel/src/excel-worksheet.d.ts → excel-worksheet.d.ts} +0 -0
- /package/dist/{excel/src/excel-wrapper.d.ts → excel-wrapper.d.ts} +0 -0
- /package/dist/{excel/src/index.d.ts → index.d.ts} +0 -0
- /package/dist/{excel/src/types.d.ts → types.d.ts} +0 -0
- /package/dist/{excel/src/utils → utils}/excel-utils.d.ts +0 -0
- /package/dist/{excel/src/utils → utils}/zip-cache.d.ts +0 -0
- /package/dist/{excel/src/xml → xml}/excel-xml-content-type.d.ts +0 -0
- /package/dist/{excel/src/xml → xml}/excel-xml-drawing.d.ts +0 -0
- /package/dist/{excel/src/xml → xml}/excel-xml-relationship.d.ts +0 -0
- /package/dist/{excel/src/xml → xml}/excel-xml-shared-string.d.ts +0 -0
- /package/dist/{excel/src/xml → xml}/excel-xml-style.d.ts +0 -0
- /package/dist/{excel/src/xml → xml}/excel-xml-unknown.d.ts +0 -0
- /package/dist/{excel/src/xml → xml}/excel-xml-workbook.d.ts +0 -0
- /package/dist/{excel/src/xml → xml}/excel-xml-worksheet.d.ts +0 -0
|
@@ -1,166 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from "vitest";
|
|
2
|
-
import { ExcelWorkbook } from "../src/excel-workbook";
|
|
3
|
-
import type { Bytes } from "@simplysm/core-common";
|
|
4
|
-
|
|
5
|
-
describe("ExcelWorkbook", () => {
|
|
6
|
-
describe("빈 워크북 생성", () => {
|
|
7
|
-
it("새 워크북을 생성할 수 있다", () => {
|
|
8
|
-
const wb = new ExcelWorkbook();
|
|
9
|
-
expect(wb).toBeDefined();
|
|
10
|
-
expect(wb.zipCache).toBeDefined();
|
|
11
|
-
});
|
|
12
|
-
|
|
13
|
-
it("워크시트를 생성할 수 있다", async () => {
|
|
14
|
-
const wb = new ExcelWorkbook();
|
|
15
|
-
const ws = await wb.createWorksheet("TestSheet");
|
|
16
|
-
|
|
17
|
-
expect(ws).toBeDefined();
|
|
18
|
-
const name = await ws.getName();
|
|
19
|
-
expect(name).toBe("TestSheet");
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
it("여러 워크시트를 생성할 수 있다", async () => {
|
|
23
|
-
const wb = new ExcelWorkbook();
|
|
24
|
-
await wb.createWorksheet("Sheet1");
|
|
25
|
-
await wb.createWorksheet("Sheet2");
|
|
26
|
-
await wb.createWorksheet("Sheet3");
|
|
27
|
-
|
|
28
|
-
const names = await wb.getWorksheetNames();
|
|
29
|
-
expect(names).toEqual(["Sheet1", "Sheet2", "Sheet3"]);
|
|
30
|
-
});
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
describe("워크시트 접근", () => {
|
|
34
|
-
it("인덱스로 워크시트를 가져올 수 있다", async () => {
|
|
35
|
-
const wb = new ExcelWorkbook();
|
|
36
|
-
await wb.createWorksheet("First");
|
|
37
|
-
await wb.createWorksheet("Second");
|
|
38
|
-
|
|
39
|
-
const ws = await wb.getWorksheet(1);
|
|
40
|
-
const name = await ws.getName();
|
|
41
|
-
expect(name).toBe("Second");
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
it("이름으로 워크시트를 가져올 수 있다", async () => {
|
|
45
|
-
const wb = new ExcelWorkbook();
|
|
46
|
-
await wb.createWorksheet("MySheet");
|
|
47
|
-
|
|
48
|
-
const ws = await wb.getWorksheet("MySheet");
|
|
49
|
-
const name = await ws.getName();
|
|
50
|
-
expect(name).toBe("MySheet");
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
it("존재하지 않는 시트 접근 시 에러", async () => {
|
|
54
|
-
const wb = new ExcelWorkbook();
|
|
55
|
-
await wb.createWorksheet("Sheet1");
|
|
56
|
-
|
|
57
|
-
await expect(wb.getWorksheet("NotExist")).rejects.toThrow();
|
|
58
|
-
await expect(wb.getWorksheet(10)).rejects.toThrow();
|
|
59
|
-
});
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
describe("Bytes/Blob 출력", () => {
|
|
63
|
-
it("Bytes로 출력할 수 있다", async () => {
|
|
64
|
-
const wb = new ExcelWorkbook();
|
|
65
|
-
const ws = await wb.createWorksheet("Test");
|
|
66
|
-
await ws.cell(0, 0).setVal("Hello");
|
|
67
|
-
|
|
68
|
-
const bytes: Bytes = await wb.getBytes();
|
|
69
|
-
expect(bytes).toBeInstanceOf(Uint8Array);
|
|
70
|
-
expect(bytes.length).toBeGreaterThan(0);
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
it("Blob으로 출력할 수 있다", async () => {
|
|
74
|
-
const wb = new ExcelWorkbook();
|
|
75
|
-
const ws = await wb.createWorksheet("Test");
|
|
76
|
-
await ws.cell(0, 0).setVal("Hello");
|
|
77
|
-
|
|
78
|
-
const blob = await wb.getBlob();
|
|
79
|
-
expect(blob).toBeInstanceOf(Blob);
|
|
80
|
-
expect(blob.type).toBe("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
|
|
81
|
-
expect(blob.size).toBeGreaterThan(0);
|
|
82
|
-
});
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
describe("워크북 읽기/쓰기 라운드트립", () => {
|
|
86
|
-
it("Blob으로 워크북을 생성할 수 있다", async () => {
|
|
87
|
-
// 먼저 Bytes로 워크북 생성
|
|
88
|
-
const wb1 = new ExcelWorkbook();
|
|
89
|
-
const ws1 = await wb1.createWorksheet("Test");
|
|
90
|
-
await ws1.cell(0, 0).setVal("BlobTest");
|
|
91
|
-
const bytes = await wb1.getBytes();
|
|
92
|
-
await wb1.close();
|
|
93
|
-
|
|
94
|
-
// Blob으로 변환
|
|
95
|
-
const blob = new Blob([bytes], {
|
|
96
|
-
type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
// Blob으로 워크북 읽기
|
|
100
|
-
const wb2 = new ExcelWorkbook(blob);
|
|
101
|
-
const ws2 = await wb2.getWorksheet(0);
|
|
102
|
-
const val = await ws2.cell(0, 0).getVal();
|
|
103
|
-
|
|
104
|
-
expect(val).toBe("BlobTest");
|
|
105
|
-
await wb2.close();
|
|
106
|
-
});
|
|
107
|
-
|
|
108
|
-
it("생성한 워크북을 Bytes로 저장 후 다시 읽을 수 있다", async () => {
|
|
109
|
-
// 생성
|
|
110
|
-
const wb1 = new ExcelWorkbook();
|
|
111
|
-
const ws1 = await wb1.createWorksheet("RoundTrip");
|
|
112
|
-
await ws1.cell(0, 0).setVal("TestValue");
|
|
113
|
-
await ws1.cell(0, 1).setVal(12345);
|
|
114
|
-
|
|
115
|
-
// 저장
|
|
116
|
-
const bytes = await wb1.getBytes();
|
|
117
|
-
await wb1.close();
|
|
118
|
-
|
|
119
|
-
// 다시 읽기
|
|
120
|
-
const wb2 = new ExcelWorkbook(bytes);
|
|
121
|
-
const names = await wb2.getWorksheetNames();
|
|
122
|
-
expect(names).toContain("RoundTrip");
|
|
123
|
-
|
|
124
|
-
const ws2 = await wb2.getWorksheet("RoundTrip");
|
|
125
|
-
const val1 = await ws2.cell(0, 0).getVal();
|
|
126
|
-
const val2 = await ws2.cell(0, 1).getVal();
|
|
127
|
-
|
|
128
|
-
expect(val1).toBe("TestValue");
|
|
129
|
-
expect(val2).toBe(12345);
|
|
130
|
-
|
|
131
|
-
await wb2.close();
|
|
132
|
-
});
|
|
133
|
-
});
|
|
134
|
-
|
|
135
|
-
describe("리소스 해제 후 에러", () => {
|
|
136
|
-
it("close() 후 getWorksheetNames() 호출 시 에러", async () => {
|
|
137
|
-
const wb = new ExcelWorkbook();
|
|
138
|
-
await wb.createWorksheet("Test");
|
|
139
|
-
await wb.close();
|
|
140
|
-
|
|
141
|
-
await expect(wb.getWorksheetNames()).rejects.toThrow();
|
|
142
|
-
});
|
|
143
|
-
|
|
144
|
-
it("close() 후 createWorksheet() 호출 시 에러", async () => {
|
|
145
|
-
const wb = new ExcelWorkbook();
|
|
146
|
-
await wb.close();
|
|
147
|
-
|
|
148
|
-
await expect(wb.createWorksheet("New")).rejects.toThrow();
|
|
149
|
-
});
|
|
150
|
-
|
|
151
|
-
it("close() 후 getWorksheet() 호출 시 에러", async () => {
|
|
152
|
-
const wb = new ExcelWorkbook();
|
|
153
|
-
await wb.createWorksheet("Test");
|
|
154
|
-
await wb.close();
|
|
155
|
-
|
|
156
|
-
await expect(wb.getWorksheet(0)).rejects.toThrow();
|
|
157
|
-
});
|
|
158
|
-
|
|
159
|
-
it("close() 후 getBytes() 호출 시 에러", async () => {
|
|
160
|
-
const wb = new ExcelWorkbook();
|
|
161
|
-
await wb.close();
|
|
162
|
-
|
|
163
|
-
await expect(wb.getBytes()).rejects.toThrow();
|
|
164
|
-
});
|
|
165
|
-
});
|
|
166
|
-
});
|
|
@@ -1,389 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from "vitest";
|
|
2
|
-
import { ExcelWorkbook } from "../src/excel-workbook";
|
|
3
|
-
|
|
4
|
-
describe("ExcelWorksheet", () => {
|
|
5
|
-
describe("시트 이름", () => {
|
|
6
|
-
it("시트 이름을 가져올 수 있다", async () => {
|
|
7
|
-
const wb = new ExcelWorkbook();
|
|
8
|
-
const ws = await wb.createWorksheet("MySheet");
|
|
9
|
-
|
|
10
|
-
const name = await ws.getName();
|
|
11
|
-
expect(name).toBe("MySheet");
|
|
12
|
-
});
|
|
13
|
-
|
|
14
|
-
it("시트 이름을 변경할 수 있다", async () => {
|
|
15
|
-
const wb = new ExcelWorkbook();
|
|
16
|
-
const ws = await wb.createWorksheet("OldName");
|
|
17
|
-
|
|
18
|
-
await ws.setName("NewName");
|
|
19
|
-
const name = await ws.getName();
|
|
20
|
-
expect(name).toBe("NewName");
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
it("변경한 시트 이름이 라운드트립 후에도 유지된다", async () => {
|
|
24
|
-
const wb = new ExcelWorkbook();
|
|
25
|
-
const ws = await wb.createWorksheet("OldName");
|
|
26
|
-
await ws.setName("NewName");
|
|
27
|
-
|
|
28
|
-
const bytes = await wb.getBytes();
|
|
29
|
-
|
|
30
|
-
const wb2 = new ExcelWorkbook(bytes);
|
|
31
|
-
const names = await wb2.getWorksheetNames();
|
|
32
|
-
expect(names).toContain("NewName");
|
|
33
|
-
expect(names).not.toContain("OldName");
|
|
34
|
-
|
|
35
|
-
const ws2 = await wb2.getWorksheet("NewName");
|
|
36
|
-
const name = await ws2.getName();
|
|
37
|
-
expect(name).toBe("NewName");
|
|
38
|
-
});
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
describe("행/열 복사", () => {
|
|
42
|
-
it("행을 복사할 수 있다", async () => {
|
|
43
|
-
const wb = new ExcelWorkbook();
|
|
44
|
-
const ws = await wb.createWorksheet("Test");
|
|
45
|
-
|
|
46
|
-
// 원본 행 설정
|
|
47
|
-
await ws.cell(0, 0).setVal("A");
|
|
48
|
-
await ws.cell(0, 1).setVal("B");
|
|
49
|
-
await ws.cell(0, 2).setVal("C");
|
|
50
|
-
|
|
51
|
-
// 행 복사
|
|
52
|
-
await ws.copyRow(0, 2);
|
|
53
|
-
|
|
54
|
-
expect(await ws.cell(2, 0).getVal()).toBe("A");
|
|
55
|
-
expect(await ws.cell(2, 1).getVal()).toBe("B");
|
|
56
|
-
expect(await ws.cell(2, 2).getVal()).toBe("C");
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
it("셀을 복사할 수 있다", async () => {
|
|
60
|
-
const wb = new ExcelWorkbook();
|
|
61
|
-
const ws = await wb.createWorksheet("Test");
|
|
62
|
-
|
|
63
|
-
await ws.cell(0, 0).setVal("Original");
|
|
64
|
-
await ws.copyCell({ r: 0, c: 0 }, { r: 1, c: 1 });
|
|
65
|
-
|
|
66
|
-
expect(await ws.cell(1, 1).getVal()).toBe("Original");
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
it("행 스타일만 복사할 수 있다", async () => {
|
|
70
|
-
const wb = new ExcelWorkbook();
|
|
71
|
-
const ws = await wb.createWorksheet("Test");
|
|
72
|
-
|
|
73
|
-
// 스타일 설정
|
|
74
|
-
await ws.cell(0, 0).setVal("Styled");
|
|
75
|
-
await ws.cell(0, 0).setStyle({ background: "00FF0000" });
|
|
76
|
-
await ws.cell(0, 1).setVal("Also Styled");
|
|
77
|
-
await ws.cell(0, 1).setStyle({ background: "0000FF00" });
|
|
78
|
-
|
|
79
|
-
// 스타일만 복사
|
|
80
|
-
await ws.copyRowStyle(0, 2);
|
|
81
|
-
|
|
82
|
-
// 값은 복사되지 않음
|
|
83
|
-
expect(await ws.cell(2, 0).getVal()).toBeUndefined();
|
|
84
|
-
expect(await ws.cell(2, 1).getVal()).toBeUndefined();
|
|
85
|
-
|
|
86
|
-
// 스타일은 복사됨
|
|
87
|
-
const styleId0 = await ws.cell(0, 0).getStyleId();
|
|
88
|
-
const styleId2 = await ws.cell(2, 0).getStyleId();
|
|
89
|
-
expect(styleId2).toBe(styleId0);
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
it("행 삽입 복사를 할 수 있다 (srcR < targetR)", async () => {
|
|
93
|
-
const wb = new ExcelWorkbook();
|
|
94
|
-
const ws = await wb.createWorksheet("Test");
|
|
95
|
-
|
|
96
|
-
await ws.cell(0, 0).setVal("Row0");
|
|
97
|
-
await ws.cell(1, 0).setVal("Row1");
|
|
98
|
-
await ws.cell(2, 0).setVal("Row2");
|
|
99
|
-
|
|
100
|
-
// 0행을 1행 위치에 삽입 복사 (기존 행들이 밀림)
|
|
101
|
-
await ws.insertCopyRow(0, 1);
|
|
102
|
-
|
|
103
|
-
expect(await ws.cell(0, 0).getVal()).toBe("Row0");
|
|
104
|
-
expect(await ws.cell(1, 0).getVal()).toBe("Row0"); // 복사됨
|
|
105
|
-
expect(await ws.cell(2, 0).getVal()).toBe("Row1"); // 밀림
|
|
106
|
-
expect(await ws.cell(3, 0).getVal()).toBe("Row2"); // 밀림
|
|
107
|
-
});
|
|
108
|
-
|
|
109
|
-
it("행 삽입 복사를 할 수 있다 (srcR > targetR)", async () => {
|
|
110
|
-
const wb = new ExcelWorkbook();
|
|
111
|
-
const ws = await wb.createWorksheet("Test");
|
|
112
|
-
|
|
113
|
-
await ws.cell(0, 0).setVal("Row0");
|
|
114
|
-
await ws.cell(1, 0).setVal("Row1");
|
|
115
|
-
await ws.cell(2, 0).setVal("Row2");
|
|
116
|
-
await ws.cell(3, 0).setVal("Row3");
|
|
117
|
-
|
|
118
|
-
// 2행을 1행 위치에 삽입 복사 (기존 행들이 밀림)
|
|
119
|
-
await ws.insertCopyRow(2, 1);
|
|
120
|
-
|
|
121
|
-
expect(await ws.cell(0, 0).getVal()).toBe("Row0");
|
|
122
|
-
expect(await ws.cell(1, 0).getVal()).toBe("Row2"); // 원래 Row2 복사됨
|
|
123
|
-
expect(await ws.cell(2, 0).getVal()).toBe("Row1"); // 밀림
|
|
124
|
-
expect(await ws.cell(3, 0).getVal()).toBe("Row2"); // 밀림 (원래 Row2)
|
|
125
|
-
expect(await ws.cell(4, 0).getVal()).toBe("Row3"); // 밀림
|
|
126
|
-
});
|
|
127
|
-
|
|
128
|
-
it("행 삽입 복사를 할 수 있다 (srcR == targetR)", async () => {
|
|
129
|
-
const wb = new ExcelWorkbook();
|
|
130
|
-
const ws = await wb.createWorksheet("Test");
|
|
131
|
-
|
|
132
|
-
await ws.cell(0, 0).setVal("Row0");
|
|
133
|
-
await ws.cell(1, 0).setVal("Row1");
|
|
134
|
-
await ws.cell(2, 0).setVal("Row2");
|
|
135
|
-
|
|
136
|
-
// 1행을 1행 위치에 삽입 복사 (자기 자신을 복사)
|
|
137
|
-
await ws.insertCopyRow(1, 1);
|
|
138
|
-
|
|
139
|
-
expect(await ws.cell(0, 0).getVal()).toBe("Row0");
|
|
140
|
-
expect(await ws.cell(1, 0).getVal()).toBe("Row1"); // 원래 Row1 복사됨
|
|
141
|
-
expect(await ws.cell(2, 0).getVal()).toBe("Row1"); // 밀림 (원래 Row1)
|
|
142
|
-
expect(await ws.cell(3, 0).getVal()).toBe("Row2"); // 밀림
|
|
143
|
-
});
|
|
144
|
-
});
|
|
145
|
-
|
|
146
|
-
describe("범위 및 셀 접근", () => {
|
|
147
|
-
it("데이터 범위를 가져올 수 있다", async () => {
|
|
148
|
-
const wb = new ExcelWorkbook();
|
|
149
|
-
const ws = await wb.createWorksheet("Test");
|
|
150
|
-
|
|
151
|
-
await ws.cell(0, 0).setVal("A");
|
|
152
|
-
await ws.cell(2, 3).setVal("D");
|
|
153
|
-
|
|
154
|
-
const range = await ws.getRange();
|
|
155
|
-
expect(range.s.r).toBe(0);
|
|
156
|
-
expect(range.s.c).toBe(0);
|
|
157
|
-
expect(range.e.r).toBe(2);
|
|
158
|
-
expect(range.e.c).toBe(3);
|
|
159
|
-
});
|
|
160
|
-
|
|
161
|
-
it("모든 셀을 가져올 수 있다", async () => {
|
|
162
|
-
const wb = new ExcelWorkbook();
|
|
163
|
-
const ws = await wb.createWorksheet("Test");
|
|
164
|
-
|
|
165
|
-
await ws.cell(0, 0).setVal("A");
|
|
166
|
-
await ws.cell(0, 1).setVal("B");
|
|
167
|
-
await ws.cell(1, 0).setVal("C");
|
|
168
|
-
await ws.cell(1, 1).setVal("D");
|
|
169
|
-
|
|
170
|
-
const cells = await ws.getCells();
|
|
171
|
-
expect(cells.length).toBe(2);
|
|
172
|
-
expect(cells[0].length).toBeGreaterThanOrEqual(2);
|
|
173
|
-
});
|
|
174
|
-
});
|
|
175
|
-
|
|
176
|
-
describe("데이터 테이블", () => {
|
|
177
|
-
it("데이터 테이블을 가져올 수 있다", async () => {
|
|
178
|
-
const wb = new ExcelWorkbook();
|
|
179
|
-
const ws = await wb.createWorksheet("Test");
|
|
180
|
-
|
|
181
|
-
// 헤더
|
|
182
|
-
await ws.cell(0, 0).setVal("Name");
|
|
183
|
-
await ws.cell(0, 1).setVal("Age");
|
|
184
|
-
// 데이터
|
|
185
|
-
await ws.cell(1, 0).setVal("Alice");
|
|
186
|
-
await ws.cell(1, 1).setVal(30);
|
|
187
|
-
await ws.cell(2, 0).setVal("Bob");
|
|
188
|
-
await ws.cell(2, 1).setVal(25);
|
|
189
|
-
|
|
190
|
-
const data = await ws.getDataTable();
|
|
191
|
-
expect(data.length).toBe(2);
|
|
192
|
-
expect(data[0]["Name"]).toBe("Alice");
|
|
193
|
-
expect(data[0]["Age"]).toBe(30);
|
|
194
|
-
expect(data[1]["Name"]).toBe("Bob");
|
|
195
|
-
expect(data[1]["Age"]).toBe(25);
|
|
196
|
-
});
|
|
197
|
-
|
|
198
|
-
it("특정 헤더만 필터링하여 가져올 수 있다", async () => {
|
|
199
|
-
const wb = new ExcelWorkbook();
|
|
200
|
-
const ws = await wb.createWorksheet("Test");
|
|
201
|
-
|
|
202
|
-
await ws.cell(0, 0).setVal("Name");
|
|
203
|
-
await ws.cell(0, 1).setVal("Age");
|
|
204
|
-
await ws.cell(0, 2).setVal("Ignore");
|
|
205
|
-
await ws.cell(1, 0).setVal("Alice");
|
|
206
|
-
await ws.cell(1, 1).setVal(30);
|
|
207
|
-
await ws.cell(1, 2).setVal("X");
|
|
208
|
-
|
|
209
|
-
const data = await ws.getDataTable({
|
|
210
|
-
usableHeaderNameFn: (name) => name !== "Ignore",
|
|
211
|
-
});
|
|
212
|
-
|
|
213
|
-
expect(data[0]["Name"]).toBe("Alice");
|
|
214
|
-
expect(data[0]["Age"]).toBe(30);
|
|
215
|
-
expect(data[0]["Ignore"]).toBeUndefined();
|
|
216
|
-
});
|
|
217
|
-
|
|
218
|
-
it("데이터 매트릭스를 설정할 수 있다", async () => {
|
|
219
|
-
const wb = new ExcelWorkbook();
|
|
220
|
-
const ws = await wb.createWorksheet("Test");
|
|
221
|
-
|
|
222
|
-
const matrix = [
|
|
223
|
-
["A", "B", "C"],
|
|
224
|
-
[1, 2, 3],
|
|
225
|
-
[4, 5, 6],
|
|
226
|
-
];
|
|
227
|
-
|
|
228
|
-
await ws.setDataMatrix(matrix);
|
|
229
|
-
|
|
230
|
-
expect(await ws.cell(0, 0).getVal()).toBe("A");
|
|
231
|
-
expect(await ws.cell(0, 2).getVal()).toBe("C");
|
|
232
|
-
expect(await ws.cell(2, 2).getVal()).toBe(6);
|
|
233
|
-
});
|
|
234
|
-
|
|
235
|
-
it("레코드 배열을 설정할 수 있다", async () => {
|
|
236
|
-
const wb = new ExcelWorkbook();
|
|
237
|
-
const ws = await wb.createWorksheet("Test");
|
|
238
|
-
|
|
239
|
-
const records = [
|
|
240
|
-
{ Name: "Alice", Age: 30 },
|
|
241
|
-
{ Name: "Bob", Age: 25 },
|
|
242
|
-
];
|
|
243
|
-
|
|
244
|
-
await ws.setRecords(records);
|
|
245
|
-
|
|
246
|
-
// 헤더 확인
|
|
247
|
-
const headers = [await ws.cell(0, 0).getVal(), await ws.cell(0, 1).getVal()];
|
|
248
|
-
expect(headers).toContain("Name");
|
|
249
|
-
expect(headers).toContain("Age");
|
|
250
|
-
|
|
251
|
-
// 데이터 확인 (순서는 다를 수 있음)
|
|
252
|
-
const data = await ws.getDataTable();
|
|
253
|
-
expect(data.length).toBe(2);
|
|
254
|
-
});
|
|
255
|
-
});
|
|
256
|
-
|
|
257
|
-
describe("뷰 설정", () => {
|
|
258
|
-
it("줌 레벨을 설정할 수 있다", async () => {
|
|
259
|
-
const wb = new ExcelWorkbook();
|
|
260
|
-
const ws = await wb.createWorksheet("Test");
|
|
261
|
-
|
|
262
|
-
await ws.setZoom(85);
|
|
263
|
-
// 에러 없이 설정되면 성공
|
|
264
|
-
});
|
|
265
|
-
|
|
266
|
-
it("틀 고정을 설정할 수 있다", async () => {
|
|
267
|
-
const wb = new ExcelWorkbook();
|
|
268
|
-
const ws = await wb.createWorksheet("Test");
|
|
269
|
-
|
|
270
|
-
await ws.setFix({ r: 1 }); // 1행 고정
|
|
271
|
-
await ws.setFix({ c: 2 }); // 2열 고정
|
|
272
|
-
await ws.setFix({ r: 1, c: 1 }); // 1행 1열 고정
|
|
273
|
-
// 에러 없이 설정되면 성공
|
|
274
|
-
});
|
|
275
|
-
});
|
|
276
|
-
|
|
277
|
-
describe("열 너비", () => {
|
|
278
|
-
it("열 너비를 설정할 수 있다", async () => {
|
|
279
|
-
const wb = new ExcelWorkbook();
|
|
280
|
-
const ws = await wb.createWorksheet("Test");
|
|
281
|
-
|
|
282
|
-
await ws.col(0).setWidth(20);
|
|
283
|
-
// 에러 없이 설정되면 성공
|
|
284
|
-
});
|
|
285
|
-
|
|
286
|
-
it("설정한 열 너비가 라운드트립 후에도 유지된다", async () => {
|
|
287
|
-
const wb = new ExcelWorkbook();
|
|
288
|
-
const ws = await wb.createWorksheet("Test");
|
|
289
|
-
|
|
290
|
-
await ws.cell(0, 0).setVal("A1");
|
|
291
|
-
await ws.col(0).setWidth(25);
|
|
292
|
-
await ws.col(2).setWidth(30);
|
|
293
|
-
|
|
294
|
-
const bytes = await wb.getBytes();
|
|
295
|
-
|
|
296
|
-
const wb2 = new ExcelWorkbook(bytes);
|
|
297
|
-
await wb2.getWorksheet("Test");
|
|
298
|
-
|
|
299
|
-
// XML 구조에서 cols 데이터 확인
|
|
300
|
-
const wsData = await (wb2 as any).zipCache.get("xl/worksheets/sheet1.xml");
|
|
301
|
-
const cols = wsData.data.worksheet.cols?.[0]?.col ?? [];
|
|
302
|
-
|
|
303
|
-
// 열 A (인덱스 0, 1-based=1)의 너비 확인
|
|
304
|
-
const colA = cols.find((c: any) => c.$.min === "1" && c.$.max === "1");
|
|
305
|
-
expect(colA).toBeDefined();
|
|
306
|
-
expect(colA.$.width).toBe("25");
|
|
307
|
-
|
|
308
|
-
// 열 C (인덱스 2, 1-based=3)의 너비 확인
|
|
309
|
-
const colC = cols.find((c: any) => c.$.min === "3" && c.$.max === "3");
|
|
310
|
-
expect(colC).toBeDefined();
|
|
311
|
-
expect(colC.$.width).toBe("30");
|
|
312
|
-
});
|
|
313
|
-
});
|
|
314
|
-
|
|
315
|
-
describe("열 접근", () => {
|
|
316
|
-
it("열의 모든 셀을 가져올 수 있다", async () => {
|
|
317
|
-
const wb = new ExcelWorkbook();
|
|
318
|
-
const ws = await wb.createWorksheet("Test");
|
|
319
|
-
|
|
320
|
-
await ws.cell(0, 0).setVal("A1");
|
|
321
|
-
await ws.cell(1, 0).setVal("A2");
|
|
322
|
-
await ws.cell(2, 0).setVal("A3");
|
|
323
|
-
|
|
324
|
-
const cells = await ws.col(0).getCells();
|
|
325
|
-
expect(cells.length).toBe(3);
|
|
326
|
-
expect(await cells[0].getVal()).toBe("A1");
|
|
327
|
-
expect(await cells[1].getVal()).toBe("A2");
|
|
328
|
-
expect(await cells[2].getVal()).toBe("A3");
|
|
329
|
-
});
|
|
330
|
-
});
|
|
331
|
-
|
|
332
|
-
describe("데이터 테이블 엣지 케이스", () => {
|
|
333
|
-
it("빈 시트에서 getDataTable 호출 시 빈 배열 반환", async () => {
|
|
334
|
-
const wb = new ExcelWorkbook();
|
|
335
|
-
const ws = await wb.createWorksheet("Empty");
|
|
336
|
-
const data = await ws.getDataTable();
|
|
337
|
-
expect(data).toEqual([]);
|
|
338
|
-
});
|
|
339
|
-
|
|
340
|
-
it("헤더만 있고 데이터가 없는 경우 빈 배열 반환", async () => {
|
|
341
|
-
const wb = new ExcelWorkbook();
|
|
342
|
-
const ws = await wb.createWorksheet("Test");
|
|
343
|
-
await ws.cell(0, 0).setVal("Header1");
|
|
344
|
-
await ws.cell(0, 1).setVal("Header2");
|
|
345
|
-
const data = await ws.getDataTable();
|
|
346
|
-
expect(data).toEqual([]);
|
|
347
|
-
});
|
|
348
|
-
});
|
|
349
|
-
|
|
350
|
-
describe("데이터 테이블 옵션", () => {
|
|
351
|
-
it("headerRowIndex로 헤더 행을 지정할 수 있다", async () => {
|
|
352
|
-
const wb = new ExcelWorkbook();
|
|
353
|
-
const ws = await wb.createWorksheet("Test");
|
|
354
|
-
|
|
355
|
-
// 0행은 제목
|
|
356
|
-
await ws.cell(0, 0).setVal("Title");
|
|
357
|
-
// 1행이 헤더
|
|
358
|
-
await ws.cell(1, 0).setVal("Name");
|
|
359
|
-
await ws.cell(1, 1).setVal("Age");
|
|
360
|
-
// 2행부터 데이터
|
|
361
|
-
await ws.cell(2, 0).setVal("Alice");
|
|
362
|
-
await ws.cell(2, 1).setVal(30);
|
|
363
|
-
|
|
364
|
-
const data = await ws.getDataTable({ headerRowIndex: 1 });
|
|
365
|
-
expect(data.length).toBe(1);
|
|
366
|
-
expect(data[0]["Name"]).toBe("Alice");
|
|
367
|
-
expect(data[0]["Age"]).toBe(30);
|
|
368
|
-
});
|
|
369
|
-
|
|
370
|
-
it("checkEndColIndex로 데이터 끝을 감지할 수 있다", async () => {
|
|
371
|
-
const wb = new ExcelWorkbook();
|
|
372
|
-
const ws = await wb.createWorksheet("Test");
|
|
373
|
-
|
|
374
|
-
await ws.cell(0, 0).setVal("Name");
|
|
375
|
-
await ws.cell(0, 1).setVal("Age");
|
|
376
|
-
await ws.cell(1, 0).setVal("Alice");
|
|
377
|
-
await ws.cell(1, 1).setVal(30);
|
|
378
|
-
await ws.cell(2, 0).setVal("Bob");
|
|
379
|
-
await ws.cell(2, 1).setVal(25);
|
|
380
|
-
// 3행은 Name 열이 비어있음 → 데이터 끝
|
|
381
|
-
await ws.cell(3, 1).setVal(999);
|
|
382
|
-
|
|
383
|
-
const data = await ws.getDataTable({ checkEndColIndex: 0 });
|
|
384
|
-
expect(data.length).toBe(2);
|
|
385
|
-
expect(data[0]["Name"]).toBe("Alice");
|
|
386
|
-
expect(data[1]["Name"]).toBe("Bob");
|
|
387
|
-
});
|
|
388
|
-
});
|
|
389
|
-
});
|