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.
- package/NitroXlsx.podspec +1 -0
- package/Package.swift +6 -2
- package/README.md +219 -57
- package/android/CMakeLists.txt +4 -0
- package/android/cpp-adapter.cpp +12 -0
- package/android/src/main/java/com/margelo/nitro/xlsx/NitroXlsxPackage.kt +9 -0
- package/cpp/HybridNitroXlsx.cpp +25 -179
- package/cpp/HybridNitroXlsx.hpp +2 -2
- package/cpp/HybridXlsxConditionalFormat.cpp +252 -0
- package/cpp/HybridXlsxConditionalFormat.hpp +62 -0
- package/cpp/HybridXlsxConditionalFormats.cpp +46 -0
- package/cpp/HybridXlsxConditionalFormats.hpp +28 -0
- package/cpp/HybridXlsxWorkbook.cpp +159 -196
- package/cpp/HybridXlsxWorkbook.hpp +7 -2
- package/cpp/HybridXlsxWorksheet.cpp +433 -62
- package/cpp/HybridXlsxWorksheet.hpp +73 -26
- package/cpp/XlsxCacheDir.cpp +76 -0
- package/cpp/XlsxCacheDir.hpp +27 -0
- package/cpp/XlsxError.hpp +68 -0
- package/cpp/XlsxJson.cpp +185 -0
- package/cpp/XlsxJson.hpp +36 -0
- package/ios/XlsxCacheDir.mm +60 -0
- package/nitrogen/generated/android/NitroXlsx+autolinking.cmake +2 -0
- package/nitrogen/generated/shared/c++/HybridNitroXlsxSpec.hpp +5 -3
- package/nitrogen/generated/shared/c++/HybridXlsxConditionalFormatSpec.cpp +54 -0
- package/nitrogen/generated/shared/c++/HybridXlsxConditionalFormatSpec.hpp +95 -0
- package/nitrogen/generated/shared/c++/HybridXlsxConditionalFormatsSpec.cpp +24 -0
- package/nitrogen/generated/shared/c++/HybridXlsxConditionalFormatsSpec.hpp +68 -0
- package/nitrogen/generated/shared/c++/HybridXlsxWorkbookSpec.cpp +3 -0
- package/nitrogen/generated/shared/c++/HybridXlsxWorkbookSpec.hpp +6 -1
- package/nitrogen/generated/shared/c++/HybridXlsxWorksheetSpec.cpp +47 -19
- package/nitrogen/generated/shared/c++/HybridXlsxWorksheetSpec.hpp +52 -20
- package/package.json +2 -2
- package/scripts/prepare-openxlsx.js +23 -6
- package/scripts/run-cpp-tests.sh +14 -0
- package/src/__mocks__/react-native-nitro-modules.ts +1 -0
- package/src/__tests__/index.test.ts +76 -7
- package/src/index.ts +107 -18
- package/src/specs/NitroXlsx.nitro.ts +141 -44
- package/ios/dummy.swift +0 -2
|
@@ -10,7 +10,11 @@ import {
|
|
|
10
10
|
Gridlines,
|
|
11
11
|
Colors,
|
|
12
12
|
NumFormat,
|
|
13
|
-
|
|
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('
|
|
134
|
-
it('should export
|
|
135
|
-
expect(
|
|
136
|
-
expect(
|
|
137
|
-
expect(
|
|
138
|
-
expect(
|
|
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 {
|
|
2
|
+
import type {
|
|
3
|
+
NitroXlsx as NitroXlsxSpec
|
|
4
|
+
} from './specs/NitroXlsx.nitro'
|
|
3
5
|
|
|
4
|
-
const
|
|
6
|
+
export const NitroXlsx = NitroModules.createHybridObject<NitroXlsxSpec>('NitroXlsx')
|
|
5
7
|
|
|
6
|
-
type
|
|
8
|
+
export type {
|
|
9
|
+
XlsxWorkbook,
|
|
10
|
+
XlsxWorksheet,
|
|
11
|
+
XlsxCellFormat,
|
|
12
|
+
XlsxConditionalFormat,
|
|
13
|
+
XlsxConditionalFormats,
|
|
14
|
+
CellType,
|
|
15
|
+
} from './specs/NitroXlsx.nitro'
|
|
7
16
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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
|
-
|
|
15
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
51
|
+
|
|
52
|
+
// Sheet protection
|
|
58
53
|
protect(password?: string): void
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
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(
|
|
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