@simplysm/sd-claude 14.0.89 โ†’ 14.0.91

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 (79) hide show
  1. package/claude/references/sd-simplysm14/README.md +16 -17
  2. package/claude/references/sd-simplysm14/apis/angular/README.md +52 -30
  3. package/claude/references/sd-simplysm14/apis/angular/controls.md +200 -38
  4. package/claude/references/sd-simplysm14/apis/angular/crud.md +41 -53
  5. package/claude/references/sd-simplysm14/apis/angular/directives.md +66 -22
  6. package/claude/references/sd-simplysm14/apis/angular/features.md +127 -40
  7. package/claude/references/sd-simplysm14/apis/angular/infra.md +60 -43
  8. package/claude/references/sd-simplysm14/apis/angular/layout.md +56 -20
  9. package/claude/references/sd-simplysm14/apis/angular/overlay.md +74 -74
  10. package/claude/references/sd-simplysm14/apis/angular/routing-appstructure.md +50 -40
  11. package/claude/references/sd-simplysm14/apis/angular/selection-managers.md +55 -15
  12. package/claude/references/sd-simplysm14/apis/angular/shared-data.md +59 -42
  13. package/claude/references/sd-simplysm14/apis/angular/sheet.md +77 -62
  14. package/claude/references/sd-simplysm14/apis/capacitor-plugin-auto-update/README.md +8 -7
  15. package/claude/references/sd-simplysm14/apis/capacitor-plugin-file-system/README.md +71 -43
  16. package/claude/references/sd-simplysm14/apis/capacitor-plugin-intent/README.md +22 -14
  17. package/claude/references/sd-simplysm14/apis/capacitor-plugin-usb-storage/README.md +19 -19
  18. package/claude/references/sd-simplysm14/apis/core-browser/README.md +17 -17
  19. package/claude/references/sd-simplysm14/apis/core-browser/dom-element.md +28 -28
  20. package/claude/references/sd-simplysm14/apis/core-browser/indexed-db.md +37 -37
  21. package/claude/references/sd-simplysm14/apis/core-common/README.md +87 -219
  22. package/claude/references/sd-simplysm14/apis/core-common/array-ext.md +54 -98
  23. package/claude/references/sd-simplysm14/apis/core-common/async-runtime.md +57 -99
  24. package/claude/references/sd-simplysm14/apis/core-common/datetime.md +60 -103
  25. package/claude/references/sd-simplysm14/apis/core-common/errors.md +42 -47
  26. package/claude/references/sd-simplysm14/apis/core-common/obj.md +42 -88
  27. package/claude/references/sd-simplysm14/apis/core-common/serialization.md +55 -0
  28. package/claude/references/sd-simplysm14/apis/core-node/README.md +6 -7
  29. package/claude/references/sd-simplysm14/apis/core-node/consola.md +17 -12
  30. package/claude/references/sd-simplysm14/apis/core-node/cpx.md +14 -13
  31. package/claude/references/sd-simplysm14/apis/core-node/fs-watcher.md +9 -8
  32. package/claude/references/sd-simplysm14/apis/core-node/fsx.md +14 -13
  33. package/claude/references/sd-simplysm14/apis/core-node/pathx.md +4 -8
  34. package/claude/references/sd-simplysm14/apis/core-node/worker.md +14 -12
  35. package/claude/references/sd-simplysm14/apis/excel/README.md +22 -22
  36. package/claude/references/sd-simplysm14/apis/excel/cell.md +37 -29
  37. package/claude/references/sd-simplysm14/apis/excel/conditional-format.md +29 -15
  38. package/claude/references/sd-simplysm14/apis/excel/style.md +33 -27
  39. package/claude/references/sd-simplysm14/apis/excel/utils.md +29 -19
  40. package/claude/references/sd-simplysm14/apis/excel/workbook-worksheet.md +78 -55
  41. package/claude/references/sd-simplysm14/apis/excel/wrapper.md +42 -45
  42. package/claude/references/sd-simplysm14/apis/orm-common/README.md +6 -8
  43. package/claude/references/sd-simplysm14/apis/orm-common/db-context.md +118 -67
  44. package/claude/references/sd-simplysm14/apis/orm-common/expr.md +83 -86
  45. package/claude/references/sd-simplysm14/apis/orm-common/queryable.md +102 -93
  46. package/claude/references/sd-simplysm14/apis/orm-common/schema.md +138 -81
  47. package/claude/references/sd-simplysm14/apis/orm-common/types.md +49 -44
  48. package/claude/references/sd-simplysm14/apis/orm-node/README.md +42 -42
  49. package/claude/references/sd-simplysm14/apis/orm-node/db-conn.md +44 -33
  50. package/claude/references/sd-simplysm14/apis/sd-cli/README.md +11 -10
  51. package/claude/references/sd-simplysm14/apis/service-client/README.md +56 -52
  52. package/claude/references/sd-simplysm14/apis/service-client/orm.md +33 -28
  53. package/claude/references/sd-simplysm14/apis/service-client/transport.md +23 -21
  54. package/claude/references/sd-simplysm14/apis/service-common/README.md +83 -48
  55. package/claude/references/sd-simplysm14/apis/service-common/app-structure.md +126 -34
  56. package/claude/references/sd-simplysm14/apis/service-common/protocol.md +109 -54
  57. package/claude/references/sd-simplysm14/apis/service-server/README.md +69 -81
  58. package/claude/references/sd-simplysm14/apis/service-server/service-authoring.md +46 -43
  59. package/claude/references/sd-simplysm14/apis/service-server/transport-internals.md +63 -37
  60. package/claude/references/sd-simplysm14/apis/service-server/v1-legacy.md +40 -30
  61. package/claude/references/sd-simplysm14/apis/storage/README.md +17 -17
  62. package/claude/references/sd-simplysm14/manuals/client-app-structure.md +135 -140
  63. package/claude/references/sd-simplysm14/manuals/client-orm.md +1 -1
  64. package/claude/references/sd-simplysm14/manuals/client-service.md +19 -7
  65. package/claude/references/sd-simplysm14/manuals/client-shared-data.md +2 -2
  66. package/claude/references/sd-simplysm14/manuals/client-system-log.md +16 -4
  67. package/claude/references/sd-simplysm14/manuals/data-log.md +0 -1
  68. package/claude/references/sd-simplysm14/manuals/orm.md +16 -0
  69. package/claude/rules/sd-design-rules.md +10 -0
  70. package/claude/skills/sd-demo/SKILL.md +0 -6
  71. package/claude/skills/sd-docs/SKILL.md +60 -0
  72. package/claude/{workflows/sd-docs.rules.md โ†’ skills/sd-docs/references/subagent-prompt.md} +118 -103
  73. package/claude/skills/sd-impl/SKILL.md +7 -4
  74. package/claude/skills/sd-spec/SKILL.md +842 -15
  75. package/claude/skills/sd-spec/references/example-spec.md +26 -36
  76. package/package.json +1 -1
  77. package/claude/references/sd-simplysm14/apis/core-common/json-transfer.md +0 -53
  78. package/claude/skills/sd-spec/references/spec-authoring.md +0 -519
  79. package/claude/workflows/sd-docs.js +0 -84
@@ -1,17 +1,18 @@
1
1
  # @simplysm/core-node โ€” worker
2
2
 
3
- `worker_threads` ๋ฅผ ํƒ€์ž… ์•ˆ์ „ํ•˜๊ฒŒ ์“ฐ๊ธฐ ์œ„ํ•œ ๋ž˜ํผ. ์›Œ์ปค ํŒŒ์ผ์—์„œ `createWorker(methods)` ๋กœ ๋ฉ”์„œ๋“œ ๋ฌถ์Œ์„ export ํ•˜๊ณ , ๋ฉ”์ธ์—์„œ `Worker.create<typeof import("./worker")>(path)` ๋กœ ํ”„๋ก์‹œ๋ฅผ ๋งŒ๋“ค์–ด `await worker.method(...)` ์ฒ˜๋Ÿผ ํ˜ธ์ถœ. ๋ฉ”์‹œ์ง€ ์ง๋ ฌํ™”๋Š” `@simplysm/core-common` ์˜ `transfer`(Date/ํŠน์ˆ˜ํƒ€์ž…ยทtransferList ์ง€์›)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ๊ฐœ๋ฐœ(.ts)ยทํ”„๋กœ๋•์…˜(.js) ์–‘์ชฝ์„ ์ž๋™ ๋ถ„๊ธฐํ•œ๋‹ค.
3
+ `worker_threads` ๋ฅผ ํƒ€์ž… ์•ˆ์ „ํ•˜๊ฒŒ ์“ฐ๊ธฐ ์œ„ํ•œ ๋ž˜ํผ (`packages/core-node/src/worker/*`). ์›Œ์ปค ํŒŒ์ผ์—์„œ `createWorker(methods)` ๋กœ ๋ฉ”์„œ๋“œ ๋ฌถ์Œ์„ ๋งŒ๋“ค์–ด `export default` ํ•˜๊ณ , ๋ฉ”์ธ์—์„œ `Worker.create<typeof import("./worker")>(path)` ๋กœ ํ”„๋ก์‹œ๋ฅผ ๋งŒ๋“ค์–ด `await worker.method(...)` ์ฒ˜๋Ÿผ ํ˜ธ์ถœ. ๋ฉ”์‹œ์ง€ ์ง๋ ฌํ™”๋Š” `@simplysm/core-common` ์˜ `transfer`(Date ๋“ฑ ํŠน์ˆ˜ํƒ€์ž…ยทtransferList ์ง€์›)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ๊ฐœ๋ฐœ(`.ts`)ยทํ”„๋กœ๋•์…˜(`.js`) ์–‘์ชฝ์„ ์ž๋™ ๋ถ„๊ธฐํ•œ๋‹ค.
4
4
 
5
5
  ## createWorker (์›Œ์ปค ์Šค๋ ˆ๋“œ ์ธก)
6
6
 
7
7
  - `createWorker<TMethods, TEvents>(methods): { send; __methods; __events }` โ€” ์›Œ์ปค ์Šค๋ ˆ๋“œ ์ง„์ž… ํŒŒ์ผ์—์„œ ํ˜ธ์ถœํ•˜๊ณ  ๊ทธ ๋ฐ˜ํ™˜์„ `export default`. `parentPort` ๊ฐ€ ์—†์œผ๋ฉด(์›Œ์ปค ์ปจํ…์ŠคํŠธ ์•„๋‹˜) `SdError` throw. ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹ ํ•ด ์‹คํ–‰ ํ›„ ๊ฒฐ๊ณผ/์—๋Ÿฌ๋ฅผ ์‘๋‹ตํ•˜๊ณ , ์›Œ์ปค์˜ `process.stdout.write` ๋ฅผ ๊ฐ€๋กœ์ฑ„ ๋ฉ”์ธ์œผ๋กœ ๋กœ๊ทธ๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.
8
- - `methods: TMethods` (`Record<string, (...args) => unknown>`) โ€” ์›Œ์ปค๊ฐ€ ์ œ๊ณตํ•  ๋ฉ”์„œ๋“œ ๋งต. ๋™๊ธฐ/๋น„๋™๊ธฐ ๋ชจ๋‘ ๊ฐ€๋Šฅ(await ๋จ). ์•Œ ์ˆ˜ ์—†๋Š” ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์‹œ `SdError("์•Œ ์ˆ˜ ์—†๋Š” ๋ฉ”์„œ๋“œ: ...")` ์‘๋‹ต.
9
- - ์ œ๋„ค๋ฆญ `TEvents extends Record<string, unknown>` โ€” ์›Œ์ปค๊ฐ€ ๋ณด๋‚ผ ์ด๋ฒคํŠธ๋ช…โ†’๋ฐ์ดํ„ฐ ํƒ€์ž… ๋งต(๋ฉ”์ธ์˜ `on` ํƒ€์ž… ์ถ”๋ก ์— ์‚ฌ์šฉ).
10
- - ๋ฐ˜ํ™˜ `send<K extends keyof TEvents & string>(event, data?)` โ€” ์›Œ์ปคโ†’๋ฉ”์ธ ์ด๋ฒคํŠธ ์ „์†ก. ์ง„ํ–‰๋ฅ  ๋“ฑ ๋ฉ”์„œ๋“œ ๋ฐ˜ํ™˜๊ณผ ๋ณ„๊ฐœ ํ†ต์ง€์— ์‚ฌ์šฉ.
11
- - ๋ฐ˜ํ™˜ `__methods`/`__events` โ€” ํƒ€์ž… ์ถ”๋ก ์šฉ ๋งˆ์ปค(๋Ÿฐํƒ€์ž„์— `Worker.create` ๊ฐ€ ์ง์ ‘ ์“ฐ์ง„ ์•Š์Œ, ํƒ€์ž…์—์„œ๋งŒ ์ฐธ์กฐ).
8
+ - `methods: TMethods` (`Record<string, (...args: any[]) => unknown>`) โ€” ์›Œ์ปค๊ฐ€ ์ œ๊ณตํ•  ๋ฉ”์„œ๋“œ ๋งต. ๋™๊ธฐ/๋น„๋™๊ธฐ ๋ชจ๋‘ ๊ฐ€๋Šฅ(๋‚ด๋ถ€์—์„œ await). ์•Œ ์ˆ˜ ์—†๋Š” ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์‹œ `SdError("์•Œ ์ˆ˜ ์—†๋Š” ๋ฉ”์„œ๋“œ: ...")` ๋กœ ์‘๋‹ต.
9
+ - ์ œ๋„ค๋ฆญ `TEvents extends Record<string, unknown>`(๊ธฐ๋ณธ `Record<string, never>`) โ€” ์›Œ์ปค๊ฐ€ ๋ณด๋‚ผ ์ด๋ฒคํŠธ๋ช…โ†’๋ฐ์ดํ„ฐ ํƒ€์ž… ๋งต(๋ฉ”์ธ์˜ `on` ํƒ€์ž… ์ถ”๋ก ์— ์‚ฌ์šฉ).
10
+ - ๋ฐ˜ํ™˜ `send<K extends keyof TEvents & string>(event, data?): void` โ€” ์›Œ์ปคโ†’๋ฉ”์ธ ์ด๋ฒคํŠธ ์ „์†ก. ์ง„ํ–‰๋ฅ  ๋“ฑ ๋ฉ”์„œ๋“œ ๋ฐ˜ํ™˜๊ณผ ๋ณ„๊ฐœ์˜ ํ†ต์ง€์— ์‚ฌ์šฉ.
11
+ - ๋ฐ˜ํ™˜ `__methods` / `__events` โ€” ํƒ€์ž… ์ถ”๋ก ์šฉ ๋งˆ์ปค. ๋Ÿฐํƒ€์ž„ ๊ฐ’์ด ์•„๋‹ˆ๋ผ `Worker.create<typeof import(...)>` ์˜ ํƒ€์ž…์—์„œ๋งŒ ์ฐธ์กฐ๋จ.
12
12
 
13
13
  ```ts
14
- // worker.ts
14
+ // worker.ts (์›Œ์ปค ์Šค๋ ˆ๋“œ ์ง„์ž…)
15
+ import { createWorker } from "@simplysm/core-node";
15
16
  interface MyEvents { progress: number; }
16
17
  const methods = {
17
18
  calc: (x: number) => { sender.send("progress", 50); return x * 2; },
@@ -25,10 +26,10 @@ export default sender;
25
26
  - `Worker.create<TModule extends WorkerModule>(filePath, opt?): WorkerProxy<TModule>` โ€” ์›Œ์ปค ์Šค๋ ˆ๋“œ๋ฅผ ๋„์šฐ๊ณ  ๋ฉ”์„œ๋“œ ํ”„๋ก์‹œ๋ฅผ ๋ฐ˜ํ™˜. ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์€ ๋ฉ”์‹œ์ง€๋กœ ์ „๋‹ฌ๋˜์–ด ๊ฒฐ๊ณผ๊ฐ€ Promise ๋กœ resolve/reject ๋œ๋‹ค. ์›Œ์ปค stdout/stderr ๋Š” ๋ฉ”์ธ ํ”„๋กœ์„ธ์Šค๋กœ ํŒŒ์ดํ”„๋˜๋ฉฐ, ์›Œ์ปค ๋น„์ •์ƒ ์ข…๋ฃŒ(exit codeโ‰ 0)ยทerror ์‹œ ๋Œ€๊ธฐ ์ค‘์ธ ๋ชจ๋“  ํ˜ธ์ถœ์ด reject ๋œ๋‹ค. ๋กœ๊ฑฐ ํƒœ๊ทธ `sd-worker`.
26
27
  - `filePath: string` โ€” ์›Œ์ปค ํŒŒ์ผ ๊ฒฝ๋กœ. `file://` URL ๋˜๋Š” ์ ˆ๋Œ€ ๊ฒฝ๋กœ. ํ™•์žฅ์ž๊ฐ€ `.ts` ๋ฉด dev ๋ชจ๋“œ๋กœ `lib/worker-dev-proxy.js`(tsx ๋กœ TS ๋™์  ๋กœ๋“œ)๋ฅผ ํ†ตํ•ด ์‹คํ–‰, `.js` ๋ฉด ์ง์ ‘ ์‹คํ–‰.
27
28
  - `opt?: Omit<WorkerRawOptions, "stdout" | "stderr">` โ€” worker_threads ์˜ต์…˜(stdout/stderr ๋Š” ๋‚ด๋ถ€ ๊ณ ์ •์ด๋ผ ์ œ์™ธ). `env` ๋Š” `process.env` ์™€ ๋ณ‘ํ•ฉ ์ „๋‹ฌ, `argv` ๋Š” dev ๋ชจ๋“œ์—์„œ ์›Œ์ปค ๊ฒฝ๋กœ ๋’ค์— ์ด์–ด ๋ถ™์Œ.
28
- - ๋ฐ˜ํ™˜ `WorkerProxy<TModule>` โ€” ์•„๋ž˜.
29
29
 
30
30
  ```ts
31
- // main.ts
31
+ // main.ts (๋ฉ”์ธ ์ธก)
32
+ import { Worker } from "@simplysm/core-node";
32
33
  const worker = Worker.create<typeof import("./worker")>("./worker.ts");
33
34
  worker.on("progress", (p) => console.log(p));
34
35
  const result = await worker.calc(10); // 20
@@ -39,14 +40,15 @@ await worker.terminate();
39
40
 
40
41
  `Worker.create` ๋ฐ˜ํ™˜ ํ”„๋ก์‹œ. ์›Œ์ปค ๋ฉ”์„œ๋“œ + ์˜ˆ์•ฝ ๋ฉ”์„œ๋“œ 3์ข…์„ ์ œ๊ณต.
41
42
 
42
- - ๋ฉ”์„œ๋“œ ํ”„๋ก์‹œ: `TModule["default"]["__methods"]` ์˜ ๊ฐ ๋ฉ”์„œ๋“œ๊ฐ€ `(...args) => Promise<Awaited<R>>` ๋กœ ๋…ธ์ถœ(`PromisifyMethods`). ๋™๊ธฐ ๋ฉ”์„œ๋“œ๋„ ํ•ญ์ƒ Promise(postMessage ๊ธฐ๋ฐ˜).
43
+ - ๋ฉ”์„œ๋“œ ํ”„๋ก์‹œ: `TModule["default"]["__methods"]` ์˜ ๊ฐ ๋ฉ”์„œ๋“œ๊ฐ€ `(...args) => Promise<Awaited<R>>` ๋กœ ๋…ธ์ถœ(`PromisifyMethods`). ๋™๊ธฐ ๋ฉ”์„œ๋“œ๋„ postMessage ๊ธฐ๋ฐ˜์ด๋ผ ํ•ญ์ƒ Promise.
43
44
  - `on<TEventName>(event, listener): void` โ€” ์›Œ์ปค `send` ์ด๋ฒคํŠธ ๊ตฌ๋…. `event`/`listener` ํƒ€์ž…์€ `TEvents` ์—์„œ ์ถ”๋ก .
44
45
  - `off<TEventName>(event, listener): void` โ€” ์ด๋ฒคํŠธ ๊ตฌ๋… ํ•ด์ œ.
45
46
  - `terminate(): Promise<void>` โ€” ์›Œ์ปค ์ข…๋ฃŒ. ๋Œ€๊ธฐ ์ค‘ ํ˜ธ์ถœ์€ "์›Œ์ปค๊ฐ€ ์ข…๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค" ๋กœ reject ํ›„ ์Šค๋ ˆ๋“œ ์ข…๋ฃŒ.
46
47
 
47
48
  ## ํƒ€์ž…
48
49
 
49
- - `interface WorkerModule { default: { __methods: Record<string, (...args) => unknown>; __events: Record<string, unknown> } }` โ€” `Worker.create` ์˜ ์ œ๋„ค๋ฆญ ์ œ์•ฝ. `typeof import("./worker")` ๊ฐ€ ์ด ๊ตฌ์กฐ๋ฅผ ๋งŒ์กฑ(=`createWorker` ๋ฐ˜ํ™˜์„ default export).
50
- - `type PromisifyMethods<TMethods>` โ€” ๊ฐ ๋ฉ”์„œ๋“œ ๋ฐ˜ํ™˜์„ `Promise<Awaited<R>>` ๋กœ ๋ฐ”๊พธ๋Š” ๋งคํ•‘ ํƒ€์ž….
50
+ - `interface WorkerModule { default: { __methods: Record<string, (...args: any[]) => unknown>; __events: Record<string, unknown> } }` โ€” `Worker.create` ์˜ ์ œ๋„ค๋ฆญ ์ œ์•ฝ. `typeof import("./worker")` ๊ฐ€ ์ด ๊ตฌ์กฐ๋ฅผ ๋งŒ์กฑ(=`createWorker` ๋ฐ˜ํ™˜์„ default export).
51
+ - `type PromisifyMethods<TMethods>` โ€” ๊ฐ ๋ฉ”์„œ๋“œ ๋ฐ˜ํ™˜์„ `Promise<Awaited<R>>` ๋กœ ๋ฐ”๊พธ๋Š” ๋งคํ•‘ ํƒ€์ž…. ํ•จ์ˆ˜๊ฐ€ ์•„๋‹Œ ๋ฉค๋ฒ„๋Š” `never`.
51
52
  - `type WorkerProxy<TModule>` โ€” ์œ„ ํ”„๋ก์‹œ ํƒ€์ž….
52
- - `interface WorkerRequest { id; method; params }` / `type WorkerResponse` โ€” ๋‚ด๋ถ€ ๋ฉ”์‹œ์ง€ ํ”„๋กœํ† ์ฝœ ํƒ€์ž…(`return`/`error`/`event`/`log`). ์ง์ ‘ ๋‹ค๋ฃฐ ์ผ์€ ๊ฑฐ์˜ ์—†์Œ.
53
+ - `interface WorkerRequest { id: string; method: string; params: unknown[] }` โ€” ๋‚ด๋ถ€ ์š”์ฒญ ๋ฉ”์‹œ์ง€.
54
+ - `type WorkerResponse` โ€” ๋‚ด๋ถ€ ์‘๋‹ต ๋ฉ”์‹œ์ง€ union: `return`(๊ฒฐ๊ณผ) / `error`(Error) / `event`(์›Œ์ปค send) / `log`(stdout ์ „๋‹ฌ). ์ง์ ‘ ๋‹ค๋ฃฐ ์ผ์€ ๊ฑฐ์˜ ์—†์Œ.
@@ -1,43 +1,43 @@
1
1
  # @simplysm/excel
2
2
 
3
- OOXML(.xlsx) ์›Œํฌ๋ถ์„ ZIP ๋‹จ์œ„ lazy-load ๋กœ ์ฝ๊ณ  ์“ฐ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ. ๋Œ€์šฉ๋Ÿ‰ ํŒŒ์ผ์—์„œ๋„ ์ ‘๊ทผํ•œ ์…€์— ํ•„์š”ํ•œ XML ํŒŒํŠธ(SharedStrings/Styles ๋“ฑ)๋งŒ ๊ทธ๋•Œ๊ทธ๋•Œ ๋กœ๋“œํ•œ๋‹ค(๋ชจ๋“  ์…€ ๋ฉ”์„œ๋“œ๊ฐ€ `async` ์ธ ์ด์œ ). `ExcelWorkbook` ์ง„์ž…์ ์—์„œ ์‹œํŠธ ์ถ”๊ฐ€ยท์…€ ๊ฐ’/์ˆ˜์‹ยท์Šคํƒ€์ผยท์กฐ๊ฑด๋ถ€ ์„œ์‹ยท์ด๋ฏธ์ง€ยทํ–‰ ๋ณต์‚ฌ๋ฅผ ๋‹ค๋ฃจ๋ฉฐ, Zod ์Šคํ‚ค๋งˆ ๊ธฐ๋ฐ˜ `ExcelWrapper` ๋กœ ๋ ˆ์ฝ”๋“œ ๋ฐฐ์—ด โ†” ์—‘์…€ ๋ณ€ํ™˜๋„ ์ง€์›ํ•œ๋‹ค.
3
+ OOXML(.xlsx) ์›Œํฌ๋ถ์„ ZIP ๋‹จ์œ„ lazy-load ๋กœ ์ฝ๊ณ  ์“ฐ๋Š” ์ˆœ์ˆ˜ TypeScript ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ. ๋Œ€์šฉ๋Ÿ‰ ํŒŒ์ผ์—์„œ๋„ ์ ‘๊ทผํ•œ ์…€์— ํ•„์š”ํ•œ XML ํŒŒํŠธ(SharedStrings/Styles ๋“ฑ)๋งŒ ๊ทธ๋•Œ๊ทธ๋•Œ ๋กœ๋“œํ•˜๋ฏ€๋กœ ๋ชจ๋“  ์…€ ๋ฉ”์„œ๋“œ๊ฐ€ `async` ๋‹ค. `ExcelWorkbook` ์ง„์ž…์ ์—์„œ ์‹œํŠธ ์ถ”๊ฐ€ยท์…€ ๊ฐ’/์ˆ˜์‹ยท์Šคํƒ€์ผยท์กฐ๊ฑด๋ถ€ ์„œ์‹ยท์ด๋ฏธ์ง€ยทํ–‰ ๋ณต์‚ฌยท๋ทฐ ์„ค์ •์„ ๋‹ค๋ฃจ๋ฉฐ, Zod ์Šคํ‚ค๋งˆ ๊ธฐ๋ฐ˜ `ExcelWrapper` ๋กœ ๋ ˆ์ฝ”๋“œ ๋ฐฐ์—ด โ†” ์—‘์…€ ๋ณ€ํ™˜๋„ ์ง€์›ํ•œ๋‹ค. ์™ธ๋ถ€ ์˜์กด์€ `@simplysm/core-common`(DateOnly/DateTime/Time/Bytes), `zod`, `mime` ๋ฟ.
4
4
 
5
5
  ## ์‚ฌ์šฉ ํŠธ๋ฆฌ๊ฑฐ ์ธ๋ฑ์Šค
6
6
 
7
- - **ExcelWorkbook / ExcelWorksheet** โ€” .xlsx ํŒŒ์ผ์„ ์—ด๊ฑฐ๋‚˜ ์ƒˆ๋กœ ๋งŒ๋“ค๊ณ  ์‹œํŠธ๋ฅผ ๋‹ค๋ฃจ๋ฉฐ ๋ฐ”์ดํŠธ/Blob ๋กœ ๋‚ด๋ณด๋‚ผ ๋•Œ. ์‹œํŠธ ๋‹จ์œ„ ๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ”ยท๋งคํŠธ๋ฆญ์Šคยทํ–‰ ๋ณต์‚ฌยท์ด๋ฏธ์ง€ยท๋ทฐ(zoom/freeze/ํƒญ์ƒ‰) ์ฒ˜๋ฆฌ ํฌํ•จ. ์ž์„ธํžˆ: [workbook-worksheet.md](./workbook-worksheet.md)
7
+ - **ExcelWorkbook / ExcelWorksheet** โ€” .xlsx ๋ฅผ ์—ด๊ฑฐ๋‚˜ ์ƒˆ๋กœ ๋งŒ๋“ค๊ณ  ์‹œํŠธ๋ฅผ ์ถ”๊ฐ€/์กฐํšŒํ•˜๋ฉฐ ๋ฐ”์ดํŠธยทBlob ๋กœ ๋‚ด๋ณด๋‚ผ ๋•Œ. ์‹œํŠธ ๋‹จ์œ„ ๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ”ยท๋งคํŠธ๋ฆญ์Šคยท๋ ˆ์ฝ”๋“œ ์“ฐ๊ธฐยทํ–‰ ๋ณต์‚ฌ/์‚ฝ์ž…ยท์ด๋ฏธ์ง€ยท๋ทฐ(zoom/freeze/ํƒญ์ƒ‰) ์ฒ˜๋ฆฌ ํฌํ•จ. ์ž์„ธํžˆ: [workbook-worksheet.md](./workbook-worksheet.md)
8
8
  - **ExcelCell / ExcelRow / ExcelCol** โ€” ๊ฐœ๋ณ„ ์…€์˜ ๊ฐ’ยท์ˆ˜์‹ยท๋ณ‘ํ•ฉยท์Šคํƒ€์ผ์„ ์ฝ๊ณ  ์“ฐ๊ฑฐ๋‚˜ ํ–‰/์—ด ๋‹จ์œ„๋กœ ์…€์„ ์ˆœํšŒํ•˜๊ณ  ์—ด ๋„ˆ๋น„๋ฅผ ์ค„ ๋•Œ. ์ž์„ธํžˆ: [cell.md](./cell.md)
9
9
  - **์…€ ์Šคํƒ€์ผ (ExcelStyleOptions / ExcelFont)** โ€” ์…€(`cell.setStyle`) ๋˜๋Š” ์›Œํฌ๋ถ default(`wb.setDefaultStyle`)์˜ ๋ฐฐ๊ฒฝยทํ…Œ๋‘๋ฆฌยท์ •๋ ฌยท์ˆซ์žํ˜•์‹ยทํฐํŠธ๋ฅผ ์ง€์ •ํ•  ๋•Œ. ์ž์„ธํžˆ: [style.md](./style.md)
10
10
  - **์กฐ๊ฑด๋ถ€ ์„œ์‹ (ExcelConditionalRule / ExcelConditionalRuleStyle)** โ€” ์…€/๋ฒ”์œ„์— ๊ฐ’ ๋น„๊ตยทํ…์ŠคํŠธ ๋งค์นญยท์ˆ˜์‹ ๊ธฐ๋ฐ˜ native CF ๊ทœ์น™์„ ์ถ”๊ฐ€ํ•  ๋•Œ. ์ž์„ธํžˆ: [conditional-format.md](./conditional-format.md)
11
11
  - **ExcelWrapper** โ€” Zod ์Šคํ‚ค๋งˆ๋กœ ํ—ค๋” ๋งคํ•‘ยทํƒ€์ž… ๋ณ€ํ™˜ยท์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์ž๋™ํ™”ํ•ด ๋ ˆ์ฝ”๋“œ ๋ฐฐ์—ด โ†” ์—‘์…€์„ ๋ณ€ํ™˜ํ•  ๋•Œ. ์ž์„ธํžˆ: [wrapper.md](./wrapper.md)
12
12
  - **ExcelUtils** โ€” ์…€ ์ฃผ์†Œ(A1 โ†” ์ขŒํ‘œ) ๋ณ€ํ™˜, ์—‘์…€ ๋‚ ์งœ ์‹œ๋ฆฌ์–ผ โ†” ํƒ€์ž„์Šคํƒฌํ”„ ๋ณ€ํ™˜, ์ˆซ์žํ˜•์‹ ์ฝ”๋“œ/ID/์ด๋ฆ„ ์ƒํ˜ธ ๋ณ€ํ™˜์ด ํ•„์š”ํ•  ๋•Œ. ์ž์„ธํžˆ: [utils.md](./utils.md)
13
- - **๊ฐ’/์ฃผ์†Œ/ํ˜•์‹ ํƒ€์ž…** โ€” ์…€ ๊ฐ’ ์œ ๋‹ˆ์˜จยท์ˆซ์žํ˜•์‹ ํ”„๋ฆฌ์…‹ยท์…€ ํƒ€์ž…ยท์ฃผ์†Œ ์ขŒํ‘œยท์ •๋ ฌ/ํ…Œ๋‘๋ฆฌ enum ์„ ์‹œ๊ทธ๋‹ˆ์ฒ˜์—์„œ ์ฐธ์กฐํ•  ๋•Œ. ์•„๋ž˜ ์ธ๋ผ์ธ ์„น์…˜ ์ฐธ์กฐ.
13
+ - **๊ฐ’/์ฃผ์†Œ/ํ˜•์‹ ํƒ€์ž…** โ€” ์…€ ๊ฐ’ ์œ ๋‹ˆ์˜จยท์ˆซ์žํ˜•์‹ ํ”„๋ฆฌ์…‹ยท์…€ ํƒ€์ž…ยท์ฃผ์†Œ ์ขŒํ‘œยท์ •๋ ฌ/ํ…Œ๋‘๋ฆฌ/๋ฐ‘์ค„ enum ์„ ์‹œ๊ทธ๋‹ˆ์ฒ˜์—์„œ ์ฐธ์กฐํ•  ๋•Œ. ์•„๋ž˜ ์ธ๋ผ์ธ ์„น์…˜ ์ฐธ์กฐ.
14
14
  - **OOXML XML-shape ํƒ€์ž…** โ€” `ExcelXml*` / `Excel*Data` ๋ฅ˜. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋‚ด๋ถ€ XML ํŒŒ์„œ/์ง๋ ฌํ™”๊ธฐ๊ฐ€ ์“ฐ๋Š” OOXML ๋…ธ๋“œ ๊ตฌ์กฐ ํƒ€์ž…. ์•„๋ž˜ ์ธ๋ผ์ธ ์„น์…˜ ์ฐธ์กฐ.
15
15
 
16
16
  ## ๊ฐ’/์ฃผ์†Œ/ํ˜•์‹ ํƒ€์ž…
17
17
 
18
- `./types` ๊ฐ€ ๋…ธ์ถœํ•˜๋Š” ์‚ฌ์šฉ์ž ๋Œ€๋ฉด ํƒ€์ž…. ์…€ ๊ฐ’์„ ๋‹ค๋ฃจ๊ฑฐ๋‚˜ ๋ฉ”์„œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ํ•ด์„ํ•  ๋•Œ ์ฐธ์กฐ.
18
+ `./types` ๊ฐ€ ๋…ธ์ถœํ•˜๋Š” ์‚ฌ์šฉ์ž ๋Œ€๋ฉด ๊ฐ’/ํ˜•์‹ ํƒ€์ž…. ์…€ ๊ฐ’์„ ๋‹ค๋ฃจ๊ฑฐ๋‚˜ ๋ฉ”์„œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ํ•ด์„ํ•  ๋•Œ ์ฐธ์กฐ.
19
19
 
20
- - `ExcelValueType` = `number | string | DateOnly | DateTime | Time | boolean | undefined` โ€” ์…€์ด ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๊ฐ’ ์œ ๋‹ˆ์˜จ. `getValue()` ๋ฐ˜ํ™˜ยท`setValue()` ์ธ์ž ํƒ€์ž…. `undefined` = "๊ฐ’ ์—†์Œ"(์ฝ๊ธฐ ์‹œ ๋นˆ ์…€, ์“ฐ๊ธฐ ์‹œ ์…€ ์‚ญ์ œ)์ด๋ฏ€๋กœ ๊ฒฐ์ธก์„ ๋๊นŒ์ง€ ๋ณด์กด. `DateOnly`/`DateTime`/`Time` ์€ `@simplysm/core-common` ํƒ€์ž….
21
- - `ExcelNumberFormat` = `"number" | "string" | "DateOnly" | "DateTime" | "Time"` โ€” ์ˆซ์žํ˜•์‹ ํ”„๋ฆฌ์…‹ ์ด๋ฆ„. `"number"` = ์ผ๋ฐ˜ ์ˆ˜์น˜, `"string"` = ํ…์ŠคํŠธ ํ˜•์‹, ๋‚˜๋จธ์ง€๋Š” ๋‚ ์งœ/์‹œ๊ฐ„ ์‹œ๋ฆฌ์–ผ ํ•ด์„/ํ‘œ์‹œ์— ์‚ฌ์šฉ. `ExcelStyleOptions.numberFormat` ์™€ `ExcelUtils` ๋ณ€ํ™˜์˜ ๊ณต์šฉ ๋‹จ์œ„.
22
- - `ExcelCellType` = `"s" | "b" | "str" | "n" | "inlineStr" | "e"` โ€” OOXML ์…€ `t` ์†์„ฑ. `"s"` = SharedString ์ธ๋ฑ์Šค ์ฐธ์กฐ, `"b"` = boolean(`"1"`/`"0"`), `"str"` = ์ˆ˜์‹ ๊ฒฐ๊ณผ ๋ฌธ์ž์—ด, `"n"` = ์ˆซ์ž, `"inlineStr"` = ์ธ๋ผ์ธ ์„œ์‹ ํ…์ŠคํŠธ, `"e"` = ์—๋Ÿฌ(์ฝ๊ธฐ ์‹œ throw). ๋ณดํ†ต ์ง์ ‘ ๋‹ค๋ฃจ์ง€ ์•Š๊ณ  `getValue`/`setValue` ๊ฐ€ ์ž๋™ ๋งคํ•‘.
23
- - `ExcelAddressPoint` = `{ r: number; c: number }` โ€” 0 ๊ธฐ๋ฐ˜ ํ–‰(`r`)ยท์—ด(`c`) ์ขŒํ‘œ. ์…€ ๋‹จ์ผ ์œ„์น˜ ๋‹จ์œ„.
24
- - `ExcelAddressRangePoint` = `{ s: ExcelAddressPoint; e: ExcelAddressPoint }` โ€” ๋ฒ”์œ„ ์ขŒํ‘œ. `s` = ์‹œ์ž‘(์ขŒ์ƒ๋‹จ), `e` = ๋(์šฐํ•˜๋‹จ). `getRange()` ๋ฐ˜ํ™˜ ํƒ€์ž….
25
- - `ExcelBorderPosition` = `"left" | "right" | "top" | "bottom"` โ€” ํ…Œ๋‘๋ฆฌ ์ ์šฉ ๋ณ€. `ExcelStyleOptions.border` ๋ฐฐ์—ด ์›์†Œ.
26
- - `ExcelHorizontalAlign` = `"center" | "left" | "right"` โ€” ๊ฐ€๋กœ ์ •๋ ฌ ๊ฐ’.
27
- - `ExcelVerticalAlign` = `"center" | "top" | "bottom"` โ€” ์„ธ๋กœ ์ •๋ ฌ ๊ฐ’.
28
- - `ExcelFontUnderline` = `"single" | "double" | "singleAccounting" | "doubleAccounting"` โ€” ๋ฐ‘์ค„ ์ข…๋ฅ˜. OOXML `<u val="...">` ์˜ val ์— ๊ทธ๋Œ€๋กœ ๋งคํ•‘.
20
+ - `ExcelValueType` = `number | string | DateOnly | DateTime | Time | boolean | undefined` โ€” ์…€์ด ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๊ฐ’ ์œ ๋‹ˆ์˜จ. `getValue()` ๋ฐ˜ํ™˜ยท`setValue()` ์ธ์ž ํƒ€์ž…. `undefined` = "๊ฐ’ ์—†์Œ"(์ฝ๊ธฐ ์‹œ ๋นˆ ์…€, ์“ฐ๊ธฐ ์‹œ ์…€ ์‚ญ์ œ)์ด๋ฏ€๋กœ ๊ฒฐ์ธก์„ ๋๊นŒ์ง€ ๋ณด์กด. `DateOnly`/`DateTime`/`Time` ์€ `@simplysm/core-common` ํƒ€์ž…์ด๋ฉฐ ์…€์— ์‹œ๋ฆฌ์–ผ ์ˆซ์ž + ๋‚ ์งœ numFmt ๋กœ ์ €์žฅ๋œ๋‹ค.
21
+ - `ExcelNumberFormat` = `"number" | "string" | "DateOnly" | "DateTime" | "Time"` โ€” ์ˆซ์žํ˜•์‹ ํ”„๋ฆฌ์…‹ ์ด๋ฆ„. `"number"` = ์ผ๋ฐ˜ ์ˆ˜์น˜, `"string"` = ํ…์ŠคํŠธ ํ˜•์‹, `"DateOnly"`/`"DateTime"`/`"Time"` = ๋‚ ์งœ/์‹œ๊ฐ„ ์‹œ๋ฆฌ์–ผ ํ•ด์„ยทํ‘œ์‹œ. `ExcelStyleOptions.numberFormat` ์™€ `ExcelUtils` ๋ณ€ํ™˜์˜ ๊ณต์šฉ ๋‹จ์œ„. ๋‚ ์งœ ํ˜•์‹ ํ™”๋ฉด์ด๋ฉด ์…€ ๊ฐ’์œผ๋กœ ์ง์ ‘ `DateOnly`/`Time` ์„ ๋„ฃ์–ด ์ž๋™ numFmt ๋ฅผ ๋ฐ›๋Š” ํŽธ์ด ๋‹จ์ˆœ.
22
+ - `ExcelCellType` = `"s" | "b" | "str" | "n" | "inlineStr" | "e"` โ€” OOXML ์…€ `t` ์†์„ฑ. `"s"` = SharedString ์ธ๋ฑ์Šค ์ฐธ์กฐ, `"b"` = boolean(`"1"`/`"0"`), `"str"` = ์ˆ˜์‹ ๊ฒฐ๊ณผ ๋ฌธ์ž์—ด, `"n"` = ์ˆซ์ž, `"inlineStr"` = ์ธ๋ผ์ธ ์„œ์‹ ํ…์ŠคํŠธ, `"e"` = ์—๋Ÿฌ(์ฝ๊ธฐ ์‹œ throw). ๋ณดํ†ต ์ง์ ‘ ๋‹ค๋ฃจ์ง€ ์•Š๊ณ  `getValue`/`setValue` ๊ฐ€ ์ž๋™ ๋งคํ•‘ํ•˜๋ฏ€๋กœ, ์™ธ๋ถ€ ์ƒ์„ฑ ํŒŒ์ผ์˜ ์…€ ํƒ€์ž… ๋ถ„๊ธฐ๋ฅผ ์ง์ ‘ ๊ฒ€์‚ฌํ•  ๋•Œ๋งŒ ์ฐธ์กฐ.
23
+ - `ExcelAddressPoint` = `{ r: number; c: number }` โ€” 0 ๊ธฐ๋ฐ˜ ํ–‰(`r`)ยท์—ด(`c`) ์ขŒํ‘œ. ์…€ ๋‹จ์ผ ์œ„์น˜ ๋‹จ์œ„. `cell(r, c)` ์ธ๋ฑ์Šค์™€ ๋™์ผ 0 ๊ธฐ๋ฐ˜.
24
+ - `ExcelAddressRangePoint` = `{ s: ExcelAddressPoint; e: ExcelAddressPoint }` โ€” ๋ฒ”์œ„ ์ขŒํ‘œ. `s` = ์‹œ์ž‘(์ขŒ์ƒ๋‹จ), `e` = ๋(์šฐํ•˜๋‹จ, inclusive). `getRange()` ๋ฐ˜ํ™˜ ํƒ€์ž…์ด๋ฉฐ ์‹œํŠธ ์ˆœํšŒ ๋ฃจํ”„ ๊ฒฝ๊ณ„๋กœ ์“ด๋‹ค.
25
+ - `ExcelBorderPosition` = `"left" | "right" | "top" | "bottom"` โ€” ํ…Œ๋‘๋ฆฌ ์ ์šฉ ๋ณ€. `ExcelStyleOptions.border` ๋ฐฐ์—ด ์›์†Œ. 4๋ณ€ ์ „๋ถ€๋ฉด 4๊ฐœ๋ฅผ ๋ฐฐ์—ด์— ๋ชจ๋‘ ๋„ฃ์Œ.
26
+ - `ExcelHorizontalAlign` = `"center" | "left" | "right"` โ€” ๊ฐ€๋กœ ์ •๋ ฌ ๊ฐ’. ๋ฏธ์ง€์ • ์‹œ ์…€ ๊ธฐ๋ณธ(์—‘์…€ ์ž๋™).
27
+ - `ExcelVerticalAlign` = `"center" | "top" | "bottom"` โ€” ์„ธ๋กœ ์ •๋ ฌ ๊ฐ’. ๋ฏธ์ง€์ • ์‹œ ์…€ ๊ธฐ๋ณธ.
28
+ - `ExcelFontUnderline` = `"single" | "double" | "singleAccounting" | "doubleAccounting"` โ€” ๋ฐ‘์ค„ ์ข…๋ฅ˜. OOXML `<u val="...">` ์˜ val ์— ๊ทธ๋Œ€๋กœ ๋งคํ•‘. ํšŒ๊ณ„์šฉ ๋ฐ‘์ค„์ด ํ•„์š”ํ•  ๋•Œ `*Accounting`.
29
29
 
30
30
  ## OOXML XML-shape ํƒ€์ž…
31
31
 
32
- `./types` ๊ฐ€ ํ•จ๊ป˜ export ํ•˜๋Š” ๋‹ค์Œ ์ธํ„ฐํŽ˜์ด์Šคยทํƒ€์ž…์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋‚ด๋ถ€ XML ํŒŒ์„œ/์ง๋ ฌํ™”๊ธฐ๊ฐ€ OOXML ํŒŒํŠธ์˜ ํŒŒ์‹ฑ ๊ฒฐ๊ณผ(`xml2js` ์Šคํƒ€์ผ์˜ `$`=์†์„ฑ, ์ž์‹ ๋ฐฐ์—ด ๋ž˜ํ•‘)๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์ด๋‹ค. ์ผ๋ฐ˜ ์‚ฌ์šฉ ํ๋ฆ„(๊ฐ’/์Šคํƒ€์ผ/์‹œํŠธ API)์—์„œ๋Š” ์ง์ ‘ ๋‹ค๋ฃจ์ง€ ์•Š์œผ๋ฉฐ, OOXML ๋…ธ๋“œ๋ฅผ ์ง์ ‘ ์กฐ์ž‘ยท๊ฒ€์ฆํ•  ๋•Œ๋งŒ ์ฐธ์กฐํ•œ๋‹ค.
32
+ `./types` ๊ฐ€ ํ•จ๊ป˜ export ํ•˜๋Š” ๋‹ค์Œ ์ธํ„ฐํŽ˜์ด์Šคยทํƒ€์ž…์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋‚ด๋ถ€ XML ํŒŒ์„œ/์ง๋ ฌํ™”๊ธฐ๊ฐ€ OOXML ํŒŒํŠธ์˜ ํŒŒ์‹ฑ ๊ฒฐ๊ณผ(`xml2js` ์Šคํƒ€์ผ์˜ `$`=์†์„ฑ, ์ž์‹์€ ๋‹จ์ผ ์›์†Œ ๋ฐฐ์—ด๋กœ ๋ž˜ํ•‘)๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์ด๋‹ค. ์ผ๋ฐ˜ ์‚ฌ์šฉ ํ๋ฆ„(๊ฐ’/์Šคํƒ€์ผ/์‹œํŠธ API)์—์„œ๋Š” ์ง์ ‘ ๋‹ค๋ฃจ์ง€ ์•Š์œผ๋ฉฐ, OOXML ๋…ธ๋“œ๋ฅผ ์ง์ ‘ ์กฐ์ž‘ยท๊ฒ€์ฆํ•  ๋•Œ๋งŒ ์ฐธ์กฐํ•œ๋‹ค. ํ’€์ด๋Š” ๊ฐ ํƒ€์ž…์ด ํ‘œํ˜„ํ•˜๋Š” ํŒŒํŠธ 1์ค„๋กœ ํ•œ์ •.
33
33
 
34
- - `ExcelXmlContentTypeData` โ€” `[Content_Types].xml` ์˜ `Types`(Default/Override ํŒŒํŠธ ๋“ฑ๋ก) ๊ตฌ์กฐ.
35
- - `ExcelXmlRelationshipData` / `ExcelRelationshipData` โ€” `*.rels` ์˜ `Relationships` ๋ฐ ๊ฐœ๋ณ„ `Relationship`(Id/Target/Type) ๊ตฌ์กฐ.
34
+ - `ExcelXmlContentTypeData` โ€” `[Content_Types].xml` ์˜ `Types`(Default ํ™•์žฅ์ž ๋งคํ•‘ยทOverride ํŒŒํŠธ ๋“ฑ๋ก) ๊ตฌ์กฐ.
35
+ - `ExcelXmlRelationshipData` / `ExcelRelationshipData` โ€” `*.rels` ์˜ `Relationships` ์ปจํ…Œ์ด๋„ˆ ๋ฐ ๊ฐœ๋ณ„ `Relationship`(Id/Target/Type) ๊ตฌ์กฐ.
36
36
  - `ExcelXmlWorkbookData` โ€” `xl/workbook.xml` ์˜ `workbook`(bookViews/sheets ๋“ฑ) ๊ตฌ์กฐ.
37
- - `ExcelXmlWorksheetData` โ€” `xl/worksheets/sheetN.xml` ์˜ `worksheet`(sheetPr/dimension/sheetViews/cols/sheetData/mergeCells/conditionalFormatting/drawing ๋“ฑ) ๊ตฌ์กฐ.
38
- - `ExcelXmlConditionalFormattingData` / `ExcelXmlCfRuleData` โ€” `<conditionalFormatting>` ๋ธ”๋ก๊ณผ `<cfRule>`(type/operator/priority/dxfId/formula) ๊ตฌ์กฐ. `ExcelXmlCfRuleData["$"]["type"|"operator"]` ๋Š” ๊ทœ์น™ spec ๋นŒ๋“œ ์‹œ ๋‚ด๋ถ€์ ์œผ๋กœ ์ฐธ์กฐ๋œ๋‹ค.
39
- - `ExcelRowData` / `ExcelCellData` โ€” `<row r="..">` ๊ณผ `<c r=".." s=".." t="..">`(v=๊ฐ’, f=์ˆ˜์‹, is=์ธ๋ผ์ธ ๋ฌธ์ž์—ด) ๊ตฌ์กฐ.
40
- - `ExcelXmlDrawingData` โ€” `xl/drawings/drawingN.xml` ์˜ `wsDr`(twoCellAnchor/pic/blipFill/spPr ๋“ฑ ์ด๋ฏธ์ง€ ์•ต์ปค) ๊ตฌ์กฐ.
41
- - `ExcelXmlSharedStringData` / `ExcelXmlSharedStringDataSi` / `ExcelXmlSharedStringDataText` โ€” `xl/sharedStrings.xml` ์˜ `sst` ์™€ `si` ํ•ญ๋ชฉ(๋‹จ์ˆœ `t` ๋˜๋Š” ์„œ์‹ run `r[]`), ํ…์ŠคํŠธ ๋…ธ๋“œ(`space="preserve"` ๋ณด์กด) ๊ตฌ์กฐ.
37
+ - `ExcelXmlWorksheetData` โ€” `xl/worksheets/sheetN.xml` ์˜ `worksheet`(sheetPr ํƒญ์ƒ‰/dimension/sheetViews ๋ทฐยทํ‹€๊ณ ์ •/cols ์—ด๋„ˆ๋น„/sheetData ํ–‰ยท์…€/mergeCells/conditionalFormatting/drawing) ๊ตฌ์กฐ.
38
+ - `ExcelXmlConditionalFormattingData` / `ExcelXmlCfRuleData` โ€” `<conditionalFormatting sqref="...">` ๋ธ”๋ก๊ณผ `<cfRule>`(type/operator/priority/dxfId/text/formula) ๊ตฌ์กฐ. `ExcelXmlCfRuleData["$"]["type"|"operator"]` ์ธ๋ฑ์Šค ํƒ€์ž…์€ ๊ทœ์น™ spec ๋นŒ๋“œ ์‹œ ๋‚ด๋ถ€์—์„œ ์ฐธ์กฐ๋œ๋‹ค.
39
+ - `ExcelRowData` / `ExcelCellData` โ€” `<row r="..">` ๊ณผ `<c r=".." s="์Šคํƒ€์ผID" t="ํƒ€์ž…">`(v=๊ฐ’, f=์ˆ˜์‹, is=์ธ๋ผ์ธ ๋ฌธ์ž์—ด) ๊ตฌ์กฐ.
40
+ - `ExcelXmlDrawingData` โ€” `xl/drawings/drawingN.xml` ์˜ `wsDr`(twoCellAnchor from/to ์•ต์ปค, pic/blipFill/spPr ์ด๋ฏธ์ง€ ๋…ธ๋“œ) ๊ตฌ์กฐ.
41
+ - `ExcelXmlSharedStringData` / `ExcelXmlSharedStringDataSi` / `ExcelXmlSharedStringDataText` โ€” `xl/sharedStrings.xml` ์˜ `sst` ์™€ `si` ํ•ญ๋ชฉ(๋‹จ์ˆœ `t` ๋˜๋Š” ์„œ์‹ run `r[]` ์œ ๋‹ˆ์˜จ), ํ…์ŠคํŠธ ๋…ธ๋“œ(`space="preserve"` ๊ณต๋ฐฑ ๋ณด์กด) ๊ตฌ์กฐ.
42
42
  - `ExcelXmlStyleData` ๋ฐ ํ•˜์œ„(`...Font` / `...Fill` / `...Border` / `...Xf` / `...Dxf`) โ€” `xl/styles.xml` ์˜ `styleSheet`(numFmts/fonts/fills/borders/cellXfs/dxfs) ์™€ ๊ฐ ์ž์› ๋…ธ๋“œ ๊ตฌ์กฐ.
43
- - `ExcelXml` = `{ readonly data: unknown; cleanup(): void }` โ€” ๋ชจ๋“  XML ํŒŒํŠธ ๋ž˜ํผ๊ฐ€ ๋”ฐ๋ฅด๋Š” ๊ณตํ†ต ์ธํ„ฐํŽ˜์ด์Šค. `data` = ํŒŒ์‹ฑ๋œ ๋…ธ๋“œ ํŠธ๋ฆฌ, `cleanup()` = ์ง๋ ฌํ™” ์ „ ๋งˆ๋ฌด๋ฆฌ ์ •๋ฆฌ. ์™ธ๋ถ€์—์„œ ๊ตฌํ˜„ํ•  ์ผ์€ ๊ฑฐ์˜ ์—†๋‹ค.
43
+ - `ExcelXml` = `{ readonly data: unknown; cleanup(): void }` โ€” ๋ชจ๋“  XML ํŒŒํŠธ ๋ž˜ํผ ํด๋ž˜์Šค๊ฐ€ ๋”ฐ๋ฅด๋Š” ๊ณตํ†ต ์ธํ„ฐํŽ˜์ด์Šค. `data` = ํŒŒ์‹ฑ๋œ ๋…ธ๋“œ ํŠธ๋ฆฌ, `cleanup()` = ์ง๋ ฌํ™” ์ง์ „ ๋นˆ ๋…ธ๋“œ ์ •๋ฆฌ ๋“ฑ ๋งˆ๋ฌด๋ฆฌ. ์™ธ๋ถ€์—์„œ ๊ตฌํ˜„ํ•  ์ผ์€ ๊ฑฐ์˜ ์—†๋‹ค.
@@ -1,54 +1,62 @@
1
1
  # @simplysm/excel โ€” ExcelCell / ExcelRow / ExcelCol
2
2
 
3
- ๊ฐœ๋ณ„ ์…€์˜ ๊ฐ’ยท์ˆ˜์‹ยท๋ณ‘ํ•ฉยท์Šคํƒ€์ผ์„ ์ฝ๊ณ  ์“ฐ๊ฑฐ๋‚˜, ํ–‰/์—ด ๋‹จ์œ„๋กœ ์…€์„ ์ˆœํšŒํ•  ๋•Œ ํ•จ๊ป˜ ์ฝ๋Š” ๋ฌถ์Œ. ๋ชจ๋“  ์…€ I/O ๊ฐ€ `async` ์ธ ์ด์œ ๋Š” ์…€ ํƒ€์ž…๋ณ„๋กœ ํ•„์š”ํ•œ XML ํŒŒํŠธ(SharedStrings/Styles)๋งŒ lazy-load ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ธ์Šคํ„ด์Šค๋Š” `ws.cell(r,c)` / `ws.row(r)` / `ws.col(c)` ๋กœ ์–ป์œผ๋ฉฐ ์ขŒํ‘œ๋Š” ๋ชจ๋‘ 0 ๊ธฐ๋ฐ˜.
3
+ ๊ฐœ๋ณ„ ์…€์˜ ๊ฐ’ยท์ˆ˜์‹ยท๋ณ‘ํ•ฉยท์Šคํƒ€์ผ์„ ์ฝ๊ณ  ์“ฐ๊ฑฐ๋‚˜, ํ–‰/์—ด ๋‹จ์œ„๋กœ ์…€์„ ์ˆœํšŒํ•˜๊ณ  ์—ด ๋„ˆ๋น„๋ฅผ ์ค„ ๋•Œ ํ•จ๊ป˜ ์ฝ๋Š” ๋ฌถ์Œ. ์…€ ๊ฐ์ฒด๋Š” `ws.cell(r,c)` / `ws.row(r)` / `ws.col(c)` ๋กœ ์–ป์œผ๋ฉฐ(๋ชจ๋‘ 0 ๊ธฐ๋ฐ˜, ๋™๊ธฐ ๋ฐ˜ํ™˜ยท์ธ์Šคํ„ด์Šค ์บ์‹œ), ์‹ค์ œ I/O ๋Š” ์…€์˜ `async` ๋ฉ”์„œ๋“œ์—์„œ ์ผ์–ด๋‚œ๋‹ค.
4
4
 
5
5
  ## ExcelCell
6
6
 
7
- ```typescript
8
- readonly addr: ExcelAddressPoint // { r, c } 0 ๊ธฐ๋ฐ˜
9
- ```
7
+ `ws.cell(r, c)` ๋˜๋Š” `row.cell(c)` / `col.cell(r)` ๋กœ ์–ป๋Š”๋‹ค.
8
+
9
+ - `readonly addr: ExcelAddressPoint` โ€” ์ด ์…€์˜ 0 ๊ธฐ๋ฐ˜ ์ขŒํ‘œ `{ r, c }`. ๋ณ‘ํ•ฉยท๋ณต์‚ฌ ์ธ์ž๋กœ ์žฌ์‚ฌ์šฉ.
10
10
 
11
- ### ๊ฐ’/์ˆ˜์‹
11
+ ๊ฐ’/์ˆ˜์‹:
12
12
 
13
- - `setValue(val: ExcelValueType): Promise<void>` โ€” ์…€ ๊ฐ’ ์„ค์ •. `val` ํƒ€์ž…๋ณ„ ๋ถ„๊ธฐ: string โ†’ SharedString ์œผ๋กœ ๋“ฑ๋ก, boolean โ†’ `"1"/"0"`, number โ†’ ์ˆซ์ž ์…€, `DateOnly`/`DateTime`/`Time` โ†’ Excel ๋‚ ์งœ ์‹œ๋ฆฌ์–ผ + ํ•ด๋‹น numFmt ์Šคํƒ€์ผ ์ž๋™ ์ ์šฉ, `undefined`/`null` โ†’ ์…€ ์‚ญ์ œ. ๊ทธ ์™ธ ํƒ€์ž…์€ throw.
14
- - `getValue(): Promise<ExcelValueType>` โ€” ์…€ ๊ฐ’ ๋ฐ˜ํ™˜. ๋นˆ ์…€์ด๋ฉด `undefined`. ์…€ ํƒ€์ž…ยทnumFmt ๋ฅผ ๋ณด๊ณ  string/boolean/number/`DateOnly`/`DateTime`/`Time` ๋กœ ๋ณต์›. ์…€ ํƒ€์ž…์ด `"e"`(์—๋Ÿฌ)๋ฉด throw.
15
- - `setFormula(val: string | undefined): Promise<void>` โ€” ์ˆ˜์‹ ์„ค์ •. `undefined` ๋ฉด ์…€ ์‚ญ์ œ. ์„ค์ • ์‹œ ์…€ ํƒ€์ž…์€ `str` ๋กœ.
16
- - `getFormula(): Promise<string | undefined>` โ€” ์…€ ์ˆ˜์‹ ๋ฐ˜ํ™˜(์—†์œผ๋ฉด `undefined`).
13
+ - `getValue(): Promise<ExcelValueType>` โ€” ์…€ ๊ฐ’์„ ํƒ€์ž… ์ถ”๋ก ํ•ด ๋ฐ˜ํ™˜. SharedStringโ†’string, `b`โ†’boolean, ์ˆซ์žํ˜• numFmtโ†’number, ๋‚ ์งœ/์‹œ๊ฐ„ numFmtโ†’`DateOnly`/`DateTime`/`Time`, ๋นˆ ์…€โ†’`undefined`. ์…€ ํƒ€์ž…์ด `e`(์—๋Ÿฌ)์ด๊ฑฐ๋‚˜ ์‹œ๋ฆฌ์–ผ ํŒŒ์‹ฑ ์‹คํŒจ๋ฉด throw. ๋‚ ์งœ ํŒ๋ณ„์€ ์…€ ์Šคํƒ€์ผ์˜ numFmtCode/numFmtId ๋ฅผ ๋ณธ๋‹ค.
14
+ - `setValue(val: ExcelValueType): Promise<void>` โ€” ๊ฐ’ ์“ฐ๊ธฐ. `string`โ†’SharedString ๋“ฑ๋ก ํ›„ `s` ํƒ€์ž…, `boolean`โ†’`b` ํƒ€์ž…(`"1"`/`"0"`), `number`โ†’์ˆซ์ž, `DateOnly`/`DateTime`/`Time`โ†’์‹œ๋ฆฌ์–ผ ์ˆซ์ž + ํ•ด๋‹น ๋‚ ์งœ numFmt ์ž๋™ ๋ถ€์—ฌ, `undefined`/`null`โ†’์…€ ์‚ญ์ œ. ๊ทธ ์™ธ ํƒ€์ž…์€ throw. ๋‚ ์งœํ˜• ํ™”๋ฉด์ด๋ฉด ๋ฌธ์ž์—ด ๋ณ€ํ™˜ ์—†์ด ๋‚ ์งœ ๊ฐ์ฒด๋ฅผ ๊ทธ๋Œ€๋กœ ๋„˜๊ฒจ ์ž๋™ ์„œ์‹์„ ๋ฐ›๋Š” ๊ฒŒ ๋‹จ์ˆœ.
15
+ - `getFormula(): Promise<string | undefined>` โ€” ์…€ ์ˆ˜์‹ ๋ฌธ์ž์—ด ๋ฐ˜ํ™˜(์—†์œผ๋ฉด `undefined`).
16
+ - `setFormula(val: string | undefined): Promise<void>` โ€” ์ˆ˜์‹ ์„ค์ •. ์…€ ํƒ€์ž…์„ `str` ๋กœ ๋‘๊ณ  ์บ์‹œ ๊ฐ’(v)์€ ๋น„์šด๋‹ค. `undefined` ๋ฉด ์…€ ์‚ญ์ œ. ์ˆ˜์‹ ๋ฌธ์ž์—ด์€ `=` ์—†์ด ๋ณธ๋ฌธ๋งŒ(์˜ˆ: `"SUM(A1:A3)"`).
17
17
 
18
- ### ๋ณ‘ํ•ฉ
18
+ ๋ณ‘ํ•ฉ:
19
19
 
20
- - `merge(r, c): Promise<void>` โ€” ํ˜„์žฌ ์…€์„ ์‹œ์ž‘์ ์œผ๋กœ ๋ ์ขŒํ‘œ `(r, c)`(0 ๊ธฐ๋ฐ˜)๊นŒ์ง€ ๋ณ‘ํ•ฉ. ์˜ˆ: A1 ์—์„œ `merge(2, 2)` โ†’ A1:C3.
20
+ - `merge(r: number, c: number): Promise<void>` โ€” ํ˜„์žฌ ์…€(์ขŒ์ƒ๋‹จ)๋ถ€ํ„ฐ ๋ ์ขŒํ‘œ `(r, c)`(0 ๊ธฐ๋ฐ˜, inclusive)๊นŒ์ง€ ๋ณ‘ํ•ฉ. ์˜ˆ: `ws.cell(0,0).merge(2,2)` โ†’ A1:C3(3ร—3) ๋ณ‘ํ•ฉ.
21
21
 
22
- ### ์Šคํƒ€์ผ
22
+ ์Šคํƒ€์ผ:
23
23
 
24
- - `setStyle(opts: ExcelStyleOptions): Promise<void>` โ€” ๋ฐฐ๊ฒฝยทํ…Œ๋‘๋ฆฌยท์ •๋ ฌยท์ˆซ์žํ˜•์‹ยทํฐํŠธ ์ ์šฉ. ๊ธฐ์กด ์Šคํƒ€์ผ์ด ์žˆ์œผ๋ฉด clone ํ›„ ๋ณ‘ํ•ฉ. ์ž์„ธํžˆ: [style.md](./style.md).
25
- - `getStyleId(): Promise<string | undefined>` โ€” ์…€์˜ ์Šคํƒ€์ผ ID(์—†์œผ๋ฉด `undefined`).
26
- - `setStyleId(styleId: string | undefined): Promise<void>` โ€” ์Šคํƒ€์ผ ID ๋ฅผ ์ง์ ‘ ์ง€์ •/ํ•ด์ œ. ์ด๋ฏธ ๋งŒ๋“ค์–ด์ง„ ์Šคํƒ€์ผ์„ ์žฌ์‚ฌ์šฉํ•  ๋•Œ.
24
+ - `getStyleId(): Promise<string | undefined>` โ€” ์…€์˜ styles.xml cellXfs ์ธ๋ฑ์Šค ID ๋ฐ˜ํ™˜.
25
+ - `setStyleId(styleId: string | undefined): Promise<void>` โ€” ์…€ ์Šคํƒ€์ผ ID ์ง์ ‘ ์ง€์ •(๋‹ค๋ฅธ ์…€๊ณผ ๋™์ผ ์Šคํƒ€์ผ ๊ณต์œ  ์‹œ). `undefined` ๋ฉด ์Šคํƒ€์ผ ํ•ด์ œ.
26
+ - `setStyle(opts: ExcelStyleOptions): Promise<void>` โ€” ๋ฐฐ๊ฒฝยทํ…Œ๋‘๋ฆฌยท์ •๋ ฌยท์ˆซ์žํ˜•์‹ยทํฐํŠธ ์ ์šฉ. ๊ธฐ์กด ์…€ ์Šคํƒ€์ผ์ด ์žˆ์œผ๋ฉด clone ํ›„ ์ง€์ • ํ•„๋“œ๋งŒ ๋ณ‘ํ•ฉํ•œ๋‹ค(๋ถ€๋ถ„ ๊ฐฑ์‹ ). ์˜ต์…˜ ํ’€์ด๋Š” [style.md](./style.md).
27
27
 
28
- ### ์‚ฌ์šฉ ์˜ˆ
28
+ ๊ฐ’ ์ฝ๊ธฐ/์“ฐ๊ธฐ ์˜ˆ:
29
29
 
30
30
  ```typescript
31
- await ws.cell(0, 0).setValue("์ด๋ฆ„");
32
- await ws.cell(1, 0).setValue(new DateOnly(2026, 6, 1)); // ๋‚ ์งœ numFmt ์ž๋™
33
- await ws.cell(0, 0).merge(0, 2); // A1:C1 ๋ณ‘ํ•ฉ
34
- const v = await ws.cell(1, 0).getValue(); // DateOnly ์ธ์Šคํ„ด์Šค
31
+ await ws.cell(0, 0).setValue("์ฝ”๋“œ");
32
+ await ws.cell(1, 0).setValue(new DateOnly(2026, 6, 3)); // ๋‚ ์งœ numFmt ์ž๋™
33
+ await ws.cell(1, 1).setFormula("SUM(C2:C10)");
34
+ const v = await ws.cell(1, 0).getValue(); // DateOnly ๋กœ ๋ณต์›
35
35
  ```
36
36
 
37
37
  ## ExcelRow
38
38
 
39
- ```typescript
40
- cell(c: number): ExcelCell // ์ด ํ–‰์˜ c์—ด ์…€(0 ๊ธฐ๋ฐ˜)
41
- getCells(): Promise<ExcelCell[]> // ๋ฐ์ดํ„ฐ ๋ฒ”์œ„ ํญ๋งŒํผ ์…€ ๋ฐฐ์—ด(์ธ๋ฑ์Šค=์—ด)
42
- ```
39
+ `ws.row(r)` ๋กœ ์–ป๋Š”๋‹ค.
43
40
 
44
- - `getCells` ๋Š” ์‹œํŠธ ๋ฐ์ดํ„ฐ ๋ฒ”์œ„์˜ ์‹œ์ž‘~๋ ์—ด๊นŒ์ง€ ์…€์„ ์ฑ„์šฐ๋ฉฐ, ๋ฐฐ์—ด ์ธ๋ฑ์Šค๊ฐ€ ์—ด ๋ฒˆํ˜ธ์™€ ์ผ์น˜(์•ž์ชฝ ๋นˆ ์—ด์€ sparse).
41
+ - `cell(c: number): ExcelCell` โ€” ์ด ํ–‰์˜ 0 ๊ธฐ๋ฐ˜ ์—ด `c` ์…€ ๋ฐ˜ํ™˜.
42
+ - `getCells(): Promise<ExcelCell[]>` โ€” ์ด ํ–‰์—์„œ ์‹œํŠธ range ์˜ ์—ด ๋ฒ”์œ„์— ํ•ด๋‹นํ•˜๋Š” ์…€๋“ค์„ ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜(์ธ๋ฑ์Šค = ์—ด ๋ฒˆํ˜ธ, ์•ž์ชฝ ๋นˆ ์—ด์€ ๋น„์–ด ์žˆ์Œ).
45
43
 
46
44
  ## ExcelCol
47
45
 
46
+ `ws.col(c)` ๋กœ ์–ป๋Š”๋‹ค.
47
+
48
+ - `cell(r: number): ExcelCell` โ€” ์ด ์—ด์˜ 0 ๊ธฐ๋ฐ˜ ํ–‰ `r` ์…€ ๋ฐ˜ํ™˜.
49
+ - `getCells(): Promise<ExcelCell[]>` โ€” ์ด ์—ด์—์„œ ์‹œํŠธ range ์˜ ํ–‰ ๋ฒ”์œ„์— ํ•ด๋‹นํ•˜๋Š” ์…€๋“ค์„ ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜(์ธ๋ฑ์Šค = ํ–‰ ๋ฒˆํ˜ธ).
50
+ - `setWidth(size: number): Promise<void>` โ€” ์—ด ๋„ˆ๋น„ ์„ค์ •(์—‘์…€ ๋ฌธ์ž ๋„ˆ๋น„ ๋‹จ์œ„). ์—ด 1๊ฐœ ๋‹จ์œ„๋กœ cols ์ •์˜๋ฅผ ๊ฐฑ์‹ .
51
+
52
+ ์—ด ๋„ˆ๋น„ ์˜ˆ:
53
+
48
54
  ```typescript
49
- cell(r: number): ExcelCell // ์ด ์—ด์˜ rํ–‰ ์…€(0 ๊ธฐ๋ฐ˜)
50
- getCells(): Promise<ExcelCell[]> // ๋ฐ์ดํ„ฐ ๋ฒ”์œ„ ๋†’์ด๋งŒํผ ์…€ ๋ฐฐ์—ด(์ธ๋ฑ์Šค=ํ–‰)
51
- setWidth(size: number): Promise<void> // ์—ด ๋„ˆ๋น„ ์„ค์ •
55
+ await ws.col(0).setWidth(20);
52
56
  ```
53
57
 
54
- - `setWidth` ์˜ `size` โ€” Excel ์—ด ๋„ˆ๋น„ ๋‹จ์œ„(๋ฌธ์ž ํญ ๊ธฐ์ค€). ์ปฌ๋Ÿผ ํญ์„ ๋ฐ์ดํ„ฐ์— ๋งž๊ฒŒ ๋„“ํž ๋•Œ.
58
+ ## ์ฃผ์˜์‚ฌํ•ญ
59
+
60
+ - ํ–‰/์—ด/์…€ ์ธ๋ฑ์Šค๋Š” ๋ชจ๋‘ 0 ๊ธฐ๋ฐ˜(์—‘์…€ ํ™”๋ฉด์˜ 1ํ–‰/A์—ด = ์ธ๋ฑ์Šค 0).
61
+ - `getCells()` ๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐฐ์—ด์€ range ์‹œ์ž‘ ์ธ๋ฑ์Šค๋ถ€ํ„ฐ ์ฑ„์›Œ์ง€๋ฏ€๋กœ ์•ž์ชฝ ์ธ๋ฑ์Šค๊ฐ€ ๋น„์–ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. `for..of` ๋ณด๋‹ค `range` ๊ฒฝ๊ณ„๋กœ ์ง์ ‘ ์ˆœํšŒํ•˜๋Š” ํŽธ์ด ์•ˆ์ „.
62
+ - `setStyle` ์€ ๋ˆ„์  ๋ณ‘ํ•ฉ(๊ธฐ์กด ์Šคํƒ€์ผ ์œ„์— ์ง€์ • ํ•„๋“œ๋งŒ ๋ฎ์–ด์”€)์ด๊ณ , `setStyleId(undefined)` ๋Š” ์Šคํƒ€์ผ ์ „์ฒด ํ•ด์ œ๋‹ค. ๋‘˜์„ ํ˜ผ๋™ํ•˜์ง€ ๋ง ๊ฒƒ.
@@ -1,25 +1,33 @@
1
1
  # @simplysm/excel โ€” ์กฐ๊ฑด๋ถ€ ์„œ์‹
2
2
 
3
- ์…€/๋ฒ”์œ„์— ๊ฐ’ ๋น„๊ตยทํ…์ŠคํŠธ ๋งค์นญยท์ˆ˜์‹ ๊ธฐ๋ฐ˜์˜ native CF(Excel ์กฐ๊ฑด๋ถ€ ์„œ์‹) ๊ทœ์น™์„ ์ถ”๊ฐ€ํ•  ๋•Œ ํ•จ๊ป˜ ์ฝ๋Š” ๋ฌถ์Œ. `ws.addConditionalFormat` ์— `ExcelConditionalRule[]` ์„ ๋„˜๊ธฐ๋ฉฐ, ๊ฐ ๊ทœ์น™์€ `ExcelConditionalRuleStyle` ๊ฐ•์กฐ ์Šคํƒ€์ผ์„ ๊ฐ€์ง„๋‹ค.
3
+ ์…€/๋ฒ”์œ„์— ๊ฐ’ ๋น„๊ตยทํ…์ŠคํŠธ ๋งค์นญยท์ˆ˜์‹ ๊ธฐ๋ฐ˜์˜ ์—‘์…€ native ์กฐ๊ฑด๋ถ€ ์„œ์‹(CF)์„ ์ถ”๊ฐ€ํ•  ๋•Œ ์ฐธ์กฐ. `ws.addConditionalFormat({ ref, rules })` ํ•œ ๋ฉ”์„œ๋“œ๋กœ ์ ์šฉํ•˜๋ฉฐ, ๊ทœ์น™์€ `ExcelConditionalRule` ์œ ๋‹ˆ์˜จ์œผ๋กœ ํ‘œํ˜„ํ•œ๋‹ค. ์ •์  ์…€ ์Šคํƒ€์ผ๊ณผ์˜ ํ•ฉ์„ฑ์€ ์—‘์…€ native CF ์˜ค๋ฒ„๋ ˆ์ด์— ์œ„์ž„๋œ๋‹ค(๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ง์ ‘ ์ƒ‰์„ ์น ํ•˜์ง€ ์•Š์Œ).
4
4
 
5
- ## ws.addConditionalFormat
5
+ ## addConditionalFormat
6
6
 
7
7
  ```typescript
8
- addConditionalFormat(opts: { ref: string; rules: ExcelConditionalRule[] }): Promise<void>
8
+ ws.addConditionalFormat(opts: { ref: string; rules: ExcelConditionalRule[] }): Promise<void>
9
9
  ```
10
10
 
11
- - `opts.ref: string` โ€” ๋‹จ์ผ ์…€(`"A1"`) ๋˜๋Š” ๋ฒ”์œ„(`"A1:B10"`) Excel ์ฃผ์†Œ. ๊ทœ์น™ ์ˆ˜์‹์€ ๋ฒ”์œ„์˜ ์ขŒ์ƒ๋‹จ ์…€ ๊ธฐ์ค€์œผ๋กœ ์ƒ์„ฑ๋œ๋‹ค.
12
- - `opts.rules: ExcelConditionalRule[]` โ€” ์ ์šฉํ•  ๊ทœ์น™ ๋ฐฐ์—ด. ๋ฐฐ์—ด ์ˆœ์„œ๊ฐ€ priority(์•ž์ด ์šฐ์„ )์ด๋ฉฐ, ํ˜ธ์ถœ ๊ฐ„์—๋Š” ์‹œํŠธ ์ „์—ญ ์นด์šดํ„ฐ๋กœ ์ด์–ด๋ถ™๋Š”๋‹ค. ๋นˆ ๋ฐฐ์—ด์ด๋ฉด no-op.
13
- - ๊ฐ™์€ ์‹œํŠธ์— ์—ฌ๋Ÿฌ ๋ฒˆ ํ˜ธ์ถœํ•˜๋ฉด ํ˜ธ์ถœ๋งˆ๋‹ค `<conditionalFormatting>` ๋ธ”๋ก์ด ๋ˆ„์ ๋œ๋‹ค. ์ •์  ์…€ ์Šคํƒ€์ผ๊ณผ์˜ ํ•ฉ์„ฑ์€ Excel native CF ์˜ค๋ฒ„๋ ˆ์ด์— ์œ„์ž„.
11
+ - `opts.ref: string` โ€” ์ ์šฉ ๋Œ€์ƒ. ๋‹จ์ผ ์…€(`"A1"`) ๋˜๋Š” ๋ฒ”์œ„(`"A1:B10"`) ์—‘์…€ ์ฃผ์†Œ. text ๋ฅ˜ ๊ทœ์น™์˜ ๋น„๊ต ๊ธฐ์ค€ ์…€์€ ref ์˜ ์ขŒ์ƒ๋‹จ ์…€.
12
+ - `opts.rules: ExcelConditionalRule[]` โ€” ์ ์šฉ ๊ทœ์น™ ๋ฐฐ์—ด. ๋ฐฐ์—ด ์ˆœ์„œ๊ฐ€ priority(์•ž์ด ์šฐ์„ )์ด๋ฉฐ, ๊ฐ™์€ ์‹œํŠธ์— ์—ฌ๋Ÿฌ ๋ฒˆ ํ˜ธ์ถœํ•˜๋ฉด ํ˜ธ์ถœ๋งˆ๋‹ค `<conditionalFormatting>` ๋ธ”๋ก์ด ๋ˆ„์ ๋˜๊ณ  priority ๋Š” ์‹œํŠธ ์ „์—ญ ์นด์šดํ„ฐ๋กœ ์ด์–ด๋ถ™๋Š”๋‹ค. ๋นˆ ๋ฐฐ์—ด์ด๋ฉด no-op.
14
13
 
15
14
  ## ExcelConditionalRule
16
15
 
17
- 4๊ฐœ ๋ณ€ํ˜•์˜ ์œ ๋‹ˆ์˜จ. ๋ชจ๋“  ๋ณ€ํ˜•์ด `style: ExcelConditionalRuleStyle` ๋ฅผ ๊ฐ€์ง„๋‹ค.
16
+ ๊ฐ’ ๋น„๊ต(๋‹จ์ผ):
18
17
 
19
- - `{ type: "cellIs"; op: "<" | ">" | "<=" | ">=" | "=" | "<>"; value: number | string; style }` โ€” ๋‹จ์ผ ๊ฐ’ ๋น„๊ต. `op` = ๋น„๊ต ์—ฐ์‚ฐ์ž, `value` = ๋น„๊ต ๋Œ€์ƒ(์ˆซ์ž๋Š” raw formula, ๋ฌธ์ž์—ด์€ ๋”ฐ์˜ดํ‘œ ๋ฆฌํ„ฐ๋Ÿด formula ๋กœ emit).
20
- - `{ type: "cellIs"; op: "between" | "notBetween"; value: [number, number] | [string, string]; style }` โ€” ๊ตฌ๊ฐ„ ๋น„๊ต. `value` = `[a, b]` ํŠœํ”Œ(์–‘ ๋ inclusive). `"between"` = ๊ตฌ๊ฐ„ ์•ˆ, `"notBetween"` = ๊ตฌ๊ฐ„ ๋ฐ–.
21
- - `{ type: "text"; op: "contains" | "notContains" | "beginsWith" | "endsWith"; value: string; style }` โ€” ํ…์ŠคํŠธ ๋งค์นญ. `value` = ๋น„๊ต ๋ฌธ์ž์—ด. `"contains"`/`"notContains"` = ํฌํ•จ/๋ฏธํฌํ•จ, `"beginsWith"`/`"endsWith"` = ์‹œ์ž‘/๋ ์ผ์น˜. SEARCH ๊ธฐ๋ฐ˜ ๋Œ€์†Œ๋ฌธ์ž ๋ฌด์‹œ ๊ณ ์ •.
22
- - `{ type: "expression"; formula: string; style }` โ€” ์ž„์˜ ์ˆ˜์‹ ๊ทœ์น™. `formula` = Excel ์ˆ˜์‹ ๋ฌธ์ž์—ด(true ๋ฉด ๊ฐ•์กฐ). ํ”„๋ฆฌ์…‹์œผ๋กœ ํ‘œํ˜„ ๋ชปํ•˜๋Š” ์กฐ๊ฑด์ผ ๋•Œ.
18
+ - `{ type: "cellIs"; op: "<" | ">" | "<=" | ">=" | "=" | "<>"; value: number | string; style }` โ€” ์…€ ๊ฐ’๊ณผ `value` ์˜ ๋‹จ์ผ ๋น„๊ต. `op` = ๋น„๊ต ์—ฐ์‚ฐ์ž(`"<>"` = ๊ฐ™์ง€ ์•Š์Œ). `value: number` ๋Š” raw formula(`4999`), `value: string` ์€ ๋”ฐ์˜ดํ‘œ ๋ฆฌํ„ฐ๋Ÿด(`"OK"`)๋กœ emit. ์ˆ˜์น˜ ์ž„๊ณ„ยทํŠน์ • ํ…์ŠคํŠธ ์ผ์น˜ ๊ฐ•์กฐ์—.
19
+
20
+ ๊ฐ’ ๋น„๊ต(๊ตฌ๊ฐ„):
21
+
22
+ - `{ type: "cellIs"; op: "between" | "notBetween"; value: [number, number] | [string, string]; style }` โ€” ๋‘ ๊ฐ’ ์‚ฌ์ด ๊ตฌ๊ฐ„ ๋น„๊ต(์–‘ ๋ inclusive). `op` = ๊ตฌ๊ฐ„ ์•ˆ/๋ฐ–. `value` = `[a, b]` ํŠœํ”Œ.
23
+
24
+ ํ…์ŠคํŠธ ๋งค์นญ:
25
+
26
+ - `{ type: "text"; op: "contains" | "notContains" | "beginsWith" | "endsWith"; value: string; style }` โ€” ๋ฌธ์ž์—ด ๋งค์นญ. `op` = ํฌํ•จ/๋ฏธํฌํ•จ/์‹œ์ž‘/๋. ๋‚ด๋ถ€์ ์œผ๋กœ SEARCH ๊ธฐ๋ฐ˜(๋Œ€์†Œ๋ฌธ์ž ๋ฌด์‹œ) formula ๋กœ ๋ณ€ํ™˜๋˜๋ฉฐ ๋น„๊ต ๊ธฐ์ค€์€ ref ์ขŒ์ƒ๋‹จ ์…€. ๋ถ€๋ถ„ ๋ฌธ์ž์—ดยท์ ‘๋‘/์ ‘๋ฏธ ๊ฐ•์กฐ์—.
27
+
28
+ ์ˆ˜์‹:
29
+
30
+ - `{ type: "expression"; formula: string; style }` โ€” ์ž„์˜ ์—‘์…€ ์ˆ˜์‹ ๊ธฐ๋ฐ˜. `formula` ๊ฐ€ TRUE ์ธ ์…€์— style ์ ์šฉ. `=` ์—†์ด ๋ณธ๋ฌธ๋งŒ(์˜ˆ `"$B2>$C2"`). ๋‹ค๋ฅธ ์…€ ์ฐธ์กฐยท๋ณตํ•ฉ ์กฐ๊ฑด ๋“ฑ ์œ„ ํ”„๋ฆฌ์…‹์œผ๋กœ ์•ˆ ๋˜๋Š” ๊ทœ์น™์—.
23
31
 
24
32
  ## ExcelConditionalRuleStyle
25
33
 
@@ -31,11 +39,11 @@ interface ExcelConditionalRuleStyle {
31
39
  }
32
40
  ```
33
41
 
34
- - `background?: string` โ€” ๊ฐ•์กฐ ๋ฐฐ๊ฒฝ์ƒ‰. ARGB 8์ž๋ฆฌ(์˜ˆ: `"00FFFF00"`).
35
- - `fontColor?: string` โ€” ๊ฐ•์กฐ ๊ธ€์ž์ƒ‰. ARGB 8์ž๋ฆฌ.
36
- - `fontWeight?: "bold" | "normal"` โ€” ๊ธ€์ž ๊ตต๊ธฐ. `"bold"` = ๊ตต๊ฒŒ, `"normal"` = base ๊ฐ€ bold ๋ผ๋„ ๊ฐ•์ œ normal.
42
+ - `background?: string` โ€” ๊ฐ•์กฐ ๋ฐฐ๊ฒฝ์ƒ‰(ARGB 8์ž๋ฆฌ, ์˜ˆ `"00FFFF00"`). ๋ฏธ์ง€์ • ์‹œ base ์…€ ๋ฐฐ๊ฒฝ ์œ ์ง€.
43
+ - `fontColor?: string` โ€” ๊ฐ•์กฐ ๊ธ€์ž์ƒ‰(ARGB 8์ž๋ฆฌ). ๋ฏธ์ง€์ • ์‹œ base ๊ธ€์ž์ƒ‰ ์œ ์ง€.
44
+ - `fontWeight?: "bold" | "normal"` โ€” ๊ธ€์ž ๊ตต๊ธฐ. `"bold"` = ๊ตต๊ฒŒ, `"normal"` = base ๊ฐ€ bold ๋ผ๋„ ๊ฐ•์ œ ๋ณดํ†ต. ๋ฏธ์ง€์ • ์‹œ base ์œ ์ง€.
37
45
 
38
- ๋ฏธ์ง€์ • ํ•„๋“œ๋Š” base ์…€ ์Šคํƒ€์ผ์„ ๊ทธ๋Œ€๋กœ ๋‘๊ณ , ์ง€์ • ํ•„๋“œ๋งŒ OOXML dxf ๋กœ emit ๋˜์–ด native CF ์˜ค๋ฒ„๋ ˆ์ด๋กœ ํ•ฉ์„ฑ๋œ๋‹ค.
46
+ ์ง€์ •ํ•œ ํ•„๋“œ๋งŒ OOXML dxf ๋กœ emit ๋˜์–ด native CF ์˜ค๋ฒ„๋ ˆ์ด๋กœ ํ•ฉ์„ฑ๋œ๋‹ค(๋ฏธ์ง€์ • ํ•„๋“œ๋Š” base ๊ทธ๋Œ€๋กœ).
39
47
 
40
48
  ## ์‚ฌ์šฉ ์˜ˆ
41
49
 
@@ -49,3 +57,9 @@ await ws.addConditionalFormat({
49
57
  ],
50
58
  });
51
59
  ```
60
+
61
+ ## ์ฃผ์˜์‚ฌํ•ญ
62
+
63
+ - `rules` ๋ฐฐ์—ด ์ˆœ์„œ = priority(์•ž์ด ์šฐ์„ ). ๊ฒน์น˜๋Š” ์กฐ๊ฑด์€ ์•ž ๊ทœ์น™์ด ์ด๊ธด๋‹ค.
64
+ - ์—ฌ๋Ÿฌ ๋ฒˆ ํ˜ธ์ถœํ•˜๋ฉด ๋ธ”๋ก์ด ๋ˆ„์ ๋˜๊ณ  priority ์นด์šดํ„ฐ๊ฐ€ ์‹œํŠธ ์ „์—ญ์œผ๋กœ ์ด์–ด์ง„๋‹ค โ€” ํ•œ ๋ฒ”์œ„์˜ ๊ทœ์น™์€ ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ์— ๋ชจ์•„ ๋„ฃ๋Š” ํŽธ์ด ์šฐ์„ ์ˆœ์œ„ ์˜ˆ์ธก์— ์œ ๋ฆฌ.
65
+ - `value: string` ๊ณผ `expression.formula` ์˜ ๋”ฐ์˜ดํ‘œ/์ด์Šค์ผ€์ดํ”„๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ ์›๋ฌธ ๊ทธ๋Œ€๋กœ ์ „๋‹ฌ.
@@ -1,6 +1,6 @@
1
1
  # @simplysm/excel โ€” ์…€ ์Šคํƒ€์ผ
2
2
 
3
- ์…€(`cell.setStyle`) ๋˜๋Š” ์›Œํฌ๋ถ default(`wb.setDefaultStyle`)์˜ ๋ฐฐ๊ฒฝยทํ…Œ๋‘๋ฆฌยท์ •๋ ฌยท์ˆซ์žํ˜•์‹ยทํฐํŠธ๋ฅผ ์ง€์ •ํ•  ๋•Œ ํ•จ๊ป˜ ์ฝ๋Š” ๋ฌถ์Œ. ๋‘ API ๋ชจ๋‘ `ExcelStyleOptions` ๋ฅผ ๋ฐ›์œผ๋ฉฐ `font` ๋Š” `ExcelFont` ๋ฅผ ๊ณต์œ ํ•œ๋‹ค.
3
+ ์…€(`cell.setStyle(opts)`)์ด๋‚˜ ์›Œํฌ๋ถ default(`wb.setDefaultStyle(opts)`)์— ๋ฐฐ๊ฒฝยทํ…Œ๋‘๋ฆฌยท์ •๋ ฌยท์ˆซ์žํ˜•์‹ยทํฐํŠธ๋ฅผ ์ค„ ๋•Œ ์ฐธ์กฐ. ๋‘ ํ˜ธ์ถœ ๋ชจ๋‘ ๋™์ผํ•œ `ExcelStyleOptions` ๋ฅผ ๋ฐ›๋Š”๋‹ค. ๋ฏธ์ง€์ • ํ•„๋“œ๋Š” emit ํ•˜์ง€ ์•Š์•„ ์—‘์…€ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ํ‘œ์‹œ๋˜๋ฉฐ, `cell.setStyle` ์€ ๊ธฐ์กด ์…€ ์Šคํƒ€์ผ์„ clone ํ›„ ์ง€์ • ํ•„๋“œ๋งŒ ๋ณ‘ํ•ฉ(๋ถ€๋ถ„ ๊ฐฑ์‹ )ํ•œ๋‹ค.
4
4
 
5
5
  ## ExcelStyleOptions
6
6
 
@@ -16,13 +16,13 @@ interface ExcelStyleOptions {
16
16
  }
17
17
  ```
18
18
 
19
- - `background?: string` โ€” ๋ฐฐ๊ฒฝ์ƒ‰. ARGB 8์ž๋ฆฌ 16์ง„์ˆ˜(์˜ˆ: `"00FF0000"` = ๋นจ๊ฐ•). ์…€ ์ฑ„์šฐ๊ธฐ ์ƒ‰์ด ํ•„์š”ํ•  ๋•Œ.
20
- - `border?: ExcelBorderPosition[]` โ€” ํ…Œ๋‘๋ฆฌ๋ฅผ ๊ทธ๋ฆด ๋ณ€ ๋ฐฐ์—ด. ์›์†Œ = `"left" | "right" | "top" | "bottom"`. 4๋ณ€ ๋ชจ๋‘๋ฉด `["left","right","top","bottom"]`.
21
- - `horizontalAlign?: "center" | "left" | "right"` โ€” ๊ฐ€๋กœ ์ •๋ ฌ.
22
- - `verticalAlign?: "center" | "top" | "bottom"` โ€” ์„ธ๋กœ ์ •๋ ฌ.
23
- - `numberFormat?: "number" | "string" | "DateOnly" | "DateTime" | "Time"` โ€” ์ˆซ์žํ˜•์‹ ํ”„๋ฆฌ์…‹. `"number"` = ์ผ๋ฐ˜ ์ˆ˜์น˜, `"string"` = ํ…์ŠคํŠธ ํ˜•์‹, ๋‚˜๋จธ์ง€๋Š” ๋‚ ์งœ/์‹œ๊ฐ„ ํ‘œ์‹œ ํ˜•์‹. ํ‘œ์ค€ ํ˜•์‹ ์ ์šฉ ์‹œ ์‚ฌ์šฉ.
24
- - `numberFormatCode?: string` โ€” ์ปค์Šคํ…€ Excel formatCode(์˜ˆ: `"0.000000"`, `"#,##0.00"`, `"0.00%"`). `numberFormat` ๊ณผ ๋™์‹œ ์ง€์ • ์‹œ **์ด ํ•„๋“œ๊ฐ€ ์šฐ์„ **. ํ”„๋ฆฌ์…‹์— ์—†๋Š” ์„ธ๋ฐ€ํ•œ ํ˜•์‹์ด ํ•„์š”ํ•  ๋•Œ.
25
- - `font?: ExcelFont` โ€” ํฐํŠธ ๋ฌถ์Œ(์•„๋ž˜). ๋ฏธ์ง€์ • ์†์„ฑ์€ ์›Œํฌ๋ถ default ํฐํŠธ๋กœ ํ‘œ์‹œ.
19
+ - `background?: string` โ€” ๋ฐฐ๊ฒฝ ์ฑ„์›€์ƒ‰. ARGB 8์ž๋ฆฌ 16์ง„์ˆ˜(์•ž 2์ž๋ฆฌ ์•ŒํŒŒ, ์˜ˆ `"00FF0000"` = ๋นจ๊ฐ•). ์…€ ๊ฐ•์กฐยทํ—ค๋”์ƒ‰์— ์‚ฌ์šฉ.
20
+ - `border?: ExcelBorderPosition[]` โ€” ํ…Œ๋‘๋ฆฌ๋ฅผ ๊ทธ๋ฆด ๋ณ€ ๋ฐฐ์—ด. ์›์†Œ๋Š” `"left" | "right" | "top" | "bottom"`. 4๋ณ€ ์ „๋ถ€๋ฉด 4๊ฐœ๋ฅผ ๋ชจ๋‘ ๋„ฃ์Œ(`["left","right","top","bottom"]`). ๋นˆ ๋ฐฐ์—ดยท๋ฏธ์ง€์ •์€ ํ…Œ๋‘๋ฆฌ ์—†์Œ.
21
+ - `horizontalAlign?: "center" | "left" | "right"` โ€” ๊ฐ€๋กœ ์ •๋ ฌ. `"center"` = ๊ฐ€์šด๋ฐ, `"left"`/`"right"` = ์ขŒ/์šฐ. ๋ฏธ์ง€์ • ์‹œ ์…€ ๊ธฐ๋ณธ(์—‘์…€ ์ž๋™).
22
+ - `verticalAlign?: "center" | "top" | "bottom"` โ€” ์„ธ๋กœ ์ •๋ ฌ. `"center"` = ๊ฐ€์šด๋ฐ, `"top"`/`"bottom"` = ์œ„/์•„๋ž˜. ํ–‰ ๋†’์ด๊ฐ€ ํฐ ์…€์—์„œ ์˜๋ฏธ.
23
+ - `numberFormat?: "number" | "string" | "DateOnly" | "DateTime" | "Time"` โ€” ์ˆซ์žํ˜•์‹ ํ”„๋ฆฌ์…‹. `"number"` = ์ผ๋ฐ˜ ์ˆ˜์น˜(numFmtId 0), `"string"` = ํ…์ŠคํŠธ(49), `"DateOnly"`(14)/`"DateTime"`(22)/`"Time"`(18) = ๋‚ ์งœ/์‹œ๊ฐ„ ํ‘œ์‹œ. ํ‘œ์ค€ ํ˜•์‹์ด๋ฉด ์ด๊ฑธ๋กœ ์ถฉ๋ถ„.
24
+ - `numberFormatCode?: string` โ€” ์ปค์Šคํ…€ ์—‘์…€ formatCode(์˜ˆ `"0.000000"`, `"#,##0.00"`, `"0.00%"`). `numberFormat` ๊ณผ ๋™์‹œ ์ง€์ • ์‹œ ์ด ํ•„๋“œ๊ฐ€ ์šฐ์„ . ์ฒœ๋‹จ์œ„ยท์†Œ์ˆ˜ ์ž๋ฆฟ์ˆ˜ยทํผ์„ผํŠธ ๋“ฑ ์„ธ๋ฐ€ํ•œ ํ‘œ์‹œ๊ฐ€ ํ•„์š”ํ•  ๋•Œ.
25
+ - `font?: ExcelFont` โ€” ํฐํŠธ ๋ฌถ์Œ(์•„๋ž˜). ์ผ๋ถ€ ์†์„ฑ๋งŒ ์ค˜๋„ ๋˜๋ฉฐ, ๋ฏธ์ง€์ • ์†์„ฑ์€ ์›Œํฌ๋ถ default ํฐํŠธ๋กœ ํ‘œ์‹œ.
26
26
 
27
27
  ## ExcelFont
28
28
 
@@ -39,29 +39,35 @@ interface ExcelFont {
39
39
  ```
40
40
 
41
41
  - `size?: number` โ€” ํฐํŠธ ํฌ๊ธฐ(pt).
42
- - `family?: string` โ€” ํฐํŠธ๋ช…(์˜ˆ: `"๋ง‘์€ ๊ณ ๋”•"`, `"Calibri"`).
43
- - `bold?: boolean` โ€” ๊ตต๊ฒŒ. `true` ๋ฉด ๊ตต๊ฒŒ.
44
- - `italic?: boolean` โ€” ๊ธฐ์šธ์ž„. `true` ๋ฉด ์ดํƒค๋ฆญ.
45
- - `underline?: "single" | "double" | "singleAccounting" | "doubleAccounting"` โ€” ๋ฐ‘์ค„ ์ข…๋ฅ˜. OOXML `<u val="...">` val ์— ๊ทธ๋Œ€๋กœ ๋งคํ•‘.
46
- - `color?: string` โ€” ๊ธ€์ž์ƒ‰. ARGB 8์ž๋ฆฌ(์˜ˆ: `"00FF0000"`).
47
- - `strike?: boolean` โ€” ์ทจ์†Œ์„ . `true` ๋ฉด ๊ฐ€์šด๋ฐ์ค„.
42
+ - `family?: string` โ€” ํฐํŠธ๋ช…(์˜ˆ `"๋ง‘์€ ๊ณ ๋”•"`, `"Calibri"`). ํ•œ๊ธ€ ๋ฌธ์„œ๋ฉด ๋ณดํ†ต `"๋ง‘์€ ๊ณ ๋”•"`.
43
+ - `bold?: boolean` โ€” ๊ตต๊ฒŒ. `true` = ๋ณผ๋“œ, ๋ฏธ์ง€์ •/`false` = ๋ณดํ†ต.
44
+ - `italic?: boolean` โ€” ๊ธฐ์šธ์ž„. `true` = ์ดํƒค๋ฆญ.
45
+ - `underline?: "single" | "double" | "singleAccounting" | "doubleAccounting"` โ€” ๋ฐ‘์ค„ ์ข…๋ฅ˜. `<u val="...">` ์˜ val ๋กœ ๊ทธ๋Œ€๋กœ emit. ํšŒ๊ณ„์šฉ์ด๋ฉด `*Accounting`.
46
+ - `color?: string` โ€” ๊ธ€์ž์ƒ‰. ARGB 8์ž๋ฆฌ(์˜ˆ `"00FF0000"`).
47
+ - `strike?: boolean` โ€” ์ทจ์†Œ์„ . `true` = ์ทจ์†Œ์„  ํ‘œ์‹œ.
48
48
 
49
- ๋ฏธ์ง€์ • ํฐํŠธ ์†์„ฑ์€ OOXML `<font>` ์ž์‹์œผ๋กœ emit ๋˜์ง€ ์•Š๊ณ  Excel ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ํ‘œ์‹œ๋œ๋‹ค.
50
-
51
- ## cell.setStyle vs wb.setDefaultStyle
52
-
53
- - `cell.setStyle(opts)` โ€” ํ•ด๋‹น ์…€์—๋งŒ ์Šคํƒ€์ผ ์ ์šฉ. ๊ธฐ์กด ์…€ ์Šคํƒ€์ผ์ด ์žˆ์œผ๋ฉด clone ํ›„ ์˜ต์…˜์„ ๋ณ‘ํ•ฉ.
54
- - `wb.setDefaultStyle(opts)` โ€” `xl/styles.xml` ์˜ `fonts[0]`/`fills[0]`/`borders[0]`(OOXML default ์Šฌ๋กฏ) ์ž์ฒด๋ฅผ ๋ฎ์–ด์จ, fontId/fillId/borderId ๋ฅผ ๋ช…์‹œํ•˜์ง€ ์•Š์€ ๋ชจ๋“  ์…€์— ์ „์—ญ ์ ์šฉ. `horizontalAlign`/`verticalAlign`/`numberFormat`/`numberFormatCode` ๋Š” 0๋ฒˆ ์Šฌ๋กฏ ๊ฐœ๋…์ด ์—†์–ด `cellXfs[0]` ์— ๋ฐ•ํžŒ๋‹ค. ์˜ต์…˜์ด ์—†๋Š” ์ž์›์€ 0๋ฒˆ ์Šฌ๋กฏ์ด ๋นˆ ์Šฌ๋กฏ์œผ๋กœ reset ๋˜๋ฉฐ, ๋ฏธํ˜ธ์ถœ ์‹œ ์›๋ณธ์ด ๋ณด์กด๋œ๋‹ค.
55
-
56
- ### ์‚ฌ์šฉ ์˜ˆ
49
+ ## ์‚ฌ์šฉ ์˜ˆ
57
50
 
58
51
  ```typescript
59
- await wb.setDefaultStyle({ font: { family: "๋ง‘์€ ๊ณ ๋”•", size: 10 }, horizontalAlign: "center" });
60
-
52
+ // ์…€ ๋‹จ์œ„
61
53
  await ws.cell(0, 0).setStyle({
62
- background: "00FFFF00",
54
+ background: "00FFFF00", // ๋…ธ๋ž‘ ํ—ค๋”
63
55
  border: ["left", "right", "top", "bottom"],
64
- font: { bold: true, color: "00FF0000" },
65
- numberFormatCode: "#,##0",
56
+ horizontalAlign: "center",
57
+ verticalAlign: "center",
58
+ font: { family: "๋ง‘์€ ๊ณ ๋”•", bold: true },
66
59
  });
60
+
61
+ // ์ปค์Šคํ…€ ์ˆซ์ž ํ˜•์‹
62
+ await ws.cell(1, 2).setStyle({ numberFormatCode: "#,##0.00" });
63
+
64
+ // ์›Œํฌ๋ถ ์ „์—ญ default
65
+ await wb.setDefaultStyle({ font: { family: "๋ง‘์€ ๊ณ ๋”•", size: 10 } });
67
66
  ```
67
+
68
+ ## ์ฃผ์˜์‚ฌํ•ญ
69
+
70
+ - `setDefaultStyle` ์€ styles.xml ์˜ 0๋ฒˆ ์ž์› ์Šฌ๋กฏ(font/fill/border)์„ ๋ฎ์–ด์“ด๋‹ค โ€” fontId/fillId/borderId ๋ฅผ ๋ช…์‹œํ•˜์ง€ ์•Š์€ ๋ชจ๋“  ์…€์ด ์˜ํ–ฅ์„ ๋ฐ›๋Š”๋‹ค. ์˜ต์…˜์— ์—†๋Š” ์ž์›์€ 0๋ฒˆ ์Šฌ๋กฏ์ด ๋นˆ ์Šฌ๋กฏ์œผ๋กœ reset ๋˜๋ฏ€๋กœ, default ๋กœ ์ค„ ํ•ญ๋ชฉ์€ ํ•œ ๋ฒˆ์— ๋ชจ์•„ ํ˜ธ์ถœ.
71
+ - `numberFormat` ๊ณผ `numberFormatCode` ๋™์‹œ ์ง€์ • ์‹œ `numberFormatCode` ์šฐ์„ .
72
+ - ์ƒ‰์ƒ์€ ๋ชจ๋‘ ARGB 8์ž๋ฆฌ(์•ŒํŒŒ ํฌํ•จ). RGB 6์ž๋ฆฌ๋งŒ ์ฃผ๋ฉด ์˜๋„์™€ ๋‹ค๋ฅด๊ฒŒ ํ•ด์„๋  ์ˆ˜ ์žˆ๋‹ค.
73
+ - ๋‚ ์งœ/์‹œ๊ฐ„ ์…€์€ ๊ฐ’์œผ๋กœ `DateOnly`/`DateTime`/`Time` ์„ ๋„ฃ์œผ๋ฉด numFmt ๊ฐ€ ์ž๋™ ๋ถ€์—ฌ๋˜๋ฏ€๋กœ ๋ณดํ†ต `numberFormat` ์„ ๋”ฐ๋กœ ์ค„ ํ•„์š”๊ฐ€ ์—†๋‹ค.
@@ -1,35 +1,45 @@
1
1
  # @simplysm/excel โ€” ExcelUtils
2
2
 
3
- ์…€ ์ฃผ์†Œ(A1 ํ‘œ๊ธฐ) โ†” ์ขŒํ‘œ ๋ณ€ํ™˜, Excel ๋‚ ์งœ ์‹œ๋ฆฌ์–ผ โ†” ํƒ€์ž„์Šคํƒฌํ”„ ๋ณ€ํ™˜, ์ˆซ์žํ˜•์‹ ์ฝ”๋“œ/ID/์ด๋ฆ„ ์ƒํ˜ธ ๋ณ€ํ™˜์ด ํ•„์š”ํ•  ๋•Œ ์ฝ๋Š”๋‹ค. ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋Š” `static` ์ด๋ผ ์ธ์Šคํ„ด์Šค ์—†์ด `ExcelUtils.xxx()` ๋กœ ํ˜ธ์ถœ.
3
+ ์…€ ์ฃผ์†Œ(A1 โ†” ์ขŒํ‘œ) ๋ณ€ํ™˜, ์—‘์…€ ๋‚ ์งœ ์‹œ๋ฆฌ์–ผ โ†” JS ํƒ€์ž„์Šคํƒฌํ”„ ๋ณ€ํ™˜, ์ˆซ์žํ˜•์‹ ์ฝ”๋“œ/ID/์ด๋ฆ„ ์ƒํ˜ธ ๋ณ€ํ™˜์ด ํ•„์š”ํ•  ๋•Œ ์“ฐ๋Š” static ์œ ํ‹ธ ํด๋ž˜์Šค. ๋ชจ๋“  ๋ฉ”์„œ๋“œ๊ฐ€ ์ •์ ์ด๋ฏ€๋กœ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ์—†์ด `ExcelUtils.xxx(...)` ๋กœ ํ˜ธ์ถœ. ์ผ๋ฐ˜ ์…€ API ๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ์“ฐ์ง€๋งŒ, ์™ธ๋ถ€์—์„œ ์ฃผ์†Œ ๋ฌธ์ž์—ด โ†” ์ขŒํ‘œ๋ฅผ ์ง์ ‘ ๋‹ค๋ฃฐ ๋•Œ ์œ ์šฉํ•˜๋‹ค.
4
4
 
5
5
  ## ์ฃผ์†Œ ๋ณ€ํ™˜
6
6
 
7
- - `stringifyAddr(point: ExcelAddressPoint): string` โ€” 0 ๊ธฐ๋ฐ˜ ์ขŒํ‘œ `{r,c}` โ†’ `"A1"`. ๋กœ๊ทธยท๋ฒ”์œ„ ref ์กฐ๋ฆฝ์— ์‚ฌ์šฉ.
8
- - `stringifyRowAddr(r: number): string` โ€” ํ–‰ ์ธ๋ฑ์Šค โ†’ ํ–‰ ๋ฌธ์ž์—ด(0 โ†’ `"1"`).
9
- - `stringifyColAddr(c: number): string` โ€” ์—ด ์ธ๋ฑ์Šค โ†’ ์—ด ๋ฌธ์ž(0 โ†’ `"A"`, 26 โ†’ `"AA"`). 0~16383 ๋ฒ”์œ„ ๋ฐ–์ด๋ฉด throw.
10
- - `parseRowAddr(addr: string): number` โ€” ์ฃผ์†Œ ๋ฌธ์ž์—ด์—์„œ 0 ๊ธฐ๋ฐ˜ ํ–‰ ์ธ๋ฑ์Šค(`"A3"` โ†’ 2). ํŒŒ์‹ฑ ์‹คํŒจ ์‹œ throw.
11
- - `parseColAddr(addr: string): number` โ€” ์ฃผ์†Œ ๋ฌธ์ž์—ด์—์„œ 0 ๊ธฐ๋ฐ˜ ์—ด ์ธ๋ฑ์Šค(`"B3"` โ†’ 1).
12
- - `parseCellAddr(addr: string): ExcelAddressPoint` โ€” ์…€ ์ฃผ์†Œ โ†’ ์ขŒํ‘œ(`"B3"` โ†’ `{r:2,c:1}`).
13
- - `parseRangeAddr(rangeAddr: string): ExcelAddressRangePoint` โ€” ๋ฒ”์œ„ ์ฃผ์†Œ โ†’ ์ขŒํ‘œ ๋ฒ”์œ„(`"A1:C3"` โ†’ `{s:{r:0,c:0}, e:{r:2,c:2}}`). `:` ์—†์œผ๋ฉด ๋‹จ์ผ ์…€์„ `s===e` ๋กœ.
14
- - `stringifyRangeAddr(point: ExcelAddressRangePoint): string` โ€” ์ขŒํ‘œ ๋ฒ”์œ„ โ†’ ๋ฌธ์ž์—ด(`"A1:C3"`). `s===e` ๋ฉด ๋‹จ์ผ ์…€ ๋ฌธ์ž์—ด๋งŒ ๋ฐ˜ํ™˜.
7
+ ์ขŒํ‘œ๋Š” `ExcelAddressPoint`(`{ r, c }`, 0 ๊ธฐ๋ฐ˜), ๋ฒ”์œ„๋Š” `ExcelAddressRangePoint`(`{ s, e }`).
15
8
 
16
- ## ๋‚ ์งœ ๋ณ€ํ™˜
9
+ - `stringifyAddr(point: ExcelAddressPoint): string` โ€” ์ขŒํ‘œ๋ฅผ `"A1"` ํ˜•์‹ ๋ฌธ์ž์—ด๋กœ. ์˜ˆ `{r:0,c:0}` โ†’ `"A1"`.
10
+ - `stringifyRowAddr(r: number): string` โ€” 0 ๊ธฐ๋ฐ˜ ํ–‰ ์ธ๋ฑ์Šค๋ฅผ ํ–‰ ์ฃผ์†Œ ๋ฌธ์ž์—ด๋กœ(์˜ˆ `0` โ†’ `"1"`).
11
+ - `stringifyColAddr(c: number): string` โ€” 0 ๊ธฐ๋ฐ˜ ์—ด ์ธ๋ฑ์Šค๋ฅผ ์—ด ๋ฌธ์ž๋กœ(์˜ˆ `0` โ†’ `"A"`, `26` โ†’ `"AA"`). ๋ฒ”์œ„ 0~16383 ๋ฐ–์ด๋ฉด throw.
12
+ - `parseRowAddr(addr: string): number` โ€” ์…€ ์ฃผ์†Œ์—์„œ 0 ๊ธฐ๋ฐ˜ ํ–‰ ์ธ๋ฑ์Šค ์ถ”์ถœ(์˜ˆ `"A3"` โ†’ `2`). ํ–‰ ์ˆซ์ž ํŒŒ์‹ฑ ์‹คํŒจ ์‹œ throw.
13
+ - `parseColAddr(addr: string): number` โ€” ์…€ ์ฃผ์†Œ์—์„œ 0 ๊ธฐ๋ฐ˜ ์—ด ์ธ๋ฑ์Šค ์ถ”์ถœ(์˜ˆ `"B3"` โ†’ `1`).
14
+ - `parseCellAddr(addr: string): ExcelAddressPoint` โ€” ์ฃผ์†Œ๋ฅผ ์ขŒํ‘œ๋กœ(์˜ˆ `"B3"` โ†’ `{r:2,c:1}`).
15
+ - `parseRangeAddr(rangeAddr: string): ExcelAddressRangePoint` โ€” ๋ฒ”์œ„ ์ฃผ์†Œ๋ฅผ ์ขŒํ‘œ๋กœ(์˜ˆ `"A1:C3"` โ†’ `{s:{r:0,c:0}, e:{r:2,c:2}}`). `:` ์—†๋Š” ๋‹จ์ผ ์ฃผ์†Œ๋ฉด `s`=`e`.
16
+ - `stringifyRangeAddr(point: ExcelAddressRangePoint): string` โ€” ๋ฒ”์œ„ ์ขŒํ‘œ๋ฅผ ๋ฌธ์ž์—ด๋กœ. `s`=`e` ๋ฉด ๋‹จ์ผ ์ฃผ์†Œ 1๊ฐœ๋งŒ ๋ฐ˜ํ™˜.
17
17
 
18
- Excel ์€ 1900-01-01 ์„ 1 ๋กœ ๊ณ„์‚ฐ(1899-12-30 ์ด ๋‚ ์งœ 0). ๋ณ€ํ™˜ ์‹œ ๋กœ์ปฌ ํƒ€์ž„์กด์„ ๋ณด์ •ํ•œ๋‹ค.
18
+ ## ๋‚ ์งœ ์‹œ๋ฆฌ์–ผ ๋ณ€ํ™˜
19
19
 
20
- - `convertTimeTickToNumber(tick: number): number` โ€” JS ํƒ€์ž„์Šคํƒฌํ”„(ms) โ†’ Excel ๋‚ ์งœ ์‹œ๋ฆฌ์–ผ ์ˆซ์ž.
21
- - `convertNumberToTimeTick(value: number): number` โ€” Excel ๋‚ ์งœ ์‹œ๋ฆฌ์–ผ ์ˆซ์ž โ†’ JS ํƒ€์ž„์Šคํƒฌํ”„(ms).
20
+ ์—‘์…€์€ 1900-01-01 ์„ 1 ๋กœ ์„ธ๋Š” ์‹œ๋ฆฌ์–ผ ๋‚ ์งœ ์ฒด๊ณ„(1899-12-30 = 0)๋ฅผ ์“ด๋‹ค. ๋กœ์ปฌ ํƒ€์ž„์กด ๋ณด์ •์„ ํฌํ•จํ•œ๋‹ค.
21
+
22
+ - `convertTimeTickToNumber(tick: number): number` โ€” JS ํƒ€์ž„์Šคํƒฌํ”„(ms)๋ฅผ ์—‘์…€ ๋‚ ์งœ ์‹œ๋ฆฌ์–ผ ์ˆซ์ž๋กœ. ์…€์— ๋‚ ์งœ๋ฅผ ์“ธ ๋•Œ ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉ.
23
+ - `convertNumberToTimeTick(value: number): number` โ€” ์—‘์…€ ๋‚ ์งœ ์‹œ๋ฆฌ์–ผ ์ˆซ์ž๋ฅผ JS ํƒ€์ž„์Šคํƒฌํ”„(ms)๋กœ. ์…€์—์„œ ๋‚ ์งœ๋ฅผ ์ฝ์„ ๋•Œ ์‚ฌ์šฉ.
22
24
 
23
25
  ## ์ˆซ์žํ˜•์‹ ๋ณ€ํ™˜
24
26
 
25
- - `convertNumFmtCodeToName(numFmtCode: string): ExcelNumberFormat` โ€” formatCode ๋ฌธ์ž์—ด์„ ๋ถ„์„ํ•ด `"number"`/`"DateOnly"`/`"DateTime"`/`"Time"`/`"string"` ํŒ๋ณ„. `"General"` ์€ `"number"`. ์‹œ๊ฐ„ ๋ฌธ๋งฅ์˜ `mm`(๋ถ„)์€ ๋‚ ์งœ ํŒ๋ณ„์—์„œ ์ œ์™ธ. ์–ด๋””์—๋„ ํ•ด๋‹น ์•ˆ ๋˜๋ฉด throw.
26
- - `convertNumFmtIdToName(numFmtId: number): ExcelNumberFormat` โ€” Excel ๋‚ด์žฅ numFmtId ๋ฅผ ํ˜•์‹๋ช…์œผ๋กœ. ๋ฒ”์œ„: 0~13ยท37~40ยท48 โ†’ `"number"`, 14~17ยท27~31ยท34~36ยท50~58 โ†’ `"DateOnly"`, 22 โ†’ `"DateTime"`, 18~21ยท32~33ยท45~47 โ†’ `"Time"`, 49 โ†’ `"string"`. ๋ฒ”์œ„ ๋ฐ–์ด๋ฉด throw.
27
- - `convertNumFmtNameToId(numFmtName: ExcelNumberFormat): number` โ€” ์—ญ๋ฐฉํ–ฅ. `"number"` โ†’ 0, `"DateOnly"` โ†’ 14, `"DateTime"` โ†’ 22, `"Time"` โ†’ 18, `"string"` โ†’ 49.
27
+ `ExcelNumberFormat` = `"number" | "string" | "DateOnly" | "DateTime" | "Time"` ์™€ ์—‘์…€ formatCode/numFmtId ์‚ฌ์ด ๋ณ€ํ™˜.
28
+
29
+ - `convertNumFmtCodeToName(numFmtCode: string): ExcelNumberFormat` โ€” formatCode ๋ฌธ์ž์—ด์„ ํ˜•์‹ ์ด๋ฆ„์œผ๋กœ. `"General"`โ†’`"number"`, yy/dd/mmยทh/ss ํŒจํ„ด ์กฐํ•ฉ์œผ๋กœ `"DateOnly"`/`"DateTime"`/`"Time"` ํŒ๋ณ„(์‹œ๊ฐ„ ๋ฌธ๋งฅ์˜ `mm` ์€ ๋ถ„์œผ๋กœ ์ œ์™ธ), ์ˆซ์ž ํŒจํ„ด์ด๋ฉด `"number"`. ๋ฏธํ•ด์„ ์ฝ”๋“œ๋ฉด throw.
30
+ - `convertNumFmtIdToName(numFmtId: number): ExcelNumberFormat` โ€” ์—‘์…€ ๋‚ด์žฅ ํ˜•์‹ ID ๋ฅผ ์ด๋ฆ„์œผ๋กœ. 0~13ยท37~40ยท48โ†’`"number"`, 14~17ยท27~31ยท34~36ยท50~58โ†’`"DateOnly"`, 22โ†’`"DateTime"`, 18~21ยท32~33ยท45~47โ†’`"Time"`, 49โ†’`"string"`. ๊ทธ ์™ธ ID ๋ฉด throw.
31
+ - `convertNumFmtNameToId(numFmtName: ExcelNumberFormat): number` โ€” ์ด๋ฆ„์„ ๋‚ด์žฅ ํ˜•์‹ ID ๋กœ. `"number"`โ†’0, `"DateOnly"`โ†’14, `"DateTime"`โ†’22, `"Time"`โ†’18, `"string"`โ†’49.
28
32
 
29
33
  ## ์‚ฌ์šฉ ์˜ˆ
30
34
 
31
35
  ```typescript
32
- const { r, c } = ExcelUtils.parseCellAddr("C5"); // { r: 4, c: 2 }
33
- const ref = ExcelUtils.stringifyRangeAddr({ s: { r: 0, c: 0 }, e: { r: 9, c: 1 } }); // "A1:B10"
34
- const serial = ExcelUtils.convertTimeTickToNumber(Date.now()); // Excel ๋‚ ์งœ ์ˆซ์ž
36
+ ExcelUtils.parseRangeAddr("A1:C3"); // { s:{r:0,c:0}, e:{r:2,c:2} }
37
+ ExcelUtils.stringifyAddr({ r: 1, c: 2 }); // "C2"
38
+ ExcelUtils.convertNumFmtIdToName(22); // "DateTime"
35
39
  ```
40
+
41
+ ## ์ฃผ์˜์‚ฌํ•ญ
42
+
43
+ - ํ–‰/์—ด ์ธ๋ฑ์Šค๋Š” 0 ๊ธฐ๋ฐ˜(์—‘์…€ ํ‘œ๊ธฐ A1 = `{r:0,c:0}`). ์—‘์…€ ํ™”๋ฉด ์ˆซ์ž์™€ 1 ์ฐจ์ด.
44
+ - `stringifyColAddr` ์˜ ์œ ํšจ ์—ด ๋ฒ”์œ„๋Š” 0~16383(์—‘์…€ ์ตœ๋Œ€ 16384์—ด, XFD). ๋ฒ—์–ด๋‚˜๋ฉด throw.
45
+ - ๋‚ ์งœ ๋ณ€ํ™˜์€ ์‹œ๋ฆฌ์–ผ 1 = 1900-01-01 ๊ธฐ์ค€์ด๋ฉฐ ํƒ€์ž„์กด ๋ณด์ •์ด ๋“ค์–ด๊ฐ€๋ฏ€๋กœ, ์ง์ ‘ ์‚ฐ์ˆ ํ•˜์ง€ ๋ง๊ณ  ์ด ๋ฉ”์„œ๋“œ๋กœ ์™•๋ณต.