@lotics/xlsx 0.1.0
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/package.json +30 -0
- package/src/auto_sum.test.ts +71 -0
- package/src/auto_sum.ts +83 -0
- package/src/canvas_cf.ts +135 -0
- package/src/canvas_chart.ts +687 -0
- package/src/canvas_fill.ts +156 -0
- package/src/canvas_images.ts +99 -0
- package/src/canvas_layout.test.ts +159 -0
- package/src/canvas_layout.ts +239 -0
- package/src/canvas_renderer.ts +1010 -0
- package/src/canvas_shape.ts +242 -0
- package/src/canvas_sparkline.ts +163 -0
- package/src/canvas_text.ts +454 -0
- package/src/cell_editor.ts +558 -0
- package/src/clipboard.test.ts +145 -0
- package/src/clipboard.ts +341 -0
- package/src/command_history.ts +102 -0
- package/src/csv_parser.test.ts +130 -0
- package/src/csv_parser.ts +172 -0
- package/src/data_validation.test.ts +95 -0
- package/src/data_validation.ts +114 -0
- package/src/editing_layer.test.ts +309 -0
- package/src/excel_cf_evaluate.test.ts +293 -0
- package/src/excel_cf_evaluate.ts +719 -0
- package/src/excel_cf_icons.ts +108 -0
- package/src/excel_cf_types.ts +67 -0
- package/src/excel_numfmt.test.ts +607 -0
- package/src/excel_numfmt.ts +1033 -0
- package/src/excel_parser.test.ts +1061 -0
- package/src/excel_parser.ts +393 -0
- package/src/excel_pattern_fills.ts +64 -0
- package/src/excel_table_styles.ts +160 -0
- package/src/excel_utils.test.ts +108 -0
- package/src/excel_utils.ts +162 -0
- package/src/fast-formula-parser.d.ts +53 -0
- package/src/fill_logic.ts +257 -0
- package/src/fill_patterns.test.ts +90 -0
- package/src/fill_patterns.ts +71 -0
- package/src/flash_fill.test.ts +75 -0
- package/src/flash_fill.ts +221 -0
- package/src/formula_deps.ts +189 -0
- package/src/formula_engine.test.ts +348 -0
- package/src/formula_engine.ts +401 -0
- package/src/formula_highlight.test.ts +81 -0
- package/src/formula_highlight.ts +139 -0
- package/src/formula_suggest.ts +100 -0
- package/src/hidden_sheets.test.ts +49 -0
- package/src/index.ts +149 -0
- package/src/keyboard_nav.test.ts +394 -0
- package/src/keyboard_nav.ts +891 -0
- package/src/move_logic.ts +63 -0
- package/src/numfmt_type.test.ts +158 -0
- package/src/numfmt_type.ts +231 -0
- package/src/ooxml_cell_format.ts +70 -0
- package/src/ooxml_chart.test.ts +85 -0
- package/src/ooxml_chart.ts +347 -0
- package/src/ooxml_chart_types.ts +207 -0
- package/src/ooxml_color.ts +339 -0
- package/src/ooxml_drawing.test.ts +87 -0
- package/src/ooxml_drawing.ts +287 -0
- package/src/ooxml_pivot.test.ts +195 -0
- package/src/ooxml_pivot.ts +468 -0
- package/src/ooxml_pivot_types.ts +165 -0
- package/src/ooxml_shape.ts +355 -0
- package/src/ooxml_sheet.ts +1271 -0
- package/src/ooxml_styles.ts +556 -0
- package/src/ooxml_table.test.ts +70 -0
- package/src/ooxml_table.ts +131 -0
- package/src/ooxml_workbook.test.ts +40 -0
- package/src/ooxml_workbook.ts +259 -0
- package/src/ooxml_zip.ts +33 -0
- package/src/pivot_model.ts +237 -0
- package/src/pivot_recompute.test.ts +210 -0
- package/src/pivot_recompute.ts +413 -0
- package/src/selection_model.ts +364 -0
- package/src/spreadsheet_commands.test.ts +772 -0
- package/src/spreadsheet_commands.ts +1805 -0
- package/src/structured_refs.test.ts +128 -0
- package/src/structured_refs.ts +160 -0
- package/src/style_helpers.test.ts +33 -0
- package/src/style_helpers.ts +30 -0
- package/src/template_builder.test.ts +139 -0
- package/src/template_builder.ts +36 -0
- package/src/types.ts +239 -0
- package/src/workbook_model.test.ts +536 -0
- package/src/workbook_model.ts +911 -0
- package/src/xlsx_round_trip.test.ts +279 -0
- package/src/xlsx_writer.test.ts +488 -0
- package/src/xlsx_writer.ts +1549 -0
- package/src/xml_entities.ts +23 -0
package/src/types.ts
ADDED
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
import type { ParsedConditionalFormat } from "./excel_cf_types";
|
|
2
|
+
import type {
|
|
3
|
+
ParsedChart,
|
|
4
|
+
ParsedTable,
|
|
5
|
+
ParsedDrawing,
|
|
6
|
+
ParsedSparklineGroup,
|
|
7
|
+
AutoFilterRange,
|
|
8
|
+
ParsedDataValidation,
|
|
9
|
+
} from "./ooxml_chart_types";
|
|
10
|
+
import type { ParsedPivotCache, ParsedPivotTable } from "./ooxml_pivot_types";
|
|
11
|
+
|
|
12
|
+
// =============================================================================
|
|
13
|
+
// Core spreadsheet types
|
|
14
|
+
// =============================================================================
|
|
15
|
+
|
|
16
|
+
export interface ParsedSpreadsheet {
|
|
17
|
+
sheets: ParsedSheet[];
|
|
18
|
+
activeSheetIndex: number;
|
|
19
|
+
namedRanges?: Map<string, string>;
|
|
20
|
+
/**
|
|
21
|
+
* Workbook's `calcPr.fullCalcOnLoad` flag. When true, consumers that
|
|
22
|
+
* render cells must recompute every formula before trusting the cached
|
|
23
|
+
* value — Excel does this automatically; our renderer needs to opt in.
|
|
24
|
+
*/
|
|
25
|
+
fullCalcOnLoad?: boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Workbook-level pivot caches keyed by `cacheId`. Multiple pivot tables
|
|
28
|
+
* may share a cache.
|
|
29
|
+
*/
|
|
30
|
+
pivotCaches?: Map<number, ParsedPivotCache>;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export interface ParsedSheet {
|
|
34
|
+
name: string;
|
|
35
|
+
/** True when the sheet is hidden/veryHidden in the workbook. Renderers skip
|
|
36
|
+
* these; data consumers may still read them. */
|
|
37
|
+
hidden?: boolean;
|
|
38
|
+
columns: ParsedColumn[];
|
|
39
|
+
rows: ParsedRow[];
|
|
40
|
+
mergedCells: MergedCellRange[];
|
|
41
|
+
totalRowCount: number;
|
|
42
|
+
truncated: boolean;
|
|
43
|
+
defaultRowHeight: number;
|
|
44
|
+
defaultColWidth: number;
|
|
45
|
+
showGridLines: boolean;
|
|
46
|
+
freezePane?: FreezePane;
|
|
47
|
+
conditionalFormats: ParsedConditionalFormat[];
|
|
48
|
+
images: ParsedImage[];
|
|
49
|
+
rowOutlineLevels: Map<number, number>;
|
|
50
|
+
colOutlineLevels: Map<number, number>;
|
|
51
|
+
charts?: ParsedChart[];
|
|
52
|
+
tables?: ParsedTable[];
|
|
53
|
+
drawings?: ParsedDrawing[];
|
|
54
|
+
/** Pivot tables placed on this sheet. Cache lookups go through `ParsedSpreadsheet.pivotCaches`. */
|
|
55
|
+
pivotTables?: ParsedPivotTable[];
|
|
56
|
+
dataValidations?: ParsedDataValidation[];
|
|
57
|
+
sparklineGroups?: ParsedSparklineGroup[];
|
|
58
|
+
autoFilter?: AutoFilterRange;
|
|
59
|
+
rowPageBreaks?: number[];
|
|
60
|
+
colPageBreaks?: number[];
|
|
61
|
+
pageSetup?: PageSetup;
|
|
62
|
+
printTitles?: PrintTitles;
|
|
63
|
+
headerFooter?: HeaderFooter;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export interface ParsedImage {
|
|
67
|
+
dataUrl: string;
|
|
68
|
+
tl: { row: number; col: number };
|
|
69
|
+
br: { row: number; col: number };
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export interface FreezePane {
|
|
73
|
+
frozenRows: number;
|
|
74
|
+
frozenCols: number;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Page setup for printing / PDF export. Applied per-sheet.
|
|
79
|
+
* `paperSize` is the OOXML numeric code (9 = A4, 1 = Letter).
|
|
80
|
+
* `fitToWidth`/`fitToHeight` = 0 disables that dimension's fit.
|
|
81
|
+
*/
|
|
82
|
+
export interface PageSetup {
|
|
83
|
+
orientation?: "portrait" | "landscape";
|
|
84
|
+
paperSize?: number;
|
|
85
|
+
fitToWidth?: number;
|
|
86
|
+
fitToHeight?: number;
|
|
87
|
+
scale?: number;
|
|
88
|
+
margins?: {
|
|
89
|
+
left?: number;
|
|
90
|
+
right?: number;
|
|
91
|
+
top?: number;
|
|
92
|
+
bottom?: number;
|
|
93
|
+
header?: number;
|
|
94
|
+
footer?: number;
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Rows and/or columns to repeat on every printed page. Rows/cols are
|
|
100
|
+
* 1-indexed inclusive ranges. `repeatRows: [1, 1]` repeats only row 1.
|
|
101
|
+
*/
|
|
102
|
+
export interface PrintTitles {
|
|
103
|
+
repeatRows?: [number, number];
|
|
104
|
+
repeatCols?: [number, number];
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Page header/footer text. Supports Excel field codes:
|
|
109
|
+
* `&P` page, `&N` pages, `&F` file, `&A` sheet, `&D` date, `&T` time,
|
|
110
|
+
* `&L`/`&C`/`&R` left/center/right sections.
|
|
111
|
+
*/
|
|
112
|
+
export interface HeaderFooter {
|
|
113
|
+
oddHeader?: string;
|
|
114
|
+
oddFooter?: string;
|
|
115
|
+
evenHeader?: string;
|
|
116
|
+
evenFooter?: string;
|
|
117
|
+
firstHeader?: string;
|
|
118
|
+
firstFooter?: string;
|
|
119
|
+
differentOddEven?: boolean;
|
|
120
|
+
differentFirst?: boolean;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
export interface ParsedColumn {
|
|
124
|
+
index: number;
|
|
125
|
+
width: number;
|
|
126
|
+
hidden: boolean;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
export interface ParsedRow {
|
|
130
|
+
index: number;
|
|
131
|
+
height: number;
|
|
132
|
+
cells: ParsedCell[];
|
|
133
|
+
hidden: boolean;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export type CellContent =
|
|
137
|
+
| { type: "plain"; text: string }
|
|
138
|
+
| { type: "rich_text"; parts: RichTextPart[] }
|
|
139
|
+
| { type: "hyperlink"; text: string; url: string; tooltip?: string };
|
|
140
|
+
|
|
141
|
+
export interface RichTextPart {
|
|
142
|
+
text: string;
|
|
143
|
+
font?: RichTextFont;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
export interface RichTextFont {
|
|
147
|
+
bold?: boolean;
|
|
148
|
+
italic?: boolean;
|
|
149
|
+
color?: string;
|
|
150
|
+
size?: number;
|
|
151
|
+
name?: string;
|
|
152
|
+
underline?: "single" | "double";
|
|
153
|
+
strike?: boolean;
|
|
154
|
+
vertAlign?: "superscript" | "subscript";
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
export interface ParsedCell {
|
|
158
|
+
column: number;
|
|
159
|
+
value: string;
|
|
160
|
+
/** Raw numeric value for CF evaluation (avoids parseFloat on formatted display strings). */
|
|
161
|
+
rawValue?: number;
|
|
162
|
+
/** Typed cell value preserved from OOXML parsing for lossless round-trip export. */
|
|
163
|
+
typedValue?: string | number | boolean | null;
|
|
164
|
+
/** Number format code from the cell's style (e.g., "#,##0.00", "dd/mm/yyyy"). */
|
|
165
|
+
numFmtCode?: string;
|
|
166
|
+
/** Error code for error cells (e.g., "#DIV/0!", "#REF!", "#N/A"). */
|
|
167
|
+
error?: string;
|
|
168
|
+
content: CellContent;
|
|
169
|
+
style: CellStyle;
|
|
170
|
+
/**
|
|
171
|
+
* Original `s=` xf index from the source `xl/styles.xml` cellXfs table.
|
|
172
|
+
* Preserved by the parser so that the writer can passthrough the original
|
|
173
|
+
* styles part when nothing has been mutated, avoiding a costly rebuild.
|
|
174
|
+
*/
|
|
175
|
+
originalXfIndex?: number;
|
|
176
|
+
formula?: string;
|
|
177
|
+
isArrayFormula?: boolean;
|
|
178
|
+
arrayRange?: string;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
export interface GradientData {
|
|
182
|
+
type: "linear" | "radial";
|
|
183
|
+
degree: number;
|
|
184
|
+
stops: { position: number; color: string }[];
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
export interface CellStyle {
|
|
188
|
+
fontBold?: boolean;
|
|
189
|
+
fontItalic?: boolean;
|
|
190
|
+
fontColor?: string;
|
|
191
|
+
fontSize?: number;
|
|
192
|
+
fontName?: string;
|
|
193
|
+
fontUnderline?: "single" | "double";
|
|
194
|
+
fontStrike?: boolean;
|
|
195
|
+
fontVertAlign?: "superscript" | "subscript";
|
|
196
|
+
backgroundColor?: string;
|
|
197
|
+
horizontalAlign?: "left" | "center" | "right";
|
|
198
|
+
verticalAlign?: "top" | "middle" | "bottom";
|
|
199
|
+
wrapText?: boolean;
|
|
200
|
+
indent?: number;
|
|
201
|
+
textRotation?: number | "vertical";
|
|
202
|
+
borderTop?: BorderStyle;
|
|
203
|
+
borderRight?: BorderStyle;
|
|
204
|
+
borderBottom?: BorderStyle;
|
|
205
|
+
borderLeft?: BorderStyle;
|
|
206
|
+
backgroundGradient?: string;
|
|
207
|
+
backgroundPattern?: string;
|
|
208
|
+
gradientData?: GradientData;
|
|
209
|
+
patternType?: string;
|
|
210
|
+
shrinkToFit?: boolean;
|
|
211
|
+
borderDiagonal?: BorderStyle;
|
|
212
|
+
diagonalUp?: boolean;
|
|
213
|
+
diagonalDown?: boolean;
|
|
214
|
+
readingOrder?: number;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
export interface BorderStyle {
|
|
218
|
+
width: number;
|
|
219
|
+
style: string;
|
|
220
|
+
color?: string;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
export interface MergedCellRange {
|
|
224
|
+
startRow: number;
|
|
225
|
+
startCol: number;
|
|
226
|
+
endRow: number;
|
|
227
|
+
endCol: number;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
// =============================================================================
|
|
231
|
+
// Errors
|
|
232
|
+
// =============================================================================
|
|
233
|
+
|
|
234
|
+
export class PasswordProtectedError extends Error {
|
|
235
|
+
constructor() {
|
|
236
|
+
super("This file is password-protected and cannot be previewed");
|
|
237
|
+
this.name = "PasswordProtectedError";
|
|
238
|
+
}
|
|
239
|
+
}
|