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.
- package/NOTICE +8 -35
- package/NitroXlsx.podspec +21 -57
- package/Package.swift +35 -0
- package/README.md +243 -36
- package/android/CMakeLists.txt +17 -23
- package/android/build.gradle +6 -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 +32 -9
- package/cpp/HybridNitroXlsx.hpp +2 -1
- 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 +162 -87
- package/cpp/HybridXlsxWorkbook.hpp +7 -1
- package/cpp/HybridXlsxWorksheet.cpp +456 -61
- 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.cpp +1 -0
- package/nitrogen/generated/shared/c++/HybridNitroXlsxSpec.hpp +5 -2
- 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 +4 -0
- package/nitrogen/generated/shared/c++/HybridXlsxWorkbookSpec.hpp +7 -0
- package/nitrogen/generated/shared/c++/HybridXlsxWorksheetSpec.cpp +47 -19
- package/nitrogen/generated/shared/c++/HybridXlsxWorksheetSpec.hpp +52 -20
- package/package.json +5 -2
- package/scripts/prepare-openxlsx.js +126 -0
- 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 +110 -9
- 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
|
|
@@ -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,9 +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
6
|
export const NitroXlsx = NitroModules.createHybridObject<NitroXlsxSpec>('NitroXlsx')
|
|
5
7
|
|
|
6
|
-
export type {
|
|
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
|
-
|
|
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
|
-
|
|
51
|
+
|
|
52
|
+
// Sheet protection
|
|
57
53
|
protect(password?: string): void
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
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(
|
|
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
|
+
}
|