react-native-nitro-xlsx 0.1.4 → 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 (40) hide show
  1. package/NitroXlsx.podspec +1 -0
  2. package/Package.swift +6 -2
  3. package/README.md +219 -57
  4. package/android/CMakeLists.txt +4 -0
  5. package/android/cpp-adapter.cpp +12 -0
  6. package/android/src/main/java/com/margelo/nitro/xlsx/NitroXlsxPackage.kt +9 -0
  7. package/cpp/HybridNitroXlsx.cpp +25 -179
  8. package/cpp/HybridNitroXlsx.hpp +2 -2
  9. package/cpp/HybridXlsxConditionalFormat.cpp +252 -0
  10. package/cpp/HybridXlsxConditionalFormat.hpp +62 -0
  11. package/cpp/HybridXlsxConditionalFormats.cpp +46 -0
  12. package/cpp/HybridXlsxConditionalFormats.hpp +28 -0
  13. package/cpp/HybridXlsxWorkbook.cpp +159 -196
  14. package/cpp/HybridXlsxWorkbook.hpp +7 -2
  15. package/cpp/HybridXlsxWorksheet.cpp +433 -62
  16. package/cpp/HybridXlsxWorksheet.hpp +73 -26
  17. package/cpp/XlsxCacheDir.cpp +76 -0
  18. package/cpp/XlsxCacheDir.hpp +27 -0
  19. package/cpp/XlsxError.hpp +68 -0
  20. package/cpp/XlsxJson.cpp +185 -0
  21. package/cpp/XlsxJson.hpp +36 -0
  22. package/ios/XlsxCacheDir.mm +60 -0
  23. package/nitrogen/generated/android/NitroXlsx+autolinking.cmake +2 -0
  24. package/nitrogen/generated/shared/c++/HybridNitroXlsxSpec.hpp +5 -3
  25. package/nitrogen/generated/shared/c++/HybridXlsxConditionalFormatSpec.cpp +54 -0
  26. package/nitrogen/generated/shared/c++/HybridXlsxConditionalFormatSpec.hpp +95 -0
  27. package/nitrogen/generated/shared/c++/HybridXlsxConditionalFormatsSpec.cpp +24 -0
  28. package/nitrogen/generated/shared/c++/HybridXlsxConditionalFormatsSpec.hpp +68 -0
  29. package/nitrogen/generated/shared/c++/HybridXlsxWorkbookSpec.cpp +3 -0
  30. package/nitrogen/generated/shared/c++/HybridXlsxWorkbookSpec.hpp +6 -1
  31. package/nitrogen/generated/shared/c++/HybridXlsxWorksheetSpec.cpp +47 -19
  32. package/nitrogen/generated/shared/c++/HybridXlsxWorksheetSpec.hpp +52 -20
  33. package/package.json +2 -2
  34. package/scripts/prepare-openxlsx.js +23 -6
  35. package/scripts/run-cpp-tests.sh +14 -0
  36. package/src/__mocks__/react-native-nitro-modules.ts +1 -0
  37. package/src/__tests__/index.test.ts +76 -7
  38. package/src/index.ts +107 -18
  39. package/src/specs/NitroXlsx.nitro.ts +141 -44
  40. package/ios/dummy.swift +0 -2
@@ -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,21 +1,117 @@
1
1
  import { NitroModules } from 'react-native-nitro-modules'
2
- import type { NitroXlsx as NitroXlsxSpec, XlsxWorkbook as XlsxWorkbookSpec } from './specs/NitroXlsx.nitro'
2
+ import type {
3
+ NitroXlsx as NitroXlsxSpec
4
+ } from './specs/NitroXlsx.nitro'
3
5
 
4
- const NitroXlsxBridge = NitroModules.createHybridObject<NitroXlsxSpec>('NitroXlsx')
6
+ export const NitroXlsx = NitroModules.createHybridObject<NitroXlsxSpec>('NitroXlsx')
5
7
 
6
- type JsonRecord = Record<string, string | number>
8
+ export type {
9
+ XlsxWorkbook,
10
+ XlsxWorksheet,
11
+ XlsxCellFormat,
12
+ XlsxConditionalFormat,
13
+ XlsxConditionalFormats,
14
+ CellType,
15
+ } from './specs/NitroXlsx.nitro'
7
16
 
8
- export const NitroXlsx = Object.assign(NitroXlsxBridge, {
9
- fromJSON(data: JsonRecord[]): XlsxWorkbookSpec {
10
- return NitroXlsxBridge.fromJSON(JSON.stringify(data))
11
- },
12
- })
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
13
41
 
14
- export function toJSON(workbook: XlsxWorkbookSpec, keys?: string[]): JsonRecord[] {
15
- return JSON.parse(workbook.toJSON(keys))
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
+ }
16
62
  }
17
63
 
18
- export type { XlsxWorkbook, XlsxWorksheet, XlsxCellFormat } from './specs/NitroXlsx.nitro'
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
19
115
 
20
116
  // Cell alignment (based on OpenXLSX XLAlignmentStyle)
21
117
  export const Align = {
@@ -197,11 +293,4 @@ export const NumFormat = {
197
293
  TIME_4: 23,
198
294
  DATETIME: 22,
199
295
  TEXT: 49,
200
- } as const
201
-
202
- // Image object position
203
- export const ImagePosition = {
204
- MOVE_AND_SIZE: 1,
205
- MOVE_DONT_SIZE: 2,
206
- DONT_MOVE_DONT_SIZE: 3,
207
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,9 +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>
13
- toJSON(keys?: string[]): string
16
+ toJSON(): Record<string, Array<AnyMap>>
14
17
  }
15
18
 
16
19
  export interface XlsxWorksheet extends HybridObject<{ ios: 'c++'; android: 'c++' }> {
@@ -19,73 +22,167 @@ export interface XlsxWorksheet extends HybridObject<{ ios: 'c++'; android: 'c++'
19
22
  writeNumber(row: number, col: number, value: number, format?: XlsxCellFormat): void
20
23
  writeBoolean(row: number, col: number, value: boolean, format?: XlsxCellFormat): void
21
24
  writeBlank(row: number, col: number, format?: XlsxCellFormat): void
22
-
25
+
23
26
  // Formula support
24
27
  writeFormula(row: number, col: number, formula: string, format?: XlsxCellFormat): void
25
28
  writeFormulaNum(row: number, col: number, formula: string, number: number, format?: XlsxCellFormat): void
26
29
  writeFormulaString(row: number, col: number, formula: string, str: string, format?: XlsxCellFormat): void
27
30
  writeFormulaBoolean(row: number, col: number, formula: string, boolVal: boolean, format?: XlsxCellFormat): void
28
31
  writeArrayFormula(firstRow: number, firstCol: number, lastRow: number, lastCol: number, formula: string, format?: XlsxCellFormat): void
29
-
32
+
30
33
  // Date/DateTime support
31
34
  writeDatetime(row: number, col: number, datetime: number, format?: XlsxCellFormat): void
32
35
  writeURL(row: number, col: number, url: string, format?: XlsxCellFormat): void
33
-
36
+
34
37
  // Column/Row operations
35
38
  setColumn(firstCol: number, lastCol: number, width: number, format?: XlsxCellFormat): void
36
39
  setRow(row: number, height: number, format?: XlsxCellFormat): void
37
-
40
+ deleteRow(row: number): boolean
41
+ deleteColumn(col: number): boolean
42
+
38
43
  // Merge cells
39
44
  mergeRange(firstRow: number, firstCol: number, lastRow: number, lastCol: number, value: string, format?: XlsxCellFormat): void
40
45
  mergeRangeNum(firstRow: number, firstCol: number, lastRow: number, lastCol: number, value: number, format?: XlsxCellFormat): void
41
-
42
- // Image (uses file path)
43
- insertImage(row: number, col: number, path: string, xOffset?: number, yOffset?: number, xScale?: number, yScale?: number): void
44
- insertImageBuffer(row: number, col: number, buffer: ArrayBuffer, extension: string, xOffset?: number, yOffset?: number, xScale?: number, yScale?: number): void
45
-
46
- // Autofilter
47
- autofilter(firstRow: number, firstCol: number, lastRow: number, lastCol: number): void
48
-
49
- // Freeze/Split panes
50
- freezePanes(row: number, col: number): void
51
- splitPanes(row: number, col: number): void
52
-
46
+ unmergeCells(firstRow: number, firstCol: number, lastRow: number, lastCol: number): void
47
+
53
48
  // Tab appearance
54
- setTabColor(color: number): void
55
49
  hide(): void
56
50
  activate(): void
57
- setFirstSheet(): void
51
+
52
+ // Sheet protection
58
53
  protect(password?: string): void
59
-
60
- // Page setup
61
- setPortrait(): void
62
- setLandscape(): void
63
- setPaper(paperType: number): void
64
- setHeader(header: string): void
65
- setFooter(footer: string): void
66
- setPrintArea(firstRow: number, firstCol: number, lastRow: number, lastCol: number): void
67
- fitToPages(width: number, height: number): void
68
- setZoom(scale: number): void
69
- setGridlines(option: number): void
70
- centerHorizontally(): void
71
- centerVertically(): void
72
-
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
+
73
93
  // Outline/Grouping
74
- setOutline(level: number): void
75
94
  setColumnHidden(firstCol: number, lastCol: number, hidden: boolean): void
76
95
  setRowHidden(row: number, hidden: boolean): void
77
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
+
78
109
  // Read methods
79
110
  getCellValue(row: number, col: number): string | number | boolean | null
80
111
  getCellString(row: number, col: number): string
81
112
  getCellRawValue(row: number, col: number): string
82
113
  getCellType(row: number, col: number): CellType
83
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
84
118
  getRowCount(): number
85
119
  getColumnCount(): number
86
120
  getLastRow(): number
87
121
  getLastColumn(): number
88
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
89
186
  }
90
187
 
91
188
  export interface XlsxCellFormat extends HybridObject<{ ios: 'c++'; android: 'c++' }> {
@@ -98,7 +195,7 @@ export interface XlsxCellFormat extends HybridObject<{ ios: 'c++'; android: 'c++
98
195
  setItalic(): void
99
196
  setUnderline(style?: number): void
100
197
  setStrikeout(): void
101
-
198
+
102
199
  // Alignment
103
200
  setAlign(align: number): void
104
201
  setVerticalAlign(align: number): void
@@ -106,16 +203,16 @@ export interface XlsxCellFormat extends HybridObject<{ ios: 'c++'; android: 'c++
106
203
  setRotation(angle: number): void
107
204
  setIndent(level: number): void
108
205
  setShrink(): void
109
-
206
+
110
207
  // Number format
111
208
  setNumFormat(format: string): void
112
209
  setNumFormatIndex(index: number): void
113
-
210
+
114
211
  // Colors/Pattern
115
212
  setBgColor(color: number): void
116
213
  setFgColor(color: number): void
117
214
  setPattern(pattern: number): void
118
-
215
+
119
216
  // Borders
120
217
  setBorder(style: number): void
121
218
  setBorderColor(color: number): void
@@ -129,11 +226,11 @@ export interface XlsxCellFormat extends HybridObject<{ ios: 'c++'; android: 'c++
129
226
  setRightColor(color: number): void
130
227
  setDiagonal(style: number): void
131
228
  setDiagonalColor(color: number): void
132
-
229
+
133
230
  // Protection
134
231
  setLocked(): void
135
232
  setUnlocked(): void
136
-
233
+
137
234
  // Other
138
235
  setHyperlink(): void
139
236
  setFontOnly(): void
@@ -149,8 +246,8 @@ export interface XlsxCellFormat extends HybridObject<{ ios: 'c++'; android: 'c++
149
246
  }
150
247
 
151
248
  export interface NitroXlsx extends HybridObject<{ ios: 'c++'; android: 'c++' }> {
152
- createWorkbook(tempDir?: string): XlsxWorkbook
249
+ createWorkbook(): XlsxWorkbook
153
250
  openWorkbook(path: string): XlsxWorkbook
154
251
  openWorkbookFromBuffer(buffer: ArrayBuffer): XlsxWorkbook
155
- fromJSON(data: string): XlsxWorkbook
156
- }
252
+ fromJSON(data: Record<string, Array<AnyMap>>): XlsxWorkbook
253
+ }
package/ios/dummy.swift DELETED
@@ -1,2 +0,0 @@
1
- // This file exists solely so that SwiftPM has at least one source file
2
- // for the NitroXlsx target. The actual build is done via CocoaPods.