react-native-nitro-xlsx 0.1.1
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/LICENSE +21 -0
- package/NOTICE +73 -0
- package/NitroXlsx.podspec +110 -0
- package/README.md +340 -0
- package/android/CMakeLists.txt +52 -0
- package/android/build.gradle +49 -0
- package/android/cpp-adapter.cpp +9 -0
- package/android/src/main/AndroidManifest.xml +2 -0
- package/android/src/main/java/com/margelo/nitro/xlsx/NitroXlsxPackage.kt +22 -0
- package/cpp/HybridNitroXlsx.cpp +29 -0
- package/cpp/HybridNitroXlsx.hpp +19 -0
- package/cpp/HybridXlsxCellFormat.cpp +263 -0
- package/cpp/HybridXlsxCellFormat.hpp +111 -0
- package/cpp/HybridXlsxWorkbook.cpp +184 -0
- package/cpp/HybridXlsxWorkbook.hpp +41 -0
- package/cpp/HybridXlsxWorksheet.cpp +316 -0
- package/cpp/HybridXlsxWorksheet.hpp +86 -0
- package/nitro.json +19 -0
- package/nitrogen/generated/.gitattributes +1 -0
- package/nitrogen/generated/android/NitroXlsx+autolinking.cmake +84 -0
- package/nitrogen/generated/android/NitroXlsx+autolinking.gradle +27 -0
- package/nitrogen/generated/android/NitroXlsxOnLoad.cpp +49 -0
- package/nitrogen/generated/android/NitroXlsxOnLoad.hpp +34 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/xlsx/NitroXlsxOnLoad.kt +35 -0
- package/nitrogen/generated/ios/NitroXlsx+autolinking.rb +62 -0
- package/nitrogen/generated/ios/NitroXlsx-Swift-Cxx-Bridge.cpp +17 -0
- package/nitrogen/generated/ios/NitroXlsx-Swift-Cxx-Bridge.hpp +27 -0
- package/nitrogen/generated/ios/NitroXlsx-Swift-Cxx-Umbrella.hpp +38 -0
- package/nitrogen/generated/ios/NitroXlsxAutolinking.mm +35 -0
- package/nitrogen/generated/ios/NitroXlsxAutolinking.swift +16 -0
- package/nitrogen/generated/shared/c++/CellType.hpp +100 -0
- package/nitrogen/generated/shared/c++/HybridNitroXlsxSpec.cpp +23 -0
- package/nitrogen/generated/shared/c++/HybridNitroXlsxSpec.hpp +68 -0
- package/nitrogen/generated/shared/c++/HybridXlsxCellFormatSpec.cpp +62 -0
- package/nitrogen/generated/shared/c++/HybridXlsxCellFormatSpec.hpp +104 -0
- package/nitrogen/generated/shared/c++/HybridXlsxWorkbookSpec.cpp +27 -0
- package/nitrogen/generated/shared/c++/HybridXlsxWorkbookSpec.hpp +77 -0
- package/nitrogen/generated/shared/c++/HybridXlsxWorksheetSpec.cpp +69 -0
- package/nitrogen/generated/shared/c++/HybridXlsxWorksheetSpec.hpp +120 -0
- package/package.json +47 -0
- package/src/__mocks__/react-native-nitro-modules.ts +28 -0
- package/src/__mocks__/react-native.ts +1 -0
- package/src/__tests__/index.test.ts +141 -0
- package/src/index.ts +195 -0
- package/src/specs/NitroXlsx.nitro.ts +154 -0
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
#include "HybridXlsxWorksheet.hpp"
|
|
2
|
+
#include <cstring>
|
|
3
|
+
#include <fstream>
|
|
4
|
+
#include <chrono>
|
|
5
|
+
|
|
6
|
+
namespace margelo::nitro::xlsx {
|
|
7
|
+
|
|
8
|
+
HybridXlsxWorksheet::HybridXlsxWorksheet(OpenXLSX::XLDocument& doc, OpenXLSX::XLWorksheet worksheet)
|
|
9
|
+
: HybridObject("XlsxWorksheet"), HybridXlsxWorksheetSpec(), _doc(doc), _worksheet(worksheet) {
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
HybridXlsxWorksheet::~HybridXlsxWorksheet() {
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
void HybridXlsxWorksheet::applyFormat(OpenXLSX::XLCell& cell, const std::optional<std::shared_ptr<HybridXlsxCellFormatSpec>>& format) {
|
|
16
|
+
if (!format.has_value()) return;
|
|
17
|
+
|
|
18
|
+
auto hybridFormat = std::dynamic_pointer_cast<HybridXlsxCellFormat>(*format);
|
|
19
|
+
if (!hybridFormat) return;
|
|
20
|
+
|
|
21
|
+
auto styleIndex = hybridFormat->applyToDocument(_doc.styles());
|
|
22
|
+
hybridFormat->applyToCell(cell, styleIndex);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
void HybridXlsxWorksheet::writeString(double row, double col, const std::string& value, const std::optional<std::shared_ptr<HybridXlsxCellFormatSpec>>& format) {
|
|
26
|
+
OpenXLSX::XLCell cell = _worksheet.cell(static_cast<unsigned int>(row), static_cast<unsigned int>(col));
|
|
27
|
+
cell.value() = value;
|
|
28
|
+
applyFormat(cell, format);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
void HybridXlsxWorksheet::writeNumber(double row, double col, double value, const std::optional<std::shared_ptr<HybridXlsxCellFormatSpec>>& format) {
|
|
32
|
+
OpenXLSX::XLCell cell = _worksheet.cell(static_cast<unsigned int>(row), static_cast<unsigned int>(col));
|
|
33
|
+
cell.value() = value;
|
|
34
|
+
applyFormat(cell, format);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
void HybridXlsxWorksheet::writeBoolean(double row, double col, bool value, const std::optional<std::shared_ptr<HybridXlsxCellFormatSpec>>& format) {
|
|
38
|
+
OpenXLSX::XLCell cell = _worksheet.cell(static_cast<unsigned int>(row), static_cast<unsigned int>(col));
|
|
39
|
+
cell.value() = value;
|
|
40
|
+
applyFormat(cell, format);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
void HybridXlsxWorksheet::writeBlank(double row, double col, const std::optional<std::shared_ptr<HybridXlsxCellFormatSpec>>& format) {
|
|
44
|
+
OpenXLSX::XLCell cell = _worksheet.cell(static_cast<unsigned int>(row), static_cast<unsigned int>(col));
|
|
45
|
+
applyFormat(cell, format);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
void HybridXlsxWorksheet::writeFormula(double row, double col, const std::string& formula, const std::optional<std::shared_ptr<HybridXlsxCellFormatSpec>>& format) {
|
|
49
|
+
OpenXLSX::XLCell cell = _worksheet.cell(static_cast<unsigned int>(row), static_cast<unsigned int>(col));
|
|
50
|
+
cell.formula() = formula;
|
|
51
|
+
applyFormat(cell, format);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
void HybridXlsxWorksheet::writeFormulaNum(double row, double col, const std::string& formula, double number, const std::optional<std::shared_ptr<HybridXlsxCellFormatSpec>>& format) {
|
|
55
|
+
OpenXLSX::XLCell cell = _worksheet.cell(static_cast<unsigned int>(row), static_cast<unsigned int>(col));
|
|
56
|
+
cell.formula() = formula;
|
|
57
|
+
cell.value() = number;
|
|
58
|
+
applyFormat(cell, format);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
void HybridXlsxWorksheet::writeFormulaString(double row, double col, const std::string& formula, const std::string& str, const std::optional<std::shared_ptr<HybridXlsxCellFormatSpec>>& format) {
|
|
62
|
+
OpenXLSX::XLCell cell = _worksheet.cell(static_cast<unsigned int>(row), static_cast<unsigned int>(col));
|
|
63
|
+
cell.formula() = formula;
|
|
64
|
+
cell.value() = str;
|
|
65
|
+
applyFormat(cell, format);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
void HybridXlsxWorksheet::writeFormulaBoolean(double row, double col, const std::string& formula, bool boolVal, const std::optional<std::shared_ptr<HybridXlsxCellFormatSpec>>& format) {
|
|
69
|
+
OpenXLSX::XLCell cell = _worksheet.cell(static_cast<unsigned int>(row), static_cast<unsigned int>(col));
|
|
70
|
+
cell.formula() = formula;
|
|
71
|
+
cell.value() = boolVal;
|
|
72
|
+
applyFormat(cell, format);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
void HybridXlsxWorksheet::writeArrayFormula(double firstRow, double firstCol, double lastRow, double lastCol, const std::string& formula, const std::optional<std::shared_ptr<HybridXlsxCellFormatSpec>>& format) {
|
|
76
|
+
OpenXLSX::XLCell cell = _worksheet.cell(static_cast<unsigned int>(firstRow), static_cast<unsigned int>(firstCol));
|
|
77
|
+
cell.formula() = formula;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
void HybridXlsxWorksheet::writeDatetime(double row, double col, double datetime, const std::optional<std::shared_ptr<HybridXlsxCellFormatSpec>>& format) {
|
|
81
|
+
OpenXLSX::XLCell cell = _worksheet.cell(static_cast<unsigned int>(row), static_cast<unsigned int>(col));
|
|
82
|
+
cell.value() = datetime;
|
|
83
|
+
applyFormat(cell, format);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
void HybridXlsxWorksheet::writeURL(double row, double col, const std::string& url, const std::optional<std::shared_ptr<HybridXlsxCellFormatSpec>>& format) {
|
|
87
|
+
OpenXLSX::XLCell cell = _worksheet.cell(static_cast<unsigned int>(row), static_cast<unsigned int>(col));
|
|
88
|
+
cell.value() = url;
|
|
89
|
+
applyFormat(cell, format);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
void HybridXlsxWorksheet::setColumn(double firstCol, double lastCol, double width, const std::optional<std::shared_ptr<HybridXlsxCellFormatSpec>>& format) {
|
|
93
|
+
for (unsigned int c = static_cast<unsigned int>(firstCol); c <= static_cast<unsigned int>(lastCol); ++c) {
|
|
94
|
+
_worksheet.column(c).setWidth(static_cast<float>(width));
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
void HybridXlsxWorksheet::setRow(double row, double height, const std::optional<std::shared_ptr<HybridXlsxCellFormatSpec>>& format) {
|
|
99
|
+
_worksheet.row(static_cast<unsigned int>(row)).setHeight(static_cast<float>(height));
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
void HybridXlsxWorksheet::mergeRange(double firstRow, double firstCol, double lastRow, double lastCol, const std::string& value, const std::optional<std::shared_ptr<HybridXlsxCellFormatSpec>>& format) {
|
|
103
|
+
OpenXLSX::XLCellReference topLeft(static_cast<unsigned int>(firstRow), static_cast<unsigned int>(firstCol));
|
|
104
|
+
OpenXLSX::XLCellReference bottomRight(static_cast<unsigned int>(lastRow), static_cast<unsigned int>(lastCol));
|
|
105
|
+
OpenXLSX::XLCellRange range = _worksheet.range(topLeft, bottomRight);
|
|
106
|
+
_worksheet.mergeCells(range);
|
|
107
|
+
_worksheet.cell(static_cast<unsigned int>(firstRow), static_cast<unsigned int>(firstCol)).value() = value;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
void HybridXlsxWorksheet::mergeRangeNum(double firstRow, double firstCol, double lastRow, double lastCol, double value, const std::optional<std::shared_ptr<HybridXlsxCellFormatSpec>>& format) {
|
|
111
|
+
OpenXLSX::XLCellReference topLeft(static_cast<unsigned int>(firstRow), static_cast<unsigned int>(firstCol));
|
|
112
|
+
OpenXLSX::XLCellReference bottomRight(static_cast<unsigned int>(lastRow), static_cast<unsigned int>(lastCol));
|
|
113
|
+
OpenXLSX::XLCellRange range = _worksheet.range(topLeft, bottomRight);
|
|
114
|
+
_worksheet.mergeCells(range);
|
|
115
|
+
_worksheet.cell(static_cast<unsigned int>(firstRow), static_cast<unsigned int>(firstCol)).value() = value;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
void HybridXlsxWorksheet::insertImage(double row, double col, const std::string& path, std::optional<double> xOffset, std::optional<double> yOffset, std::optional<double> xScale, std::optional<double> yScale) {
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
void HybridXlsxWorksheet::insertImageBuffer(double row, double col, const std::shared_ptr<ArrayBuffer>& buffer, const std::string& extension, std::optional<double> xOffset, std::optional<double> yOffset, std::optional<double> xScale, std::optional<double> yScale) {
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
void HybridXlsxWorksheet::autofilter(double firstRow, double firstCol, double lastRow, double lastCol) {
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
void HybridXlsxWorksheet::freezePanes(double row, double col) {
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
void HybridXlsxWorksheet::splitPanes(double row, double col) {
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
void HybridXlsxWorksheet::setTabColor(double color) {
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
void HybridXlsxWorksheet::hide() {
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
void HybridXlsxWorksheet::activate() {
|
|
140
|
+
_worksheet.setActive();
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
void HybridXlsxWorksheet::setFirstSheet() {
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
void HybridXlsxWorksheet::protect(const std::optional<std::string>& password) {
|
|
147
|
+
if (password.has_value() && !password->empty()) {
|
|
148
|
+
_worksheet.setPassword(*password);
|
|
149
|
+
}
|
|
150
|
+
_worksheet.protectSheet();
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
void HybridXlsxWorksheet::setPortrait() {
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
void HybridXlsxWorksheet::setLandscape() {
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
void HybridXlsxWorksheet::setPaper(double paperType) {
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
void HybridXlsxWorksheet::setHeader(const std::string& header) {
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
void HybridXlsxWorksheet::setFooter(const std::string& footer) {
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
void HybridXlsxWorksheet::setPrintArea(double firstRow, double firstCol, double lastRow, double lastCol) {
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
void HybridXlsxWorksheet::fitToPages(double width, double height) {
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
void HybridXlsxWorksheet::setZoom(double scale) {
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
void HybridXlsxWorksheet::setGridlines(double option) {
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
void HybridXlsxWorksheet::centerHorizontally() {
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
void HybridXlsxWorksheet::centerVertically() {
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
void HybridXlsxWorksheet::setOutline(double level) {
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
void HybridXlsxWorksheet::setColumnHidden(double firstCol, double lastCol, bool hidden) {
|
|
190
|
+
for (unsigned int c = static_cast<unsigned int>(firstCol); c <= static_cast<unsigned int>(lastCol); ++c) {
|
|
191
|
+
_worksheet.column(c).setHidden(hidden);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
void HybridXlsxWorksheet::setRowHidden(double row, bool hidden) {
|
|
196
|
+
_worksheet.row(static_cast<unsigned int>(row)).setHidden(hidden);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
std::variant<bool, nitro::NullType, std::string, double> HybridXlsxWorksheet::getCellValue(double row, double col) {
|
|
200
|
+
auto cell = _worksheet.cell(static_cast<unsigned int>(row), static_cast<unsigned int>(col));
|
|
201
|
+
auto type = cell.value().type();
|
|
202
|
+
|
|
203
|
+
switch (type) {
|
|
204
|
+
case OpenXLSX::XLValueType::String:
|
|
205
|
+
return cell.value().get<std::string>();
|
|
206
|
+
case OpenXLSX::XLValueType::Integer:
|
|
207
|
+
return static_cast<double>(cell.value().get<int64_t>());
|
|
208
|
+
case OpenXLSX::XLValueType::Float:
|
|
209
|
+
return cell.value().get<double>();
|
|
210
|
+
case OpenXLSX::XLValueType::Boolean:
|
|
211
|
+
return cell.value().get<bool>();
|
|
212
|
+
case OpenXLSX::XLValueType::Empty:
|
|
213
|
+
case OpenXLSX::XLValueType::Error:
|
|
214
|
+
default:
|
|
215
|
+
return nitro::NullType{};
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
std::string HybridXlsxWorksheet::getCellString(double row, double col) {
|
|
220
|
+
auto cell = _worksheet.cell(static_cast<unsigned int>(row), static_cast<unsigned int>(col));
|
|
221
|
+
auto type = cell.value().type();
|
|
222
|
+
|
|
223
|
+
switch (type) {
|
|
224
|
+
case OpenXLSX::XLValueType::String:
|
|
225
|
+
return cell.value().get<std::string>();
|
|
226
|
+
case OpenXLSX::XLValueType::Integer:
|
|
227
|
+
return std::to_string(cell.value().get<int64_t>());
|
|
228
|
+
case OpenXLSX::XLValueType::Float:
|
|
229
|
+
return std::to_string(cell.value().get<double>());
|
|
230
|
+
case OpenXLSX::XLValueType::Boolean:
|
|
231
|
+
return cell.value().get<bool>() ? "TRUE" : "FALSE";
|
|
232
|
+
case OpenXLSX::XLValueType::Empty:
|
|
233
|
+
case OpenXLSX::XLValueType::Error:
|
|
234
|
+
default:
|
|
235
|
+
return "";
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
std::string HybridXlsxWorksheet::getCellRawValue(double row, double col) {
|
|
240
|
+
auto cell = _worksheet.cell(static_cast<unsigned int>(row), static_cast<unsigned int>(col));
|
|
241
|
+
|
|
242
|
+
if (cell.hasFormula()) {
|
|
243
|
+
return cell.formula().get();
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
auto type = cell.value().type();
|
|
247
|
+
switch (type) {
|
|
248
|
+
case OpenXLSX::XLValueType::String:
|
|
249
|
+
return cell.value().get<std::string>();
|
|
250
|
+
case OpenXLSX::XLValueType::Integer:
|
|
251
|
+
return std::to_string(cell.value().get<int64_t>());
|
|
252
|
+
case OpenXLSX::XLValueType::Float:
|
|
253
|
+
return std::to_string(cell.value().get<double>());
|
|
254
|
+
case OpenXLSX::XLValueType::Boolean:
|
|
255
|
+
return cell.value().get<bool>() ? "TRUE" : "FALSE";
|
|
256
|
+
case OpenXLSX::XLValueType::Empty:
|
|
257
|
+
case OpenXLSX::XLValueType::Error:
|
|
258
|
+
default:
|
|
259
|
+
return "";
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
CellType HybridXlsxWorksheet::getCellType(double row, double col) {
|
|
264
|
+
auto cell = _worksheet.cell(static_cast<unsigned int>(row), static_cast<unsigned int>(col));
|
|
265
|
+
auto type = cell.value().type();
|
|
266
|
+
|
|
267
|
+
if (cell.hasFormula()) {
|
|
268
|
+
return CellType::FORMULA;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
switch (type) {
|
|
272
|
+
case OpenXLSX::XLValueType::Empty:
|
|
273
|
+
return CellType::EMPTY;
|
|
274
|
+
case OpenXLSX::XLValueType::String:
|
|
275
|
+
return CellType::STRING;
|
|
276
|
+
case OpenXLSX::XLValueType::Integer:
|
|
277
|
+
case OpenXLSX::XLValueType::Float:
|
|
278
|
+
return CellType::NUMBER;
|
|
279
|
+
case OpenXLSX::XLValueType::Boolean:
|
|
280
|
+
return CellType::BOOLEAN;
|
|
281
|
+
case OpenXLSX::XLValueType::Error:
|
|
282
|
+
return CellType::ERROR;
|
|
283
|
+
default:
|
|
284
|
+
return CellType::EMPTY;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
std::shared_ptr<HybridXlsxCellFormatSpec> HybridXlsxWorksheet::getCellFormat(double row, double col) {
|
|
289
|
+
auto cell = _worksheet.cell(static_cast<unsigned int>(row), static_cast<unsigned int>(col));
|
|
290
|
+
auto format = std::make_shared<HybridXlsxCellFormat>();
|
|
291
|
+
return format;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
double HybridXlsxWorksheet::getRowCount() {
|
|
295
|
+
return static_cast<double>(_worksheet.rowCount());
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
double HybridXlsxWorksheet::getColumnCount() {
|
|
299
|
+
return static_cast<double>(_worksheet.columnCount());
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
double HybridXlsxWorksheet::getLastRow() {
|
|
303
|
+
auto last = _worksheet.lastCell();
|
|
304
|
+
return static_cast<double>(last.row());
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
double HybridXlsxWorksheet::getLastColumn() {
|
|
308
|
+
auto last = _worksheet.lastCell();
|
|
309
|
+
return static_cast<double>(last.column());
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
std::string HybridXlsxWorksheet::getName() {
|
|
313
|
+
return _worksheet.name();
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include "HybridXlsxWorksheetSpec.hpp"
|
|
4
|
+
#include <OpenXLSX/XLDocument.hpp>
|
|
5
|
+
#include <OpenXLSX/XLSheet.hpp>
|
|
6
|
+
#include <string>
|
|
7
|
+
#include <memory>
|
|
8
|
+
#include "HybridXlsxCellFormat.hpp"
|
|
9
|
+
|
|
10
|
+
namespace margelo::nitro::xlsx {
|
|
11
|
+
|
|
12
|
+
class HybridXlsxWorksheet : public HybridXlsxWorksheetSpec {
|
|
13
|
+
public:
|
|
14
|
+
HybridXlsxWorksheet(OpenXLSX::XLDocument& doc, OpenXLSX::XLWorksheet worksheet);
|
|
15
|
+
~HybridXlsxWorksheet() override;
|
|
16
|
+
|
|
17
|
+
void writeString(double row, double col, const std::string& value, const std::optional<std::shared_ptr<HybridXlsxCellFormatSpec>>& format) override;
|
|
18
|
+
void writeNumber(double row, double col, double value, const std::optional<std::shared_ptr<HybridXlsxCellFormatSpec>>& format) override;
|
|
19
|
+
void writeBoolean(double row, double col, bool value, const std::optional<std::shared_ptr<HybridXlsxCellFormatSpec>>& format) override;
|
|
20
|
+
void writeBlank(double row, double col, const std::optional<std::shared_ptr<HybridXlsxCellFormatSpec>>& format) override;
|
|
21
|
+
|
|
22
|
+
void writeFormula(double row, double col, const std::string& formula, const std::optional<std::shared_ptr<HybridXlsxCellFormatSpec>>& format) override;
|
|
23
|
+
void writeFormulaNum(double row, double col, const std::string& formula, double number, const std::optional<std::shared_ptr<HybridXlsxCellFormatSpec>>& format) override;
|
|
24
|
+
void writeFormulaString(double row, double col, const std::string& formula, const std::string& str, const std::optional<std::shared_ptr<HybridXlsxCellFormatSpec>>& format) override;
|
|
25
|
+
void writeFormulaBoolean(double row, double col, const std::string& formula, bool boolVal, const std::optional<std::shared_ptr<HybridXlsxCellFormatSpec>>& format) override;
|
|
26
|
+
void writeArrayFormula(double firstRow, double firstCol, double lastRow, double lastCol, const std::string& formula, const std::optional<std::shared_ptr<HybridXlsxCellFormatSpec>>& format) override;
|
|
27
|
+
|
|
28
|
+
void writeDatetime(double row, double col, double datetime, const std::optional<std::shared_ptr<HybridXlsxCellFormatSpec>>& format) override;
|
|
29
|
+
void writeURL(double row, double col, const std::string& url, const std::optional<std::shared_ptr<HybridXlsxCellFormatSpec>>& format) override;
|
|
30
|
+
|
|
31
|
+
void setColumn(double firstCol, double lastCol, double width, const std::optional<std::shared_ptr<HybridXlsxCellFormatSpec>>& format) override;
|
|
32
|
+
void setRow(double row, double height, const std::optional<std::shared_ptr<HybridXlsxCellFormatSpec>>& format) override;
|
|
33
|
+
|
|
34
|
+
void mergeRange(double firstRow, double firstCol, double lastRow, double lastCol, const std::string& value, const std::optional<std::shared_ptr<HybridXlsxCellFormatSpec>>& format) override;
|
|
35
|
+
void mergeRangeNum(double firstRow, double firstCol, double lastRow, double lastCol, double value, const std::optional<std::shared_ptr<HybridXlsxCellFormatSpec>>& format) override;
|
|
36
|
+
|
|
37
|
+
void insertImage(double row, double col, const std::string& path, std::optional<double> xOffset, std::optional<double> yOffset, std::optional<double> xScale, std::optional<double> yScale) override;
|
|
38
|
+
void insertImageBuffer(double row, double col, const std::shared_ptr<ArrayBuffer>& buffer, const std::string& extension, std::optional<double> xOffset, std::optional<double> yOffset, std::optional<double> xScale, std::optional<double> yScale) override;
|
|
39
|
+
|
|
40
|
+
void autofilter(double firstRow, double firstCol, double lastRow, double lastCol) override;
|
|
41
|
+
|
|
42
|
+
void freezePanes(double row, double col) override;
|
|
43
|
+
void splitPanes(double row, double col) override;
|
|
44
|
+
|
|
45
|
+
void setTabColor(double color) override;
|
|
46
|
+
void hide() override;
|
|
47
|
+
void activate() override;
|
|
48
|
+
void setFirstSheet() override;
|
|
49
|
+
void protect(const std::optional<std::string>& password) override;
|
|
50
|
+
|
|
51
|
+
void setPortrait() override;
|
|
52
|
+
void setLandscape() override;
|
|
53
|
+
void setPaper(double paperType) override;
|
|
54
|
+
void setHeader(const std::string& header) override;
|
|
55
|
+
void setFooter(const std::string& footer) override;
|
|
56
|
+
void setPrintArea(double firstRow, double firstCol, double lastRow, double lastCol) override;
|
|
57
|
+
void fitToPages(double width, double height) override;
|
|
58
|
+
void setZoom(double scale) override;
|
|
59
|
+
void setGridlines(double option) override;
|
|
60
|
+
void centerHorizontally() override;
|
|
61
|
+
void centerVertically() override;
|
|
62
|
+
|
|
63
|
+
void setOutline(double level) override;
|
|
64
|
+
void setColumnHidden(double firstCol, double lastCol, bool hidden) override;
|
|
65
|
+
void setRowHidden(double row, bool hidden) override;
|
|
66
|
+
|
|
67
|
+
// Read methods
|
|
68
|
+
std::variant<bool, nitro::NullType, std::string, double> getCellValue(double row, double col) override;
|
|
69
|
+
std::string getCellString(double row, double col) override;
|
|
70
|
+
std::string getCellRawValue(double row, double col) override;
|
|
71
|
+
CellType getCellType(double row, double col) override;
|
|
72
|
+
std::shared_ptr<HybridXlsxCellFormatSpec> getCellFormat(double row, double col) override;
|
|
73
|
+
double getRowCount() override;
|
|
74
|
+
double getColumnCount() override;
|
|
75
|
+
double getLastRow() override;
|
|
76
|
+
double getLastColumn() override;
|
|
77
|
+
std::string getName() override;
|
|
78
|
+
|
|
79
|
+
private:
|
|
80
|
+
OpenXLSX::XLDocument& _doc;
|
|
81
|
+
OpenXLSX::XLWorksheet _worksheet;
|
|
82
|
+
|
|
83
|
+
void applyFormat(OpenXLSX::XLCell& cell, const std::optional<std::shared_ptr<HybridXlsxCellFormatSpec>>& format);
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
}
|
package/nitro.json
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"cxxNamespace": ["xlsx"],
|
|
3
|
+
"ios": {
|
|
4
|
+
"iosModuleName": "NitroXlsx"
|
|
5
|
+
},
|
|
6
|
+
"android": {
|
|
7
|
+
"androidNamespace": ["xlsx"],
|
|
8
|
+
"androidCxxLibName": "NitroXlsx"
|
|
9
|
+
},
|
|
10
|
+
"autolinking": {
|
|
11
|
+
"NitroXlsx": {
|
|
12
|
+
"all": {
|
|
13
|
+
"language": "c++",
|
|
14
|
+
"implementationClassName": "HybridNitroXlsx"
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"ignorePaths": ["node_modules", "lib"]
|
|
19
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
** linguist-generated=true
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
#
|
|
2
|
+
# NitroXlsx+autolinking.cmake
|
|
3
|
+
# This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
|
|
4
|
+
# https://github.com/mrousavy/nitro
|
|
5
|
+
# Copyright © Marc Rousavy @ Margelo
|
|
6
|
+
#
|
|
7
|
+
|
|
8
|
+
# This is a CMake file that adds all files generated by Nitrogen
|
|
9
|
+
# to the current CMake project.
|
|
10
|
+
#
|
|
11
|
+
# To use it, add this to your CMakeLists.txt:
|
|
12
|
+
# ```cmake
|
|
13
|
+
# include(${CMAKE_SOURCE_DIR}/../nitrogen/generated/android/NitroXlsx+autolinking.cmake)
|
|
14
|
+
# ```
|
|
15
|
+
|
|
16
|
+
# Define a flag to check if we are building properly
|
|
17
|
+
add_definitions(-DBUILDING_NITROXLSX_WITH_GENERATED_CMAKE_PROJECT)
|
|
18
|
+
|
|
19
|
+
# Enable Raw Props parsing in react-native (for Nitro Views)
|
|
20
|
+
add_definitions(-DRN_SERIALIZABLE_STATE)
|
|
21
|
+
|
|
22
|
+
# Add all headers that were generated by Nitrogen
|
|
23
|
+
include_directories(
|
|
24
|
+
"../nitrogen/generated/shared/c++"
|
|
25
|
+
"../nitrogen/generated/android/c++"
|
|
26
|
+
"../nitrogen/generated/android/"
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
# Add all .cpp sources that were generated by Nitrogen
|
|
30
|
+
target_sources(
|
|
31
|
+
# CMake project name (Android C++ library name)
|
|
32
|
+
NitroXlsx PRIVATE
|
|
33
|
+
# Autolinking Setup
|
|
34
|
+
../nitrogen/generated/android/NitroXlsxOnLoad.cpp
|
|
35
|
+
# Shared Nitrogen C++ sources
|
|
36
|
+
../nitrogen/generated/shared/c++/HybridXlsxWorkbookSpec.cpp
|
|
37
|
+
../nitrogen/generated/shared/c++/HybridXlsxWorksheetSpec.cpp
|
|
38
|
+
../nitrogen/generated/shared/c++/HybridXlsxCellFormatSpec.cpp
|
|
39
|
+
../nitrogen/generated/shared/c++/HybridNitroXlsxSpec.cpp
|
|
40
|
+
# Android-specific Nitrogen C++ sources
|
|
41
|
+
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
# From node_modules/react-native/ReactAndroid/cmake-utils/folly-flags.cmake
|
|
45
|
+
# Used in node_modules/react-native/ReactAndroid/cmake-utils/ReactNative-application.cmake
|
|
46
|
+
target_compile_definitions(
|
|
47
|
+
NitroXlsx PRIVATE
|
|
48
|
+
-DFOLLY_NO_CONFIG=1
|
|
49
|
+
-DFOLLY_HAVE_CLOCK_GETTIME=1
|
|
50
|
+
-DFOLLY_USE_LIBCPP=1
|
|
51
|
+
-DFOLLY_CFG_NO_COROUTINES=1
|
|
52
|
+
-DFOLLY_MOBILE=1
|
|
53
|
+
-DFOLLY_HAVE_RECVMMSG=1
|
|
54
|
+
-DFOLLY_HAVE_PTHREAD=1
|
|
55
|
+
# Once we target android-23 above, we can comment
|
|
56
|
+
# the following line. NDK uses GNU style stderror_r() after API 23.
|
|
57
|
+
-DFOLLY_HAVE_XSI_STRERROR_R=1
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
# Add all libraries required by the generated specs
|
|
61
|
+
find_package(fbjni REQUIRED) # <-- Used for communication between Java <-> C++
|
|
62
|
+
find_package(ReactAndroid REQUIRED) # <-- Used to set up React Native bindings (e.g. CallInvoker/TurboModule)
|
|
63
|
+
find_package(react-native-nitro-modules REQUIRED) # <-- Used to create all HybridObjects and use the Nitro core library
|
|
64
|
+
|
|
65
|
+
# Link all libraries together
|
|
66
|
+
target_link_libraries(
|
|
67
|
+
NitroXlsx
|
|
68
|
+
fbjni::fbjni # <-- Facebook C++ JNI helpers
|
|
69
|
+
ReactAndroid::jsi # <-- RN: JSI
|
|
70
|
+
react-native-nitro-modules::NitroModules # <-- NitroModules Core :)
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
# Link react-native (different prefab between RN 0.75 and RN 0.76)
|
|
74
|
+
if(ReactAndroid_VERSION_MINOR GREATER_EQUAL 76)
|
|
75
|
+
target_link_libraries(
|
|
76
|
+
NitroXlsx
|
|
77
|
+
ReactAndroid::reactnative # <-- RN: Native Modules umbrella prefab
|
|
78
|
+
)
|
|
79
|
+
else()
|
|
80
|
+
target_link_libraries(
|
|
81
|
+
NitroXlsx
|
|
82
|
+
ReactAndroid::react_nativemodule_core # <-- RN: TurboModules Core
|
|
83
|
+
)
|
|
84
|
+
endif()
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
///
|
|
2
|
+
/// NitroXlsx+autolinking.gradle
|
|
3
|
+
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
|
|
4
|
+
/// https://github.com/mrousavy/nitro
|
|
5
|
+
/// Copyright © Marc Rousavy @ Margelo
|
|
6
|
+
///
|
|
7
|
+
|
|
8
|
+
/// This is a Gradle file that adds all files generated by Nitrogen
|
|
9
|
+
/// to the current Gradle project.
|
|
10
|
+
///
|
|
11
|
+
/// To use it, add this to your build.gradle:
|
|
12
|
+
/// ```gradle
|
|
13
|
+
/// apply from: '../nitrogen/generated/android/NitroXlsx+autolinking.gradle'
|
|
14
|
+
/// ```
|
|
15
|
+
|
|
16
|
+
logger.warn("[NitroModules] 🔥 NitroXlsx is boosted by nitro!")
|
|
17
|
+
|
|
18
|
+
android {
|
|
19
|
+
sourceSets {
|
|
20
|
+
main {
|
|
21
|
+
java.srcDirs += [
|
|
22
|
+
// Nitrogen files
|
|
23
|
+
"${project.projectDir}/../nitrogen/generated/android/kotlin"
|
|
24
|
+
]
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
///
|
|
2
|
+
/// NitroXlsxOnLoad.cpp
|
|
3
|
+
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
|
|
4
|
+
/// https://github.com/mrousavy/nitro
|
|
5
|
+
/// Copyright © Marc Rousavy @ Margelo
|
|
6
|
+
///
|
|
7
|
+
|
|
8
|
+
#ifndef BUILDING_NITROXLSX_WITH_GENERATED_CMAKE_PROJECT
|
|
9
|
+
#error NitroXlsxOnLoad.cpp is not being built with the autogenerated CMakeLists.txt project. Is a different CMakeLists.txt building this?
|
|
10
|
+
#endif
|
|
11
|
+
|
|
12
|
+
#include "NitroXlsxOnLoad.hpp"
|
|
13
|
+
|
|
14
|
+
#include <jni.h>
|
|
15
|
+
#include <fbjni/fbjni.h>
|
|
16
|
+
#include <NitroModules/HybridObjectRegistry.hpp>
|
|
17
|
+
|
|
18
|
+
#include "HybridNitroXlsx.hpp"
|
|
19
|
+
|
|
20
|
+
namespace margelo::nitro::xlsx {
|
|
21
|
+
|
|
22
|
+
int initialize(JavaVM* vm) {
|
|
23
|
+
return facebook::jni::initialize(vm, []() {
|
|
24
|
+
::margelo::nitro::xlsx::registerAllNatives();
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
void registerAllNatives() {
|
|
31
|
+
using namespace margelo::nitro;
|
|
32
|
+
using namespace margelo::nitro::xlsx;
|
|
33
|
+
|
|
34
|
+
// Register native JNI methods
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
// Register Nitro Hybrid Objects
|
|
38
|
+
HybridObjectRegistry::registerHybridObjectConstructor(
|
|
39
|
+
"NitroXlsx",
|
|
40
|
+
[]() -> std::shared_ptr<HybridObject> {
|
|
41
|
+
static_assert(std::is_default_constructible_v<HybridNitroXlsx>,
|
|
42
|
+
"The HybridObject \"HybridNitroXlsx\" is not default-constructible! "
|
|
43
|
+
"Create a public constructor that takes zero arguments to be able to autolink this HybridObject.");
|
|
44
|
+
return std::make_shared<HybridNitroXlsx>();
|
|
45
|
+
}
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
} // namespace margelo::nitro::xlsx
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
///
|
|
2
|
+
/// NitroXlsxOnLoad.hpp
|
|
3
|
+
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
|
|
4
|
+
/// https://github.com/mrousavy/nitro
|
|
5
|
+
/// Copyright © Marc Rousavy @ Margelo
|
|
6
|
+
///
|
|
7
|
+
|
|
8
|
+
#include <jni.h>
|
|
9
|
+
#include <functional>
|
|
10
|
+
#include <NitroModules/NitroDefines.hpp>
|
|
11
|
+
|
|
12
|
+
namespace margelo::nitro::xlsx {
|
|
13
|
+
|
|
14
|
+
[[deprecated("Use registerNatives() instead.")]]
|
|
15
|
+
int initialize(JavaVM* vm);
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Register the native (C++) part of NitroXlsx, and autolinks all Hybrid Objects.
|
|
19
|
+
* Call this in your `JNI_OnLoad` function (probably inside `cpp-adapter.cpp`),
|
|
20
|
+
* inside a `facebook::jni::initialize(vm, ...)` call.
|
|
21
|
+
* Example:
|
|
22
|
+
* ```cpp (cpp-adapter.cpp)
|
|
23
|
+
* JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void*) {
|
|
24
|
+
* return facebook::jni::initialize(vm, []() {
|
|
25
|
+
* // register all NitroXlsx HybridObjects
|
|
26
|
+
* margelo::nitro::xlsx::registerNatives();
|
|
27
|
+
* // any other custom registrations go here.
|
|
28
|
+
* });
|
|
29
|
+
* }
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
void registerAllNatives();
|
|
33
|
+
|
|
34
|
+
} // namespace margelo::nitro::xlsx
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
///
|
|
2
|
+
/// NitroXlsxOnLoad.kt
|
|
3
|
+
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
|
|
4
|
+
/// https://github.com/mrousavy/nitro
|
|
5
|
+
/// Copyright © Marc Rousavy @ Margelo
|
|
6
|
+
///
|
|
7
|
+
|
|
8
|
+
package com.margelo.nitro.xlsx
|
|
9
|
+
|
|
10
|
+
import android.util.Log
|
|
11
|
+
|
|
12
|
+
internal class NitroXlsxOnLoad {
|
|
13
|
+
companion object {
|
|
14
|
+
private const val TAG = "NitroXlsxOnLoad"
|
|
15
|
+
private var didLoad = false
|
|
16
|
+
/**
|
|
17
|
+
* Initializes the native part of "NitroXlsx".
|
|
18
|
+
* This method is idempotent and can be called more than once.
|
|
19
|
+
*/
|
|
20
|
+
@JvmStatic
|
|
21
|
+
fun initializeNative() {
|
|
22
|
+
if (didLoad) return
|
|
23
|
+
try {
|
|
24
|
+
Log.i(TAG, "Loading NitroXlsx C++ library...")
|
|
25
|
+
System.loadLibrary("NitroXlsx")
|
|
26
|
+
Log.i(TAG, "Successfully loaded NitroXlsx C++ library!")
|
|
27
|
+
didLoad = true
|
|
28
|
+
} catch (e: Error) {
|
|
29
|
+
Log.e(TAG, "Failed to load NitroXlsx C++ library! Is it properly installed and linked? " +
|
|
30
|
+
"Is the name correct? (see `CMakeLists.txt`, at `add_library(...)`)", e)
|
|
31
|
+
throw e
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|