@silurus/ooxml 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.
@@ -0,0 +1,375 @@
1
+ export declare interface Border {
2
+ left: BorderEdge | null;
3
+ right: BorderEdge | null;
4
+ top: BorderEdge | null;
5
+ bottom: BorderEdge | null;
6
+ diagonalUp?: BorderEdge | null;
7
+ diagonalDown?: BorderEdge | null;
8
+ }
9
+
10
+ export declare interface BorderEdge {
11
+ style: string;
12
+ color: string | null;
13
+ }
14
+
15
+ export declare interface Cell {
16
+ col: number;
17
+ row: number;
18
+ colRef: string;
19
+ value: CellValue;
20
+ styleIndex: number;
21
+ }
22
+
23
+ declare interface CellRange {
24
+ top: number;
25
+ left: number;
26
+ bottom: number;
27
+ right: number;
28
+ }
29
+
30
+ export declare type CellValue = {
31
+ type: 'empty';
32
+ } | {
33
+ type: 'text';
34
+ text: string;
35
+ runs?: Run[];
36
+ } | {
37
+ type: 'number';
38
+ number: number;
39
+ } | {
40
+ type: 'bool';
41
+ bool: boolean;
42
+ } | {
43
+ type: 'error';
44
+ error: string;
45
+ };
46
+
47
+ export declare interface CellXf {
48
+ fontId: number;
49
+ fillId: number;
50
+ borderId: number;
51
+ numFmtId: number;
52
+ alignH: string | null;
53
+ alignV: string | null;
54
+ wrapText: boolean;
55
+ /** Indentation level (each level ≈ 3 characters, ECMA-376 §18.8.44) */
56
+ indent?: number;
57
+ /** Text rotation: 1–90 = counter-clockwise °, 91–180 = (val−90)° clockwise, 255 = stacked */
58
+ textRotation?: number;
59
+ shrinkToFit?: boolean;
60
+ }
61
+
62
+ declare type CfRule = {
63
+ type: 'cellIs';
64
+ operator: string;
65
+ formulas: string[];
66
+ dxfId: number | null;
67
+ priority: number;
68
+ } | {
69
+ type: 'expression';
70
+ formula: string;
71
+ dxfId: number | null;
72
+ priority: number;
73
+ } | {
74
+ type: 'colorScale';
75
+ stops: CfStop[];
76
+ priority: number;
77
+ } | {
78
+ type: 'dataBar';
79
+ color: string;
80
+ min: CfValue;
81
+ max: CfValue;
82
+ priority: number;
83
+ } | {
84
+ type: 'top10';
85
+ top: boolean;
86
+ percent: boolean;
87
+ rank: number;
88
+ dxfId: number | null;
89
+ priority: number;
90
+ } | {
91
+ type: 'aboveAverage';
92
+ aboveAverage: boolean;
93
+ dxfId: number | null;
94
+ priority: number;
95
+ } | {
96
+ type: 'iconSet';
97
+ iconSet: string;
98
+ cfvos: CfValue[];
99
+ reverse: boolean;
100
+ priority: number;
101
+ } | {
102
+ type: 'other';
103
+ kind: string;
104
+ priority: number;
105
+ };
106
+
107
+ declare interface CfStop {
108
+ kind: string;
109
+ value: string | null;
110
+ color: string;
111
+ }
112
+
113
+ declare interface CfValue {
114
+ kind: string;
115
+ value: string | null;
116
+ }
117
+
118
+ declare interface ChartAnchor {
119
+ fromCol: number;
120
+ fromColOff: number;
121
+ fromRow: number;
122
+ fromRowOff: number;
123
+ toCol: number;
124
+ toColOff: number;
125
+ toRow: number;
126
+ toRowOff: number;
127
+ chart: ChartData;
128
+ }
129
+
130
+ /**
131
+ * XLSX parser's raw chart output. Retains parser-native `barDir` + `grouping`
132
+ * which the renderer combines into a canonical `ChartModel.chartType` (e.g.
133
+ * `clusteredBarH`, `stackedBarPct`) at render time.
134
+ */
135
+ declare interface ChartData {
136
+ /** Primary chart type: "bar"|"line"|"area"|"pie"|"doughnut"|"radar"|"scatter" */
137
+ chartType: string;
138
+ /** "col" (vertical bars) | "row" (horizontal bars) */
139
+ barDir: string;
140
+ /** "clustered"|"stacked"|"standard"|"percentStacked" */
141
+ grouping: string;
142
+ title: string | null;
143
+ categories: string[];
144
+ series: XlsxChartSeries[];
145
+ /** Whether data labels are enabled (c:dLbls showVal/showPercent). */
146
+ showDataLabels?: boolean;
147
+ /** Category axis title (c:catAx/c:title). */
148
+ catAxisTitle?: string | null;
149
+ /** Value axis title (c:valAx/c:title). */
150
+ valAxisTitle?: string | null;
151
+ }
152
+
153
+ declare interface ConditionalFormat {
154
+ sqref: CellRange[];
155
+ rules: CfRule[];
156
+ }
157
+
158
+ declare interface Dxf {
159
+ font: Font | null;
160
+ fill: Fill | null;
161
+ border: Border | null;
162
+ }
163
+
164
+ export declare interface Fill {
165
+ patternType: string;
166
+ fgColor: string | null;
167
+ bgColor: string | null;
168
+ }
169
+
170
+ export declare interface Font {
171
+ bold: boolean;
172
+ italic: boolean;
173
+ underline: boolean;
174
+ strike: boolean;
175
+ size: number;
176
+ color: string | null;
177
+ name: string | null;
178
+ }
179
+
180
+ declare interface Hyperlink {
181
+ col: number;
182
+ row: number;
183
+ url: string | null;
184
+ }
185
+
186
+ /**
187
+ * Image anchored to a rectangle of cells (EMU offsets within the anchor cells).
188
+ * 914400 EMU = 1 inch, 9525 EMU = 1 px @ 96 DPI.
189
+ */
190
+ declare interface ImageAnchor {
191
+ fromCol: number;
192
+ fromColOff: number;
193
+ fromRow: number;
194
+ fromRowOff: number;
195
+ toCol: number;
196
+ toColOff: number;
197
+ toRow: number;
198
+ toRowOff: number;
199
+ /** Data URL (data:image/png;base64,...) */
200
+ dataUrl: string;
201
+ }
202
+
203
+ export declare interface MergeCell {
204
+ top: number;
205
+ left: number;
206
+ bottom: number;
207
+ right: number;
208
+ }
209
+
210
+ export declare interface NumFmt {
211
+ numFmtId: number;
212
+ formatCode: string;
213
+ }
214
+
215
+ export declare interface ParsedWorkbook {
216
+ workbook: Workbook;
217
+ styles: Styles;
218
+ sharedStrings: SharedString[];
219
+ }
220
+
221
+ export declare interface RenderViewportOptions {
222
+ width?: number;
223
+ height?: number;
224
+ dpr?: number;
225
+ defaultFontFamily?: string;
226
+ defaultFontSize?: number;
227
+ scrollOffsetX?: number;
228
+ scrollOffsetY?: number;
229
+ freezeRows?: number;
230
+ freezeCols?: number;
231
+ /** Scale factor applied to all cell/header dimensions (default 1). */
232
+ cellScale?: number;
233
+ /** Pre-loaded Image elements keyed by their dataUrl (for ImageAnchor rendering). */
234
+ loadedImages?: Map<string, HTMLImageElement>;
235
+ }
236
+
237
+ export declare interface Row {
238
+ index: number;
239
+ height: number | null;
240
+ cells: Cell[];
241
+ }
242
+
243
+ declare interface Run {
244
+ text: string;
245
+ font?: RunFont;
246
+ }
247
+
248
+ declare interface RunFont {
249
+ bold: boolean;
250
+ italic: boolean;
251
+ underline: boolean;
252
+ strike: boolean;
253
+ size?: number;
254
+ color?: string | null;
255
+ name?: string | null;
256
+ }
257
+
258
+ declare interface SharedString {
259
+ text: string;
260
+ runs?: Run[];
261
+ }
262
+
263
+ export declare interface SheetMeta {
264
+ name: string;
265
+ sheetId: number;
266
+ rId: string;
267
+ }
268
+
269
+ export declare interface Styles {
270
+ fonts: Font[];
271
+ fills: Fill[];
272
+ borders: Border[];
273
+ cellXfs: CellXf[];
274
+ numFmts: NumFmt[];
275
+ dxfs: Dxf[];
276
+ }
277
+
278
+ export declare interface ViewportRange {
279
+ row: number;
280
+ col: number;
281
+ rows: number;
282
+ cols: number;
283
+ }
284
+
285
+ export declare interface Workbook {
286
+ sheets: SheetMeta[];
287
+ }
288
+
289
+ export declare interface Worksheet {
290
+ name: string;
291
+ rows: Row[];
292
+ colWidths: Record<number, number>;
293
+ rowHeights: Record<number, number>;
294
+ defaultColWidth: number;
295
+ defaultRowHeight: number;
296
+ mergeCells: MergeCell[];
297
+ freezeRows: number;
298
+ freezeCols: number;
299
+ conditionalFormats: ConditionalFormat[];
300
+ images: ImageAnchor[];
301
+ charts: ChartAnchor[];
302
+ /** Whether to display zero values (ECMA-376 §18.3.1.94). Defaults to true. */
303
+ showZeros?: boolean;
304
+ /** Sheet tab color (ECMA-376 §18.3.1.79). */
305
+ tabColor?: string | null;
306
+ /** AutoFilter header range (ECMA-376 §18.3.1.2). */
307
+ autoFilter?: CellRange | null;
308
+ /** Hyperlinks in this worksheet (ECMA-376 §18.3.1.47). */
309
+ hyperlinks?: Hyperlink[];
310
+ }
311
+
312
+ /**
313
+ * XLSX parser's raw chart series (includes XLSX-only `seriesType` for mixed
314
+ * charts). Adapted to `ChartSeries` from @silurus/ooxml-core before rendering.
315
+ */
316
+ declare interface XlsxChartSeries {
317
+ name: string;
318
+ /** Chart sub-type for this series (allows mixed charts). */
319
+ seriesType: string;
320
+ categories: string[];
321
+ values: (number | null)[];
322
+ /** Explicit fill color hex (from c:spPr). Undefined = use palette. */
323
+ color?: string | null;
324
+ }
325
+
326
+ export declare class XlsxViewer {
327
+ private wb;
328
+ private canvas;
329
+ private canvasArea;
330
+ private scrollHost;
331
+ private spacer;
332
+ private tabBar;
333
+ private tabs;
334
+ private currentSheet;
335
+ private currentWorksheet;
336
+ private opts;
337
+ private resizeObserver;
338
+ constructor(container: HTMLElement, opts?: XlsxViewerOptions);
339
+ load(source: string | ArrayBuffer): Promise<void>;
340
+ showSheet(index: number): Promise<void>;
341
+ private buildTabs;
342
+ private updateTabActive;
343
+ private tabStyle;
344
+ private updateSpacerSize;
345
+ private renderCurrentSheet;
346
+ get sheetNames(): string[];
347
+ destroy(): void;
348
+ }
349
+
350
+ export declare interface XlsxViewerOptions {
351
+ /** Scale factor for cell/header dimensions (default 1). 0.5 = half size. */
352
+ cellScale?: number;
353
+ onReady?: (sheetNames: string[]) => void;
354
+ onSheetChange?: (index: number, name: string) => void;
355
+ onError?: (err: Error) => void;
356
+ }
357
+
358
+ export declare class XlsxWorkbook {
359
+ private worker;
360
+ private parsedWorkbook;
361
+ private sheetCache;
362
+ /** Cache of loaded images keyed by their data URL. Shared across sheets. */
363
+ private imageCache;
364
+ private rawData;
365
+ constructor();
366
+ load(source: string | ArrayBuffer): Promise<void>;
367
+ get sheetNames(): string[];
368
+ get sheetCount(): number;
369
+ getWorksheet(sheetIndex: number): Promise<Worksheet>;
370
+ renderViewport(target: HTMLCanvasElement | OffscreenCanvas, sheetIndex: number, viewport: ViewportRange, opts?: RenderViewportOptions): Promise<void>;
371
+ destroy(): void;
372
+ private sendMessage;
373
+ }
374
+
375
+ export { }