@bilig/excel-import 0.14.14

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 (198) hide show
  1. package/LICENSE +1 -0
  2. package/README.md +165 -0
  3. package/dist/index.d.ts +31 -0
  4. package/dist/index.js +748 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/workbook-import-content-types.d.ts +10 -0
  7. package/dist/workbook-import-content-types.js +30 -0
  8. package/dist/workbook-import-content-types.js.map +1 -0
  9. package/dist/workbook-import-helpers.d.ts +21 -0
  10. package/dist/workbook-import-helpers.js +77 -0
  11. package/dist/workbook-import-helpers.js.map +1 -0
  12. package/dist/workbook-import-preview.d.ts +19 -0
  13. package/dist/workbook-import-preview.js +12 -0
  14. package/dist/workbook-import-preview.js.map +1 -0
  15. package/dist/xlsx-array-formulas.d.ts +6 -0
  16. package/dist/xlsx-array-formulas.js +186 -0
  17. package/dist/xlsx-array-formulas.js.map +1 -0
  18. package/dist/xlsx-axis-entries.d.ts +3 -0
  19. package/dist/xlsx-axis-entries.js +90 -0
  20. package/dist/xlsx-axis-entries.js.map +1 -0
  21. package/dist/xlsx-calculation-settings.d.ts +9 -0
  22. package/dist/xlsx-calculation-settings.js +198 -0
  23. package/dist/xlsx-calculation-settings.js.map +1 -0
  24. package/dist/xlsx-cell-insertion.d.ts +11 -0
  25. package/dist/xlsx-cell-insertion.js +164 -0
  26. package/dist/xlsx-cell-insertion.js.map +1 -0
  27. package/dist/xlsx-cell-metadata.d.ts +15 -0
  28. package/dist/xlsx-cell-metadata.js +380 -0
  29. package/dist/xlsx-cell-metadata.js.map +1 -0
  30. package/dist/xlsx-chart-artifacts.d.ts +7 -0
  31. package/dist/xlsx-chart-artifacts.js +327 -0
  32. package/dist/xlsx-chart-artifacts.js.map +1 -0
  33. package/dist/xlsx-charts.d.ts +4 -0
  34. package/dist/xlsx-charts.js +671 -0
  35. package/dist/xlsx-charts.js.map +1 -0
  36. package/dist/xlsx-comment-vml.d.ts +11 -0
  37. package/dist/xlsx-comment-vml.js +292 -0
  38. package/dist/xlsx-comment-vml.js.map +1 -0
  39. package/dist/xlsx-comments.d.ts +7 -0
  40. package/dist/xlsx-comments.js +120 -0
  41. package/dist/xlsx-comments.js.map +1 -0
  42. package/dist/xlsx-conditional-formats.d.ts +5 -0
  43. package/dist/xlsx-conditional-formats.js +513 -0
  44. package/dist/xlsx-conditional-formats.js.map +1 -0
  45. package/dist/xlsx-control-artifacts.d.ts +7 -0
  46. package/dist/xlsx-control-artifacts.js +404 -0
  47. package/dist/xlsx-control-artifacts.js.map +1 -0
  48. package/dist/xlsx-data-model-artifacts.d.ts +4 -0
  49. package/dist/xlsx-data-model-artifacts.js +240 -0
  50. package/dist/xlsx-data-model-artifacts.js.map +1 -0
  51. package/dist/xlsx-data-table-formulas.d.ts +4 -0
  52. package/dist/xlsx-data-table-formulas.js +138 -0
  53. package/dist/xlsx-data-table-formulas.js.map +1 -0
  54. package/dist/xlsx-defined-names.d.ts +7 -0
  55. package/dist/xlsx-defined-names.js +292 -0
  56. package/dist/xlsx-defined-names.js.map +1 -0
  57. package/dist/xlsx-dimensions.d.ts +4 -0
  58. package/dist/xlsx-dimensions.js +495 -0
  59. package/dist/xlsx-dimensions.js.map +1 -0
  60. package/dist/xlsx-drawing-artifacts.d.ts +7 -0
  61. package/dist/xlsx-drawing-artifacts.js +477 -0
  62. package/dist/xlsx-drawing-artifacts.js.map +1 -0
  63. package/dist/xlsx-escaped-text.d.ts +2 -0
  64. package/dist/xlsx-escaped-text.js +22 -0
  65. package/dist/xlsx-escaped-text.js.map +1 -0
  66. package/dist/xlsx-export-xml.d.ts +8 -0
  67. package/dist/xlsx-export-xml.js +99 -0
  68. package/dist/xlsx-export-xml.js.map +1 -0
  69. package/dist/xlsx-export.d.ts +2 -0
  70. package/dist/xlsx-export.js +800 -0
  71. package/dist/xlsx-export.js.map +1 -0
  72. package/dist/xlsx-external-link-artifacts.d.ts +4 -0
  73. package/dist/xlsx-external-link-artifacts.js +317 -0
  74. package/dist/xlsx-external-link-artifacts.js.map +1 -0
  75. package/dist/xlsx-external-references.d.ts +29 -0
  76. package/dist/xlsx-external-references.js +356 -0
  77. package/dist/xlsx-external-references.js.map +1 -0
  78. package/dist/xlsx-filters.d.ts +4 -0
  79. package/dist/xlsx-filters.js +273 -0
  80. package/dist/xlsx-filters.js.map +1 -0
  81. package/dist/xlsx-formula-translation.d.ts +10 -0
  82. package/dist/xlsx-formula-translation.js +391 -0
  83. package/dist/xlsx-formula-translation.js.map +1 -0
  84. package/dist/xlsx-formulas.d.ts +2 -0
  85. package/dist/xlsx-formulas.js +136 -0
  86. package/dist/xlsx-formulas.js.map +1 -0
  87. package/dist/xlsx-freeze-panes.d.ts +4 -0
  88. package/dist/xlsx-freeze-panes.js +206 -0
  89. package/dist/xlsx-freeze-panes.js.map +1 -0
  90. package/dist/xlsx-hyperlinks.d.ts +5 -0
  91. package/dist/xlsx-hyperlinks.js +64 -0
  92. package/dist/xlsx-hyperlinks.js.map +1 -0
  93. package/dist/xlsx-ignored-errors.d.ts +4 -0
  94. package/dist/xlsx-ignored-errors.js +106 -0
  95. package/dist/xlsx-ignored-errors.js.map +1 -0
  96. package/dist/xlsx-import-cell-styles.d.ts +8 -0
  97. package/dist/xlsx-import-cell-styles.js +255 -0
  98. package/dist/xlsx-import-cell-styles.js.map +1 -0
  99. package/dist/xlsx-import-sheet-metadata.d.ts +40 -0
  100. package/dist/xlsx-import-sheet-metadata.js +41 -0
  101. package/dist/xlsx-import-sheet-metadata.js.map +1 -0
  102. package/dist/xlsx-import-warnings.d.ts +8 -0
  103. package/dist/xlsx-import-warnings.js +44 -0
  104. package/dist/xlsx-import-warnings.js.map +1 -0
  105. package/dist/xlsx-import-workbook-metadata.d.ts +28 -0
  106. package/dist/xlsx-import-workbook-metadata.js +29 -0
  107. package/dist/xlsx-import-workbook-metadata.js.map +1 -0
  108. package/dist/xlsx-macros.d.ts +10 -0
  109. package/dist/xlsx-macros.js +63 -0
  110. package/dist/xlsx-macros.js.map +1 -0
  111. package/dist/xlsx-merge-entries.d.ts +3 -0
  112. package/dist/xlsx-merge-entries.js +17 -0
  113. package/dist/xlsx-merge-entries.js.map +1 -0
  114. package/dist/xlsx-number-formats.d.ts +7 -0
  115. package/dist/xlsx-number-formats.js +222 -0
  116. package/dist/xlsx-number-formats.js.map +1 -0
  117. package/dist/xlsx-pivot-artifacts.d.ts +29 -0
  118. package/dist/xlsx-pivot-artifacts.js +292 -0
  119. package/dist/xlsx-pivot-artifacts.js.map +1 -0
  120. package/dist/xlsx-pivots.d.ts +10 -0
  121. package/dist/xlsx-pivots.js +589 -0
  122. package/dist/xlsx-pivots.js.map +1 -0
  123. package/dist/xlsx-print-page-setup.d.ts +6 -0
  124. package/dist/xlsx-print-page-setup.js +224 -0
  125. package/dist/xlsx-print-page-setup.js.map +1 -0
  126. package/dist/xlsx-printer-settings.d.ts +4 -0
  127. package/dist/xlsx-printer-settings.js +279 -0
  128. package/dist/xlsx-printer-settings.js.map +1 -0
  129. package/dist/xlsx-protected-ranges.d.ts +4 -0
  130. package/dist/xlsx-protected-ranges.js +183 -0
  131. package/dist/xlsx-protected-ranges.js.map +1 -0
  132. package/dist/xlsx-rich-text-artifacts.d.ts +4 -0
  133. package/dist/xlsx-rich-text-artifacts.js +303 -0
  134. package/dist/xlsx-rich-text-artifacts.js.map +1 -0
  135. package/dist/xlsx-sheet-properties.d.ts +4 -0
  136. package/dist/xlsx-sheet-properties.js +89 -0
  137. package/dist/xlsx-sheet-properties.js.map +1 -0
  138. package/dist/xlsx-sheet-protection.d.ts +4 -0
  139. package/dist/xlsx-sheet-protection.js +153 -0
  140. package/dist/xlsx-sheet-protection.js.map +1 -0
  141. package/dist/xlsx-sheet-visibility.d.ts +4 -0
  142. package/dist/xlsx-sheet-visibility.js +53 -0
  143. package/dist/xlsx-sheet-visibility.js.map +1 -0
  144. package/dist/xlsx-slicer-connection-artifacts.d.ts +4 -0
  145. package/dist/xlsx-slicer-connection-artifacts.js +426 -0
  146. package/dist/xlsx-slicer-connection-artifacts.js.map +1 -0
  147. package/dist/xlsx-sorts.d.ts +5 -0
  148. package/dist/xlsx-sorts.js +216 -0
  149. package/dist/xlsx-sorts.js.map +1 -0
  150. package/dist/xlsx-sparklines.d.ts +4 -0
  151. package/dist/xlsx-sparklines.js +115 -0
  152. package/dist/xlsx-sparklines.js.map +1 -0
  153. package/dist/xlsx-style-only-blank-cells.d.ts +3 -0
  154. package/dist/xlsx-style-only-blank-cells.js +96 -0
  155. package/dist/xlsx-style-only-blank-cells.js.map +1 -0
  156. package/dist/xlsx-style-runs.d.ts +12 -0
  157. package/dist/xlsx-style-runs.js +35 -0
  158. package/dist/xlsx-style-runs.js.map +1 -0
  159. package/dist/xlsx-styles.d.ts +25 -0
  160. package/dist/xlsx-styles.js +857 -0
  161. package/dist/xlsx-styles.js.map +1 -0
  162. package/dist/xlsx-tab-colors.d.ts +4 -0
  163. package/dist/xlsx-tab-colors.js +166 -0
  164. package/dist/xlsx-tab-colors.js.map +1 -0
  165. package/dist/xlsx-tables.d.ts +4 -0
  166. package/dist/xlsx-tables.js +371 -0
  167. package/dist/xlsx-tables.js.map +1 -0
  168. package/dist/xlsx-theme-artifacts.d.ts +6 -0
  169. package/dist/xlsx-theme-artifacts.js +126 -0
  170. package/dist/xlsx-theme-artifacts.js.map +1 -0
  171. package/dist/xlsx-threaded-comment-artifacts.d.ts +8 -0
  172. package/dist/xlsx-threaded-comment-artifacts.js +329 -0
  173. package/dist/xlsx-threaded-comment-artifacts.js.map +1 -0
  174. package/dist/xlsx-validations.d.ts +4 -0
  175. package/dist/xlsx-validations.js +542 -0
  176. package/dist/xlsx-validations.js.map +1 -0
  177. package/dist/xlsx-view-state.d.ts +8 -0
  178. package/dist/xlsx-view-state.js +144 -0
  179. package/dist/xlsx-view-state.js.map +1 -0
  180. package/dist/xlsx-workbook-properties.d.ts +5 -0
  181. package/dist/xlsx-workbook-properties.js +388 -0
  182. package/dist/xlsx-workbook-properties.js.map +1 -0
  183. package/dist/xlsx-workbook-protection.d.ts +4 -0
  184. package/dist/xlsx-workbook-protection.js +147 -0
  185. package/dist/xlsx-workbook-protection.js.map +1 -0
  186. package/dist/xlsx-workbook-sheet-paths.d.ts +4 -0
  187. package/dist/xlsx-workbook-sheet-paths.js +96 -0
  188. package/dist/xlsx-workbook-sheet-paths.js.map +1 -0
  189. package/dist/xlsx-worksheet-cells.d.ts +16 -0
  190. package/dist/xlsx-worksheet-cells.js +104 -0
  191. package/dist/xlsx-worksheet-cells.js.map +1 -0
  192. package/dist/xlsx-worksheet-text-values.d.ts +2 -0
  193. package/dist/xlsx-worksheet-text-values.js +136 -0
  194. package/dist/xlsx-worksheet-text-values.js.map +1 -0
  195. package/dist/xlsx-zip.d.ts +6 -0
  196. package/dist/xlsx-zip.js +12 -0
  197. package/dist/xlsx-zip.js.map +1 -0
  198. package/package.json +56 -0
package/LICENSE ADDED
@@ -0,0 +1 @@
1
+ MIT
package/README.md ADDED
@@ -0,0 +1,165 @@
1
+ # @bilig/excel-import
2
+
3
+ CSV/XLSX-to-`WorkbookSnapshot` import helpers and supported-subset XLSX export helpers for bilig.
4
+
5
+ ## Package Status
6
+
7
+ This package is part of the `bilig` runtime npm package set. Install it with
8
+ `@bilig/headless` when a Node project needs XLSX import, WorkPaper calculation,
9
+ and XLSX export from the same public package path.
10
+
11
+ ```sh
12
+ pnpm add @bilig/headless @bilig/excel-import
13
+ ```
14
+
15
+ For a clean first-time smoke test in an empty project:
16
+
17
+ ```sh
18
+ mkdir bilig-xlsx-smoke && cd bilig-xlsx-smoke
19
+ npm init -y
20
+ pnpm add @bilig/headless @bilig/excel-import
21
+ pnpm dlx tsx smoke.ts
22
+ ```
23
+
24
+ Use this `smoke.ts`:
25
+
26
+ ```ts
27
+ import { WorkPaper } from '@bilig/headless'
28
+ import { exportXlsx, importXlsx } from '@bilig/excel-import'
29
+
30
+ const source = WorkPaper.buildFromSheets({
31
+ Inputs: [
32
+ ['Metric', 'Value'],
33
+ ['Customers', 20],
34
+ ['Average revenue', 1200],
35
+ ],
36
+ Summary: [
37
+ ['Metric', 'Value'],
38
+ ['Revenue', '=Inputs!B2*Inputs!B3'],
39
+ ],
40
+ })
41
+
42
+ const xlsxBytes = exportXlsx(source.exportSnapshot())
43
+ source.dispose()
44
+
45
+ const imported = importXlsx(xlsxBytes, 'revenue-model.xlsx')
46
+ const workbook = WorkPaper.buildFromSnapshot(imported.snapshot, {
47
+ evaluationTimeoutMs: 30_000,
48
+ useColumnIndex: true,
49
+ })
50
+
51
+ const inputs = requireSheet(workbook, 'Inputs')
52
+ const summary = requireSheet(workbook, 'Summary')
53
+ const before = numberValue(workbook.getCellValue({ sheet: summary, row: 1, col: 1 }))
54
+ workbook.setCellContents({ sheet: inputs, row: 1, col: 1 }, 32)
55
+ const after = numberValue(workbook.getCellValue({ sheet: summary, row: 1, col: 1 }))
56
+ const roundTrip = importXlsx(exportXlsx(workbook.exportSnapshot()), 'revenue-model-edited.xlsx')
57
+ workbook.dispose()
58
+
59
+ if (before !== 24000 || after !== 38400 || roundTrip.snapshot.sheets.length !== 2) {
60
+ throw new Error(`Unexpected XLSX roundtrip: ${JSON.stringify({ before, after, sheets: roundTrip.snapshot.sheets.length })}`)
61
+ }
62
+
63
+ console.log({ before, after, sheets: roundTrip.snapshot.sheets.map((sheet) => sheet.name) })
64
+
65
+ function requireSheet(workpaper: ReturnType<typeof WorkPaper.buildFromSnapshot>, sheetName: string): number {
66
+ const sheet = workpaper.getSheetId(sheetName)
67
+ if (sheet === undefined) {
68
+ throw new Error(`Expected sheet "${sheetName}" to exist`)
69
+ }
70
+ return sheet
71
+ }
72
+
73
+ function numberValue(cell: unknown): number {
74
+ const value = typeof cell === 'object' && cell !== null && 'value' in cell ? cell.value : undefined
75
+ if (typeof value === 'number') {
76
+ return value
77
+ }
78
+ throw new Error(`Expected numeric cell value, got ${JSON.stringify(cell)}`)
79
+ }
80
+ ```
81
+
82
+ Repository development:
83
+
84
+ ```sh
85
+ pnpm install
86
+ pnpm --filter @bilig/excel-import build
87
+ pnpm exec vitest run packages/excel-import/src/__tests__/excel-import.test.ts
88
+ ```
89
+
90
+ ## XLSX To WorkPaper
91
+
92
+ ```ts
93
+ import { readFileSync, writeFileSync } from 'node:fs'
94
+ import { WorkPaper } from '@bilig/headless'
95
+ import { exportXlsx, importXlsx } from '@bilig/excel-import'
96
+
97
+ const imported = importXlsx(new Uint8Array(readFileSync('model.xlsx')), 'model.xlsx')
98
+ const workbook = WorkPaper.buildFromSnapshot(imported.snapshot, {
99
+ evaluationTimeoutMs: 30_000,
100
+ useColumnIndex: true,
101
+ })
102
+
103
+ const firstSheetName = imported.snapshot.sheets[0]?.name
104
+ const firstSheet = firstSheetName === undefined ? undefined : workbook.getSheetId(firstSheetName)
105
+ if (firstSheet === undefined) throw new Error('Workbook has no sheets')
106
+
107
+ workbook.setCellContents({ sheet: firstSheet, row: 1, col: 1 }, 150_000)
108
+ const recalculated = workbook.getCellDisplayValue({ sheet: firstSheet, row: 1, col: 1 })
109
+
110
+ writeFileSync('model-edited.xlsx', exportXlsx(workbook.exportSnapshot()))
111
+ workbook.dispose()
112
+
113
+ console.log({ recalculated })
114
+ ```
115
+
116
+ Use `WorkPaper.buildFromSnapshot()` for imported XLSX files. It preserves the
117
+ workbook metadata that Excel formulas need, including defined names, table
118
+ metadata, and structured-reference translations. `WorkPaper.buildFromSheets()`
119
+ is intentionally metadata-free. Use `workbook.exportSnapshot()` with
120
+ `exportXlsx()` when exporting a WorkPaper after edits.
121
+
122
+ Literal Excel error cells such as `#N/A`, `#DIV/0!`, `#REF!`, and `#VALUE!`
123
+ are imported as their display text instead of SheetJS numeric error codes.
124
+
125
+ Hidden XLSX rows and columns are preserved in workbook metadata and exported
126
+ back into worksheet XML, including hidden column states attached to width
127
+ metadata.
128
+
129
+ Workbook calculation properties such as iterative calculation, iteration count
130
+ and delta, forced recalculation, concurrent calculation, and manual calculation
131
+ mode are preserved from XLSX `<calcPr>` metadata on roundtrip.
132
+
133
+ Worksheet protection elements preserve non-default XML attributes from source
134
+ workbooks, so protected sheets are not normalized into a different
135
+ `<sheetProtection sheet="1"/>` state during no-op roundtrips.
136
+
137
+ Worksheet printer settings preserve binary `xl/printerSettings/*.bin` parts,
138
+ worksheet relationships, and `pageSetup` relationship links during no-op XLSX
139
+ roundtrips.
140
+
141
+ Worksheet `<sheetPr>` properties preserve non-tabColor code names,
142
+ `outlinePr`, and `pageSetUpPr` metadata during no-op XLSX roundtrips.
143
+
144
+ Workbook sheet visibility preserves hidden and very hidden worksheet state
145
+ during no-op XLSX roundtrips.
146
+
147
+ Cell hyperlinks preserve external URL targets, internal workbook targets,
148
+ tooltips, and display text during no-op XLSX roundtrips.
149
+
150
+ ## CSV Import
151
+
152
+ ```ts
153
+ import { importCsv } from '@bilig/excel-import'
154
+
155
+ const imported = importCsv('Account;Amount\n4000;125,50', 'ledger.csv', {
156
+ delimiter: ';',
157
+ decimalSeparator: ',',
158
+ })
159
+ ```
160
+
161
+ CSV import auto-detects comma, semicolon, and tab delimiters. Semicolon and tab
162
+ exports that contain decimal-comma values are parsed as locale accounting CSV by
163
+ default; pass explicit options when the source format is known. Integer-looking
164
+ fields with leading zeros are kept as text so account numbers, routing numbers,
165
+ invoice IDs, and similar identifiers are not silently changed.
@@ -0,0 +1,31 @@
1
+ import { type CsvParseOptions } from '@bilig/core';
2
+ import type { WorkbookSnapshot } from '@bilig/protocol';
3
+ import { type ImportedWorkbookPreview } from './workbook-import-preview.js';
4
+ export { exportXlsx } from './xlsx-export.js';
5
+ export { manualCalculationModeWarning, precisionAsDisplayedCalculationWarning } from './xlsx-calculation-settings.js';
6
+ export { externalPivotCachesWarning, externalWorkbookReferencesWarning, macroExecutionDeclinedWarning, volatileFormulasWarning, } from './xlsx-import-warnings.js';
7
+ export { readImportedXlsxCellStyle } from './xlsx-import-cell-styles.js';
8
+ export type { ImportedWorkbookSheetPreview } from './workbook-import-helpers.js';
9
+ export type { ImportedWorkbookPreview } from './workbook-import-preview.js';
10
+ export { CSV_CONTENT_TYPE, EXCEL_WORKBOOK_IMPORT_CONTENT_TYPES, LEGACY_XLS_CONTENT_TYPE, WORKBOOK_IMPORT_CONTENT_TYPES, XLSB_CONTENT_TYPE, XLSM_CONTENT_TYPE, XLSX_CONTENT_TYPE, normalizeWorkbookImportContentType, } from './workbook-import-content-types.js';
11
+ export type { ExcelWorkbookImportContentType, WorkbookImportContentType } from './workbook-import-content-types.js';
12
+ export interface ImportedWorkbook {
13
+ snapshot: WorkbookSnapshot;
14
+ workbookName: string;
15
+ sheetNames: string[];
16
+ warnings: string[];
17
+ preview: ImportedWorkbookPreview;
18
+ }
19
+ export type CsvImportOptions = CsvParseOptions;
20
+ export interface WorkbookImportFileOptions {
21
+ csv?: CsvImportOptions;
22
+ }
23
+ export declare class InvalidXlsxZipContainerError extends Error {
24
+ constructor();
25
+ }
26
+ export declare function importXlsx(bytes: Uint8Array | ArrayBuffer, fileName: string): ImportedWorkbook;
27
+ export declare function importXlsm(bytes: Uint8Array | ArrayBuffer, fileName: string): ImportedWorkbook;
28
+ export declare function importXlsb(bytes: Uint8Array | ArrayBuffer, fileName: string): ImportedWorkbook;
29
+ export declare function importXls(bytes: Uint8Array | ArrayBuffer, fileName: string): ImportedWorkbook;
30
+ export declare function importCsv(text: string, fileName: string, options?: CsvImportOptions): ImportedWorkbook;
31
+ export declare function importWorkbookFile(bytes: Uint8Array | ArrayBuffer, fileName: string, contentType: string, options?: WorkbookImportFileOptions): ImportedWorkbook;