react-native-nitro-xlsx 0.1.2 → 0.2.5

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 (42) hide show
  1. package/NOTICE +8 -35
  2. package/NitroXlsx.podspec +21 -57
  3. package/Package.swift +35 -0
  4. package/README.md +243 -36
  5. package/android/CMakeLists.txt +17 -23
  6. package/android/build.gradle +6 -0
  7. package/android/cpp-adapter.cpp +12 -0
  8. package/android/src/main/java/com/margelo/nitro/xlsx/NitroXlsxPackage.kt +9 -0
  9. package/cpp/HybridNitroXlsx.cpp +32 -9
  10. package/cpp/HybridNitroXlsx.hpp +2 -1
  11. package/cpp/HybridXlsxConditionalFormat.cpp +252 -0
  12. package/cpp/HybridXlsxConditionalFormat.hpp +62 -0
  13. package/cpp/HybridXlsxConditionalFormats.cpp +46 -0
  14. package/cpp/HybridXlsxConditionalFormats.hpp +28 -0
  15. package/cpp/HybridXlsxWorkbook.cpp +162 -87
  16. package/cpp/HybridXlsxWorkbook.hpp +7 -1
  17. package/cpp/HybridXlsxWorksheet.cpp +456 -61
  18. package/cpp/HybridXlsxWorksheet.hpp +73 -26
  19. package/cpp/XlsxCacheDir.cpp +76 -0
  20. package/cpp/XlsxCacheDir.hpp +27 -0
  21. package/cpp/XlsxError.hpp +68 -0
  22. package/cpp/XlsxJson.cpp +185 -0
  23. package/cpp/XlsxJson.hpp +36 -0
  24. package/ios/XlsxCacheDir.mm +60 -0
  25. package/nitrogen/generated/android/NitroXlsx+autolinking.cmake +2 -0
  26. package/nitrogen/generated/shared/c++/HybridNitroXlsxSpec.cpp +1 -0
  27. package/nitrogen/generated/shared/c++/HybridNitroXlsxSpec.hpp +5 -2
  28. package/nitrogen/generated/shared/c++/HybridXlsxConditionalFormatSpec.cpp +54 -0
  29. package/nitrogen/generated/shared/c++/HybridXlsxConditionalFormatSpec.hpp +95 -0
  30. package/nitrogen/generated/shared/c++/HybridXlsxConditionalFormatsSpec.cpp +24 -0
  31. package/nitrogen/generated/shared/c++/HybridXlsxConditionalFormatsSpec.hpp +68 -0
  32. package/nitrogen/generated/shared/c++/HybridXlsxWorkbookSpec.cpp +4 -0
  33. package/nitrogen/generated/shared/c++/HybridXlsxWorkbookSpec.hpp +7 -0
  34. package/nitrogen/generated/shared/c++/HybridXlsxWorksheetSpec.cpp +47 -19
  35. package/nitrogen/generated/shared/c++/HybridXlsxWorksheetSpec.hpp +52 -20
  36. package/package.json +5 -2
  37. package/scripts/prepare-openxlsx.js +126 -0
  38. package/scripts/run-cpp-tests.sh +14 -0
  39. package/src/__mocks__/react-native-nitro-modules.ts +1 -0
  40. package/src/__tests__/index.test.ts +76 -7
  41. package/src/index.ts +110 -9
  42. package/src/specs/NitroXlsx.nitro.ts +141 -42
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ ROOT="$(cd "$(dirname "$0")/.." && pwd)"
5
+ cd "$ROOT/cpp/tests"
6
+
7
+ if [ -z "${OPENXLSX_PATH:-}" ]; then
8
+ OPENXLSX_PATH="$ROOT/OpenXLSX"
9
+ fi
10
+
11
+ cmake -B build -DOPENXLSX_PATH="$OPENXLSX_PATH"
12
+ cmake --build build
13
+ cd build
14
+ ctest --output-on-failure
@@ -24,5 +24,6 @@ export const NitroModules = {
24
24
  createWorkbook: jest.fn(),
25
25
  openWorkbook: jest.fn(),
26
26
  openWorkbookFromBuffer: jest.fn(),
27
+ fromJSON: jest.fn(),
27
28
  }),
28
29
  };
@@ -10,7 +10,11 @@ import {
10
10
  Gridlines,
11
11
  Colors,
12
12
  NumFormat,
13
- ImagePosition,
13
+ XlsxError,
14
+ XlsxErrorCode,
15
+ CfType,
16
+ CfOperator,
17
+ CfTimePeriod,
14
18
  } from '../index';
15
19
 
16
20
  describe('NitroXlsx', () => {
@@ -33,6 +37,14 @@ describe('NitroXlsx', () => {
33
37
  expect(NitroXlsx.openWorkbookFromBuffer).toBeDefined();
34
38
  expect(typeof NitroXlsx.openWorkbookFromBuffer).toBe('function');
35
39
  });
40
+
41
+ it('should have fromJSON method that accepts a Record of sheet rows', () => {
42
+ expect(NitroXlsx.fromJSON).toBeDefined();
43
+ expect(typeof NitroXlsx.fromJSON).toBe('function');
44
+ expect(() =>
45
+ NitroXlsx.fromJSON({ Sheet1: [{ Name: 'Alice', Age: 30 }] })
46
+ ).not.toThrow();
47
+ });
36
48
  });
37
49
 
38
50
  describe('Constants', () => {
@@ -130,12 +142,69 @@ describe('Constants', () => {
130
142
  });
131
143
  });
132
144
 
133
- describe('ImagePosition', () => {
134
- it('should export ImagePosition constants', () => {
135
- expect(ImagePosition).toBeDefined();
136
- expect(ImagePosition.MOVE_AND_SIZE).toBe(1);
137
- expect(ImagePosition.MOVE_DONT_SIZE).toBe(2);
138
- expect(ImagePosition.DONT_MOVE_DONT_SIZE).toBe(3);
145
+ describe('CfType', () => {
146
+ it('should export CfType constants', () => {
147
+ expect(CfType).toBeDefined();
148
+ expect(CfType.EXPRESSION).toBe(0);
149
+ expect(CfType.CELL_IS).toBe(1);
150
+ expect(CfType.TOP10).toBe(5);
151
+ expect(CfType.CONTAINS_TEXT).toBe(8);
152
+ expect(CfType.TIME_PERIOD).toBe(16);
153
+ });
154
+ });
155
+
156
+ describe('CfOperator', () => {
157
+ it('should export CfOperator constants', () => {
158
+ expect(CfOperator).toBeDefined();
159
+ expect(CfOperator.LESS_THAN).toBe(0);
160
+ expect(CfOperator.EQUAL).toBe(2);
161
+ expect(CfOperator.GREATER_THAN).toBe(5);
162
+ expect(CfOperator.BETWEEN).toBe(6);
139
163
  });
140
164
  });
165
+
166
+ describe('CfTimePeriod', () => {
167
+ it('should export CfTimePeriod constants', () => {
168
+ expect(CfTimePeriod).toBeDefined();
169
+ expect(CfTimePeriod.TODAY).toBe(0);
170
+ expect(CfTimePeriod.YESTERDAY).toBe(1);
171
+ expect(CfTimePeriod.THIS_WEEK).toBe(7);
172
+ });
173
+ });
174
+ });
175
+
176
+ describe('XlsxError', () => {
177
+ it('should export XlsxErrorCode constants', () => {
178
+ expect(XlsxErrorCode.INVALID_ARGUMENT).toBe('INVALID_ARGUMENT');
179
+ expect(XlsxErrorCode.SHEET_NOT_FOUND).toBe('SHEET_NOT_FOUND');
180
+ expect(XlsxErrorCode.INDEX_OUT_OF_RANGE).toBe('INDEX_OUT_OF_RANGE');
181
+ expect(XlsxErrorCode.UNSUPPORTED).toBe('UNSUPPORTED');
182
+ expect(XlsxErrorCode.XLSX_ERROR).toBe('XLSX_ERROR');
183
+ });
184
+
185
+ it('should create XlsxError with code and message', () => {
186
+ const err = new XlsxError(XlsxErrorCode.SHEET_NOT_FOUND, 'Sheet missing');
187
+ expect(err).toBeInstanceOf(Error);
188
+ expect(err.name).toBe('XlsxError');
189
+ expect(err.code).toBe('SHEET_NOT_FOUND');
190
+ expect(err.message).toContain('SHEET_NOT_FOUND');
191
+ expect(err.message).toContain('Sheet missing');
192
+ });
193
+
194
+ it('should parse native error message into XlsxError', () => {
195
+ const native = new Error('deleteSheet: SHEET_NOT_FOUND: Worksheet not found: Foo');
196
+ const err = XlsxError.from(native);
197
+ expect(err.code).toBe('SHEET_NOT_FOUND');
198
+ expect(err.message).toContain('Worksheet not found: Foo');
199
+ });
200
+
201
+ it('should wrap unknown errors with INTERNAL_ERROR', () => {
202
+ const err = XlsxError.from(new Error('something odd'));
203
+ expect(err.code).toBe('INTERNAL_ERROR');
204
+ });
205
+
206
+ it('should return the same instance if already XlsxError', () => {
207
+ const original = new XlsxError(XlsxErrorCode.IO_ERROR, 'disk');
208
+ expect(XlsxError.from(original)).toBe(original);
209
+ });
141
210
  });
package/src/index.ts CHANGED
@@ -1,9 +1,117 @@
1
1
  import { NitroModules } from 'react-native-nitro-modules'
2
- import type { NitroXlsx as NitroXlsxSpec } from './specs/NitroXlsx.nitro'
2
+ import type {
3
+ NitroXlsx as NitroXlsxSpec
4
+ } from './specs/NitroXlsx.nitro'
3
5
 
4
6
  export const NitroXlsx = NitroModules.createHybridObject<NitroXlsxSpec>('NitroXlsx')
5
7
 
6
- export type { XlsxWorkbook, XlsxWorksheet, XlsxCellFormat } from './specs/NitroXlsx.nitro'
8
+ export type {
9
+ XlsxWorkbook,
10
+ XlsxWorksheet,
11
+ XlsxCellFormat,
12
+ XlsxConditionalFormat,
13
+ XlsxConditionalFormats,
14
+ CellType,
15
+ } from './specs/NitroXlsx.nitro'
16
+
17
+ /**
18
+ * Error codes emitted by the native layer.
19
+ * Native errors arrive as `Error` with message `methodName: CODE: detail`.
20
+ */
21
+ export const XlsxErrorCode = {
22
+ INVALID_ARGUMENT: 'INVALID_ARGUMENT',
23
+ SHEET_NOT_FOUND: 'SHEET_NOT_FOUND',
24
+ SHEET_EXISTS: 'SHEET_EXISTS',
25
+ INDEX_OUT_OF_RANGE: 'INDEX_OUT_OF_RANGE',
26
+ CELL_NOT_FOUND: 'CELL_NOT_FOUND',
27
+ WORKBOOK_CLOSED: 'WORKBOOK_CLOSED',
28
+ IO_ERROR: 'IO_ERROR',
29
+ UNSUPPORTED: 'UNSUPPORTED',
30
+ XLSX_ERROR: 'XLSX_ERROR',
31
+ INTERNAL_ERROR: 'INTERNAL_ERROR',
32
+ } as const
33
+
34
+ export type XlsxErrorCode = (typeof XlsxErrorCode)[keyof typeof XlsxErrorCode]
35
+
36
+ /**
37
+ * Structured XLSX error. Use `XlsxError.from(caught)` to convert a native throw.
38
+ */
39
+ export class XlsxError extends Error {
40
+ readonly code: XlsxErrorCode | string
41
+
42
+ constructor(code: XlsxErrorCode | string, message: string) {
43
+ super(`[${code}] ${message}`)
44
+ this.name = 'XlsxError'
45
+ this.code = code
46
+ }
47
+
48
+ /**
49
+ * Convert an error thrown by the native module into an XlsxError.
50
+ * Non-XLSX errors are wrapped with code INTERNAL_ERROR.
51
+ */
52
+ static from(error: unknown): XlsxError {
53
+ if (error instanceof XlsxError) return error
54
+ const message = error instanceof Error ? error.message : String(error)
55
+ // Nitro prefixes "methodName: " then our "CODE: detail"
56
+ const match = message.match(/(?:^|:\s*)([A-Z_]+):\s*(.*)$/)
57
+ if (match && match[1] && (Object.values(XlsxErrorCode) as string[]).includes(match[1])) {
58
+ return new XlsxError(match[1], match[2] ?? '')
59
+ }
60
+ return new XlsxError(XlsxErrorCode.INTERNAL_ERROR, message)
61
+ }
62
+ }
63
+
64
+ // Conditional formatting rule types (OpenXLSX XLCfType)
65
+ export const CfType = {
66
+ EXPRESSION: 0,
67
+ CELL_IS: 1,
68
+ COLOR_SCALE: 2,
69
+ DATA_BAR: 3,
70
+ ICON_SET: 4,
71
+ TOP10: 5,
72
+ UNIQUE_VALUES: 6,
73
+ DUPLICATE_VALUES: 7,
74
+ CONTAINS_TEXT: 8,
75
+ NOT_CONTAINS_TEXT: 9,
76
+ BEGINS_WITH: 10,
77
+ ENDS_WITH: 11,
78
+ CONTAINS_BLANKS: 12,
79
+ NOT_CONTAINS_BLANKS: 13,
80
+ CONTAINS_ERRORS: 14,
81
+ NOT_CONTAINS_ERRORS: 15,
82
+ TIME_PERIOD: 16,
83
+ ABOVE_AVERAGE: 17,
84
+ } as const
85
+
86
+ // Conditional formatting operators (OpenXLSX XLCfOperator)
87
+ export const CfOperator = {
88
+ LESS_THAN: 0,
89
+ LESS_THAN_OR_EQUAL: 1,
90
+ EQUAL: 2,
91
+ NOT_EQUAL: 3,
92
+ GREATER_THAN_OR_EQUAL: 4,
93
+ GREATER_THAN: 5,
94
+ BETWEEN: 6,
95
+ NOT_BETWEEN: 7,
96
+ CONTAINS_TEXT: 8,
97
+ NOT_CONTAINS: 9,
98
+ BEGINS_WITH: 10,
99
+ ENDS_WITH: 11,
100
+ } as const
101
+
102
+ // Conditional formatting time periods (OpenXLSX XLCfTimePeriod)
103
+ export const CfTimePeriod = {
104
+ TODAY: 0,
105
+ YESTERDAY: 1,
106
+ TOMORROW: 2,
107
+ LAST_7_DAYS: 3,
108
+ THIS_MONTH: 4,
109
+ LAST_MONTH: 5,
110
+ NEXT_MONTH: 6,
111
+ THIS_WEEK: 7,
112
+ LAST_WEEK: 8,
113
+ NEXT_WEEK: 9,
114
+ } as const
7
115
 
8
116
  // Cell alignment (based on OpenXLSX XLAlignmentStyle)
9
117
  export const Align = {
@@ -185,11 +293,4 @@ export const NumFormat = {
185
293
  TIME_4: 23,
186
294
  DATETIME: 22,
187
295
  TEXT: 49,
188
- } as const
189
-
190
- // Image object position
191
- export const ImagePosition = {
192
- MOVE_AND_SIZE: 1,
193
- MOVE_DONT_SIZE: 2,
194
- DONT_MOVE_DONT_SIZE: 3,
195
296
  } as const
@@ -1,4 +1,4 @@
1
- import { type HybridObject } from 'react-native-nitro-modules'
1
+ import { type HybridObject, type AnyMap } from 'react-native-nitro-modules'
2
2
 
3
3
  export type CellType = 'empty' | 'string' | 'number' | 'boolean' | 'date' | 'error' | 'formula' | 'blank'
4
4
 
@@ -8,8 +8,12 @@ export interface XlsxWorkbook extends HybridObject<{ ios: 'c++'; android: 'c++'
8
8
  getWorksheetByName(name: string): XlsxWorksheet
9
9
  getOrAddWorksheet(name: string): XlsxWorksheet
10
10
  getWorksheetCount(): number
11
+ deleteSheet(name: string): void
12
+ updateSheetName(oldName: string, newName: string): void
13
+ clone(existingName: string, newName: string): XlsxWorksheet
11
14
  addCellFormat(): XlsxCellFormat
12
15
  getBuffer(): Promise<ArrayBuffer>
16
+ toJSON(): Record<string, Array<AnyMap>>
13
17
  }
14
18
 
15
19
  export interface XlsxWorksheet extends HybridObject<{ ios: 'c++'; android: 'c++' }> {
@@ -18,73 +22,167 @@ export interface XlsxWorksheet extends HybridObject<{ ios: 'c++'; android: 'c++'
18
22
  writeNumber(row: number, col: number, value: number, format?: XlsxCellFormat): void
19
23
  writeBoolean(row: number, col: number, value: boolean, format?: XlsxCellFormat): void
20
24
  writeBlank(row: number, col: number, format?: XlsxCellFormat): void
21
-
25
+
22
26
  // Formula support
23
27
  writeFormula(row: number, col: number, formula: string, format?: XlsxCellFormat): void
24
28
  writeFormulaNum(row: number, col: number, formula: string, number: number, format?: XlsxCellFormat): void
25
29
  writeFormulaString(row: number, col: number, formula: string, str: string, format?: XlsxCellFormat): void
26
30
  writeFormulaBoolean(row: number, col: number, formula: string, boolVal: boolean, format?: XlsxCellFormat): void
27
31
  writeArrayFormula(firstRow: number, firstCol: number, lastRow: number, lastCol: number, formula: string, format?: XlsxCellFormat): void
28
-
32
+
29
33
  // Date/DateTime support
30
34
  writeDatetime(row: number, col: number, datetime: number, format?: XlsxCellFormat): void
31
35
  writeURL(row: number, col: number, url: string, format?: XlsxCellFormat): void
32
-
36
+
33
37
  // Column/Row operations
34
38
  setColumn(firstCol: number, lastCol: number, width: number, format?: XlsxCellFormat): void
35
39
  setRow(row: number, height: number, format?: XlsxCellFormat): void
36
-
40
+ deleteRow(row: number): boolean
41
+ deleteColumn(col: number): boolean
42
+
37
43
  // Merge cells
38
44
  mergeRange(firstRow: number, firstCol: number, lastRow: number, lastCol: number, value: string, format?: XlsxCellFormat): void
39
45
  mergeRangeNum(firstRow: number, firstCol: number, lastRow: number, lastCol: number, value: number, format?: XlsxCellFormat): void
40
-
41
- // Image (uses file path)
42
- insertImage(row: number, col: number, path: string, xOffset?: number, yOffset?: number, xScale?: number, yScale?: number): void
43
- insertImageBuffer(row: number, col: number, buffer: ArrayBuffer, extension: string, xOffset?: number, yOffset?: number, xScale?: number, yScale?: number): void
44
-
45
- // Autofilter
46
- autofilter(firstRow: number, firstCol: number, lastRow: number, lastCol: number): void
47
-
48
- // Freeze/Split panes
49
- freezePanes(row: number, col: number): void
50
- splitPanes(row: number, col: number): void
51
-
46
+ unmergeCells(firstRow: number, firstCol: number, lastRow: number, lastCol: number): void
47
+
52
48
  // Tab appearance
53
- setTabColor(color: number): void
54
49
  hide(): void
55
50
  activate(): void
56
- setFirstSheet(): void
51
+
52
+ // Sheet protection
57
53
  protect(password?: string): void
58
-
59
- // Page setup
60
- setPortrait(): void
61
- setLandscape(): void
62
- setPaper(paperType: number): void
63
- setHeader(header: string): void
64
- setFooter(footer: string): void
65
- setPrintArea(firstRow: number, firstCol: number, lastRow: number, lastCol: number): void
66
- fitToPages(width: number, height: number): void
67
- setZoom(scale: number): void
68
- setGridlines(option: number): void
69
- centerHorizontally(): void
70
- centerVertically(): void
71
-
54
+ protectSheet(set?: boolean): void
55
+ protectObjects(set?: boolean): void
56
+ protectScenarios(set?: boolean): void
57
+
58
+ // Password
59
+ setPassword(password: string): void
60
+ setPasswordHash(hash: string): void
61
+ clearPassword(): void
62
+ clearSheetProtection(): void
63
+
64
+ // Fine-grained permissions (allow*/deny* pairs)
65
+ allowInsertColumns(set?: boolean): void
66
+ allowInsertRows(set?: boolean): void
67
+ allowDeleteColumns(set?: boolean): void
68
+ allowDeleteRows(set?: boolean): void
69
+ allowSelectLockedCells(set?: boolean): void
70
+ allowSelectUnlockedCells(set?: boolean): void
71
+
72
+ denyInsertColumns(): void
73
+ denyInsertRows(): void
74
+ denyDeleteColumns(): void
75
+ denyDeleteRows(): void
76
+ denySelectLockedCells(): void
77
+ denySelectUnlockedCells(): void
78
+
79
+ // Protection state
80
+ sheetProtected(): boolean
81
+ objectsProtected(): boolean
82
+ scenariosProtected(): boolean
83
+ insertColumnsAllowed(): boolean
84
+ insertRowsAllowed(): boolean
85
+ deleteColumnsAllowed(): boolean
86
+ deleteRowsAllowed(): boolean
87
+ selectLockedCellsAllowed(): boolean
88
+ selectUnlockedCellsAllowed(): boolean
89
+ passwordIsSet(): boolean
90
+ passwordHash(): string
91
+ sheetProtectionSummary(): string
92
+
72
93
  // Outline/Grouping
73
- setOutline(level: number): void
74
94
  setColumnHidden(firstCol: number, lastCol: number, hidden: boolean): void
75
95
  setRowHidden(row: number, hidden: boolean): void
76
96
 
97
+ // Comments (XLComments)
98
+ setComment(row: number, col: number, text: string, authorId?: number): void
99
+ getComment(row: number, col: number): string
100
+ hasComment(row: number, col: number): boolean
101
+ deleteComment(row: number, col: number): boolean
102
+ getCommentCount(): number
103
+ addCommentAuthor(author: string): number
104
+ getCommentAuthor(authorId: number): string
105
+
106
+ // Conditional formatting (XLConditionalFormats)
107
+ getConditionalFormats(): XlsxConditionalFormats
108
+
77
109
  // Read methods
78
110
  getCellValue(row: number, col: number): string | number | boolean | null
79
111
  getCellString(row: number, col: number): string
80
112
  getCellRawValue(row: number, col: number): string
81
113
  getCellType(row: number, col: number): CellType
82
114
  getCellFormat(row: number, col: number): XlsxCellFormat
115
+ hasFormula(row: number, col: number): boolean
116
+ formula(row: number, col: number): string
117
+ findCell(row: number, col: number): boolean
83
118
  getRowCount(): number
84
119
  getColumnCount(): number
85
120
  getLastRow(): number
86
121
  getLastColumn(): number
87
122
  getName(): string
123
+
124
+ // JSON import / export for this worksheet
125
+ toJSON(keys?: string[]): Array<AnyMap>
126
+ fromJSON(data: Array<AnyMap>): void
127
+ }
128
+
129
+ /**
130
+ * A single <conditionalFormatting> entry: a cell range (sqref) plus its cfRules.
131
+ */
132
+ export interface XlsxConditionalFormat extends HybridObject<{ ios: 'c++'; android: 'c++' }> {
133
+ getSqref(): string
134
+ setSqref(sqref: string): void
135
+
136
+ // Rule collection
137
+ getRuleCount(): number
138
+ createRule(): number
139
+ deleteRule(index: number): boolean
140
+
141
+ // Rule type / dxf
142
+ getRuleType(index: number): number
143
+ setRuleType(index: number, type: number): void
144
+ getRuleDxfId(index: number): number
145
+ setRuleDxfId(index: number, dxfId: number): void
146
+
147
+ // Rule formula (supports up to 3 formulas: formula/formula2/formula3)
148
+ getRuleFormula(index: number, formulaIndex: number): string
149
+ setRuleFormula(index: number, formulaIndex: number, formula: string): void
150
+
151
+ // Rule attributes
152
+ getRuleOperator(index: number): number
153
+ setRuleOperator(index: number, op: number): void
154
+ getRuleText(index: number): string
155
+ setRuleText(index: number, text: string): void
156
+ getRulePriority(index: number): number
157
+ setRulePriority(index: number, priority: number): void
158
+ getRuleStopIfTrue(index: number): boolean
159
+ setRuleStopIfTrue(index: number, stop: boolean): void
160
+ getRuleTimePeriod(index: number): number
161
+ setRuleTimePeriod(index: number, period: number): void
162
+ getRuleRank(index: number): number
163
+ setRuleRank(index: number, rank: number): void
164
+ getRuleStdDev(index: number): number
165
+ setRuleStdDev(index: number, stdDev: number): void
166
+ getRuleAboveAverage(index: number): boolean
167
+ setRuleAboveAverage(index: number, set: boolean): void
168
+ getRulePercent(index: number): boolean
169
+ setRulePercent(index: number, set: boolean): void
170
+ getRuleBottom(index: number): boolean
171
+ setRuleBottom(index: number, set: boolean): void
172
+ getRuleEqualAverage(index: number): boolean
173
+ setRuleEqualAverage(index: number, set: boolean): void
174
+
175
+ summary(): string
176
+ }
177
+
178
+ /**
179
+ * All <conditionalFormatting> entries of a worksheet.
180
+ */
181
+ export interface XlsxConditionalFormats extends HybridObject<{ ios: 'c++'; android: 'c++' }> {
182
+ getCount(): number
183
+ create(sqref: string): XlsxConditionalFormat
184
+ getByIndex(index: number): XlsxConditionalFormat
185
+ summary(): string
88
186
  }
89
187
 
90
188
  export interface XlsxCellFormat extends HybridObject<{ ios: 'c++'; android: 'c++' }> {
@@ -97,7 +195,7 @@ export interface XlsxCellFormat extends HybridObject<{ ios: 'c++'; android: 'c++
97
195
  setItalic(): void
98
196
  setUnderline(style?: number): void
99
197
  setStrikeout(): void
100
-
198
+
101
199
  // Alignment
102
200
  setAlign(align: number): void
103
201
  setVerticalAlign(align: number): void
@@ -105,16 +203,16 @@ export interface XlsxCellFormat extends HybridObject<{ ios: 'c++'; android: 'c++
105
203
  setRotation(angle: number): void
106
204
  setIndent(level: number): void
107
205
  setShrink(): void
108
-
206
+
109
207
  // Number format
110
208
  setNumFormat(format: string): void
111
209
  setNumFormatIndex(index: number): void
112
-
210
+
113
211
  // Colors/Pattern
114
212
  setBgColor(color: number): void
115
213
  setFgColor(color: number): void
116
214
  setPattern(pattern: number): void
117
-
215
+
118
216
  // Borders
119
217
  setBorder(style: number): void
120
218
  setBorderColor(color: number): void
@@ -128,11 +226,11 @@ export interface XlsxCellFormat extends HybridObject<{ ios: 'c++'; android: 'c++
128
226
  setRightColor(color: number): void
129
227
  setDiagonal(style: number): void
130
228
  setDiagonalColor(color: number): void
131
-
229
+
132
230
  // Protection
133
231
  setLocked(): void
134
232
  setUnlocked(): void
135
-
233
+
136
234
  // Other
137
235
  setHyperlink(): void
138
236
  setFontOnly(): void
@@ -148,7 +246,8 @@ export interface XlsxCellFormat extends HybridObject<{ ios: 'c++'; android: 'c++
148
246
  }
149
247
 
150
248
  export interface NitroXlsx extends HybridObject<{ ios: 'c++'; android: 'c++' }> {
151
- createWorkbook(tempDir?: string): XlsxWorkbook
249
+ createWorkbook(): XlsxWorkbook
152
250
  openWorkbook(path: string): XlsxWorkbook
153
251
  openWorkbookFromBuffer(buffer: ArrayBuffer): XlsxWorkbook
154
- }
252
+ fromJSON(data: Record<string, Array<AnyMap>>): XlsxWorkbook
253
+ }