react-native-nitro-xlsx 0.2.6 → 0.2.7

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 (57) hide show
  1. package/README.md +20 -8
  2. package/cpp/HybridNitroXlsx.cpp +25 -1
  3. package/cpp/HybridXlsxCellFormat.cpp +46 -146
  4. package/cpp/HybridXlsxCellFormat.hpp +9 -41
  5. package/cpp/HybridXlsxConditionalFormat.cpp +4 -1
  6. package/cpp/HybridXlsxConditionalFormats.cpp +5 -1
  7. package/cpp/HybridXlsxWorkbook.cpp +38 -8
  8. package/cpp/HybridXlsxWorkbook.hpp +10 -1
  9. package/cpp/HybridXlsxWorksheet.cpp +422 -141
  10. package/cpp/HybridXlsxWorksheet.hpp +4 -1
  11. package/cpp/XlsxCacheDir.cpp +25 -2
  12. package/cpp/XlsxCacheDir.hpp +3 -1
  13. package/cpp/XlsxCellStyle.hpp +360 -0
  14. package/cpp/XlsxJson.cpp +29 -8
  15. package/package.json +1 -1
  16. package/scripts/sync-openxlsx-headers.sh +34 -0
  17. package/src/__mocks__/react-native-nitro-modules.ts +523 -20
  18. package/src/__tests__/index.test.ts +124 -16
  19. package/src/index.ts +13 -13
  20. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/IZipArchive.hpp +361 -0
  21. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/OpenXLSX-Exports.hpp +12 -0
  22. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLCell.hpp +367 -0
  23. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLCellIterator.hpp +252 -0
  24. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLCellRange.hpp +223 -0
  25. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLCellReference.hpp +317 -0
  26. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLCellValue.hpp +793 -0
  27. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLColor.hpp +232 -0
  28. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLColumn.hpp +159 -0
  29. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLCommandQuery.hpp +228 -0
  30. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLComments.hpp +270 -0
  31. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLConstants.hpp +18 -0
  32. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLContentTypes.hpp +264 -0
  33. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLDateTime.hpp +175 -0
  34. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLDocument.hpp +505 -0
  35. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLDrawing.hpp +452 -0
  36. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLException.hpp +161 -0
  37. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLFormula.hpp +375 -0
  38. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLIterator.hpp +40 -0
  39. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLMergeCells.hpp +216 -0
  40. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLProperties.hpp +348 -0
  41. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLRelationships.hpp +348 -0
  42. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLRow.hpp +721 -0
  43. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLRowData.hpp +488 -0
  44. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLSharedStrings.hpp +204 -0
  45. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLSheet.hpp +1640 -0
  46. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLStyles.hpp +2390 -0
  47. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLTables.hpp +132 -0
  48. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLWorkbook.hpp +404 -0
  49. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLXmlData.hpp +283 -0
  50. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLXmlFile.hpp +194 -0
  51. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLXmlParser.hpp +282 -0
  52. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLXmlParserForwardDeclarations.hpp +85 -0
  53. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLZipArchive.hpp +232 -0
  54. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/detail/LibZip.hpp +447 -0
  55. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/detail/OpenXLSXFileSystemTools.hpp +207 -0
  56. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/detail/Zippy.hpp +1375 -0
  57. package/thirdparty/README.md +7 -3
@@ -0,0 +1,367 @@
1
+ /*
2
+
3
+ ____ ____ ___ ____ ____ ____ ___
4
+ 6MMMMb `MM( )M' `MM' 6MMMMb\`MM( )M'
5
+ 8P Y8 `MM. d' MM 6M' ` `MM. d'
6
+ 6M Mb __ ____ ____ ___ __ `MM. d' MM MM `MM. d'
7
+ MM MM `M6MMMMb 6MMMMb `MM 6MMb `MM. d' MM YM. `MM. d'
8
+ MM MM MM' `Mb 6M' `Mb MMM9 `Mb `MMd MM YMMMMb `MMd
9
+ MM MM MM MM MM MM MM' MM dMM. MM `Mb dMM.
10
+ MM MM MM MM MMMMMMMM MM MM d'`MM. MM MM d'`MM.
11
+ YM M9 MM MM MM MM MM d' `MM. MM MM d' `MM.
12
+ 8b d8 MM. ,M9 YM d9 MM MM d' `MM. MM / L ,M9 d' `MM.
13
+ YMMMM9 MMYMMM9 YMMMM9 _MM_ _MM_M(_ _)MM_ _MMMMMMM MYMMMM9 _M(_ _)MM_
14
+ MM
15
+ MM
16
+ _MM_
17
+
18
+ Copyright (c) 2018, Kenneth Troldal Balslev
19
+
20
+ All rights reserved.
21
+
22
+ Redistribution and use in source and binary forms, with or without
23
+ modification, are permitted provided that the following conditions are met:
24
+ - Redistributions of source code must retain the above copyright
25
+ notice, this list of conditions and the following disclaimer.
26
+ - Redistributions in binary form must reproduce the above copyright
27
+ notice, this list of conditions and the following disclaimer in the
28
+ documentation and/or other materials provided with the distribution.
29
+ - Neither the name of the author nor the
30
+ names of any contributors may be used to endorse or promote products
31
+ derived from this software without specific prior written permission.
32
+
33
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
34
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
35
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
36
+ DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
37
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
38
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
39
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
40
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
41
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
42
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
43
+
44
+ */
45
+
46
+ #ifndef OPENXLSX_XLCELL_HPP
47
+ #define OPENXLSX_XLCELL_HPP
48
+
49
+ #ifdef _MSC_VER // conditionally enable MSVC specific pragmas to avoid other compilers warning about unknown pragmas
50
+ # pragma warning(push)
51
+ # pragma warning(disable : 4251)
52
+ # pragma warning(disable : 4275)
53
+ #endif // _MSC_VER
54
+
55
+ #include <iostream> // std::ostream
56
+ #include <ostream> // std::basic_ostream
57
+ #include <memory>
58
+
59
+ // ===== OpenXLSX Includes ===== //
60
+ #include "OpenXLSX-Exports.hpp"
61
+ #include "XLCellReference.hpp"
62
+ #include "XLCellValue.hpp"
63
+ #include "XLFormula.hpp"
64
+ #include "XLSharedStrings.hpp"
65
+ #include "XLStyles.hpp" // XLStyleIndex
66
+ #include "XLXmlParserForwardDeclarations.hpp"
67
+
68
+ // ========== CLASS AND ENUM TYPE DEFINITIONS ========== //
69
+ namespace OpenXLSX
70
+ {
71
+ // ===== Flags that can be passed to XLCell::clear as parameter keep, flags can be combined with bitwise OR
72
+ // // Do not clear the cell's:
73
+ constexpr const uint32_t XLKeepCellStyle = 1; // style (attribute s)
74
+ constexpr const uint32_t XLKeepCellType = 2; // type (attribute t)
75
+ constexpr const uint32_t XLKeepCellValue = 4; // value (child node v)
76
+ constexpr const uint32_t XLKeepCellFormula = 8; // formula (child node f)
77
+
78
+ class XLCellRange;
79
+
80
+ /**
81
+ * @brief An implementation class encapsulating the properties and behaviours of a spreadsheet cell.
82
+ */
83
+ class OPENXLSX_EXPORT XLCell
84
+ {
85
+ friend class XLCellIterator;
86
+ friend class XLCellValueProxy;
87
+ friend class XLRowDataIterator;
88
+ friend bool operator==(const XLCell& lhs, const XLCell& rhs);
89
+ friend bool operator!=(const XLCell& lhs, const XLCell& rhs);
90
+
91
+ public:
92
+ //---------- Public Member Functions ----------//
93
+
94
+ /**
95
+ * @brief Default constructor. Constructs a null object.
96
+ */
97
+ XLCell();
98
+
99
+ /**
100
+ * @brief
101
+ * @param cellNode
102
+ * @param sharedStrings
103
+ */
104
+ XLCell(const XMLNode& cellNode, const XLSharedStrings& sharedStrings);
105
+
106
+ /**
107
+ * @brief Copy constructor
108
+ * @param other The XLCell object to be copied.
109
+ * @note The copy constructor has been deleted, as it makes no sense to copy a cell. If the objective is to
110
+ * copy the getValue, create the the target object and then use the copy assignment operator.
111
+ */
112
+ XLCell(const XLCell& other);
113
+
114
+ /**
115
+ * @brief Move constructor
116
+ * @param other The XLCell object to be moved
117
+ * @note The move constructor has been deleted, as it makes no sense to move a cell.
118
+ */
119
+ XLCell(XLCell&& other) noexcept;
120
+
121
+ /**
122
+ * @brief Destructor
123
+ * @note Using the default destructor
124
+ */
125
+ virtual ~XLCell();
126
+
127
+ /**
128
+ * @brief Copy assignment operator
129
+ * @param other The XLCell object to be copy assigned
130
+ * @return A reference to the new object
131
+ * @note Copies only the cell contents, not the pointer to parent worksheet etc.
132
+ */
133
+ virtual XLCell& operator=(const XLCell& other);
134
+
135
+ /**
136
+ * @brief Move assignment operator
137
+ * @param other The XLCell object to be move assigned
138
+ * @return A reference to the new object
139
+ * @note The move assignment constructor has been deleted, as it makes no sense to move a cell.
140
+ */
141
+ virtual XLCell& operator=(XLCell&& other) noexcept;
142
+
143
+ /**
144
+ * @brief Copy contents of a cell, value & formula
145
+ * @param other The XLCell object from which to copy
146
+ */
147
+ void copyFrom(XLCell const& other);
148
+
149
+ /**
150
+ * @brief test if cell object has no (valid) content
151
+ * @return
152
+ */
153
+ bool empty() const;
154
+
155
+ /**
156
+ * @brief opposite of empty()
157
+ * @return
158
+ */
159
+ explicit operator bool() const;
160
+
161
+ /**
162
+ * @brief clear all cell content and attributes except for the cell reference (attribute r)
163
+ * @param keep do not clear cell properties whose flags are set in keep (XLKeepCellStyle, XLKeepCellType,
164
+ * XLKeepCellValue, XLKeepCellFormula), flags can be combined with bitwise OR
165
+ * @note due to the way OOXML separates comments from the cells, this function will *not* clear a cell comment - refer to XLComments& XLSheet::comments() for that
166
+ */
167
+ void clear(uint32_t keep);
168
+
169
+ /**
170
+ * @brief
171
+ * @return
172
+ */
173
+ XLCellValueProxy& value();
174
+
175
+ /**
176
+ * @brief
177
+ * @return
178
+ */
179
+ const XLCellValueProxy& value() const;
180
+
181
+ /**
182
+ * @brief get the XLCellReference object for the cell.
183
+ * @return A reference to the cells' XLCellReference object.
184
+ */
185
+ XLCellReference cellReference() const;
186
+
187
+ /**
188
+ * @brief get the XLCell object from the current cell offset
189
+ * @return A reference to the XLCell object.
190
+ */
191
+ XLCell offset(uint16_t rowOffset, uint16_t colOffset) const;
192
+
193
+ /**
194
+ * @brief test if cell has a formula (XML) node, even if it is an empty string
195
+ * @return true if XML has a formula node, empty or not - otherwise false
196
+ */
197
+ bool hasFormula() const;
198
+
199
+ /**
200
+ * @brief
201
+ * @return
202
+ */
203
+ XLFormulaProxy& formula();
204
+
205
+ /**
206
+ * @brief
207
+ * @return
208
+ */
209
+ const XLFormulaProxy& formula() const;
210
+
211
+ /**
212
+ * @brief
213
+ */
214
+ std::string getString() const { return value().getString(); }
215
+
216
+ /**
217
+ * @brief Get the array index of xl/styles.xml:<styleSheet>:<cellXfs> for the style used in this cell.
218
+ * This value is stored in the s attribute of a cell like so: s="2"
219
+ * @returns The index of the applicable format style
220
+ */
221
+ XLStyleIndex cellFormat() const;
222
+
223
+ /**
224
+ * @brief Set the cell style (attribute s) with a reference to the array index of xl/styles.xml:<styleSheet>:<cellXfs>
225
+ * @param cellFormatIndex The style to set, corresponding to the nidex of XLStyles::cellStyles()
226
+ * @returns True on success, false on failure
227
+ */
228
+ bool setCellFormat(XLStyleIndex cellFormatIndex);
229
+
230
+ /**
231
+ * @brief Print the XML contents of the XLCell using the underlying XMLNode print function
232
+ */
233
+ void print(std::basic_ostream<char>& ostr) const;
234
+
235
+ private:
236
+ /**
237
+ * @brief
238
+ * @param lhs
239
+ * @param rhs
240
+ * @return
241
+ */
242
+ static bool isEqual(const XLCell& lhs, const XLCell& rhs);
243
+
244
+ //---------- Private Member Variables ---------- //
245
+ std::unique_ptr<XMLNode> m_cellNode; /**< A pointer to the root XMLNode for the cell. */
246
+ XLSharedStringsRef m_sharedStrings; /**< */
247
+ XLCellValueProxy m_valueProxy; /**< */
248
+ XLFormulaProxy m_formulaProxy; /**< */
249
+ };
250
+
251
+ class OPENXLSX_EXPORT XLCellAssignable : public XLCell
252
+ {
253
+ public:
254
+ /**
255
+ * @brief Default constructor. Constructs a null object.
256
+ */
257
+ XLCellAssignable() : XLCell() {}
258
+
259
+ /**
260
+ * @brief Copy constructor. Constructs an assignable XLCell from an existing cell
261
+ * @param other the cell to construct from
262
+ */
263
+ XLCellAssignable (XLCell const & other);
264
+
265
+ /**
266
+ * @brief Move constructor. Constructs an assignable XLCell from a temporary (r)value
267
+ * @param other the cell to construct from
268
+ */
269
+ XLCellAssignable (XLCell && other);
270
+
271
+ // /**
272
+ // * @brief Inherit all constructors with parameters from XLCell
273
+ // */
274
+ // template<class base>
275
+ // // explicit XLCellAssignable(base b) : XLCell(b)
276
+ // // NOTE: BUG: explicit keyword triggers tons of compiler errors when << operator attempts to use an XLCell (implicit conversion works because << is overloaded for XLCellAssignable)
277
+ // XLCellAssignable(base b) : XLCell(b)
278
+ // {}
279
+
280
+ /**
281
+ * @brief Copy assignment operator
282
+ * @param other The XLCell object to be copy assigned
283
+ * @return A reference to the new object
284
+ * @note Copies only the cell contents, not the pointer to parent worksheet etc.
285
+ */
286
+ XLCellAssignable& operator=(const XLCell& other) override;
287
+ XLCellAssignable& operator=(const XLCellAssignable& other);
288
+
289
+ /**
290
+ * @brief Move assignment operator -> overrides XLCell copy operator, becomes a copy operator
291
+ * @param other The XLCell object to be copy assigned
292
+ * @return A reference to the new object
293
+ * @note Copies only the cell contents, not the pointer to parent worksheet etc.
294
+ */
295
+ XLCellAssignable& operator=(XLCell&& other) noexcept override;
296
+ XLCellAssignable& operator=(XLCellAssignable&& other) noexcept;
297
+
298
+ /**
299
+ * @brief Templated assignment operator.
300
+ * @tparam T The type of the value argument.
301
+ * @param value The value.
302
+ * @return A reference to the assigned-to object.
303
+ */
304
+ template<typename T,
305
+ typename = std::enable_if_t<
306
+ std::is_integral_v<T> || std::is_floating_point_v<T> || std::is_same_v<std::decay_t<T>, std::string> ||
307
+ std::is_same_v<std::decay_t<T>, std::string_view> || std::is_same_v<std::decay_t<T>, const char*> ||
308
+ std::is_same_v<std::decay_t<T>, char*> || std::is_same_v<T, XLDateTime>>>
309
+ XLCellAssignable& operator=(T value)
310
+ {
311
+ XLCell::value() = value; // forward implementation to templated XLCellValue& XLCellValue::operator=(T value)
312
+ return *this;
313
+ }
314
+ };
315
+ } // namespace OpenXLSX
316
+
317
+ // ========== FRIEND FUNCTION IMPLEMENTATIONS ========== //
318
+ namespace OpenXLSX
319
+ {
320
+ /**
321
+ * @brief
322
+ * @param lhs
323
+ * @param rhs
324
+ * @return
325
+ */
326
+ inline bool operator==(const XLCell& lhs, const XLCell& rhs) { return XLCell::isEqual(lhs, rhs); }
327
+
328
+ /**
329
+ * @brief
330
+ * @param lhs
331
+ * @param rhs
332
+ * @return
333
+ */
334
+ inline bool operator!=(const XLCell& lhs, const XLCell& rhs) { return !XLCell::isEqual(lhs, rhs); }
335
+
336
+ /**
337
+ * @brief ostream output of XLCell content as string
338
+ * @param os the ostream destination
339
+ * @param c the cell to output to the stream
340
+ * @return
341
+ */
342
+ inline std::ostream& operator<<(std::ostream& os, const XLCell& c)
343
+ {
344
+ os << c.getString();
345
+ // TODO: send to stream different data types based on cell data type
346
+ return os;
347
+ }
348
+
349
+ /**
350
+ * @brief ostream output of XLCellAssignable content as string
351
+ * @param os the ostream destination
352
+ * @param c the cell to output to the stream
353
+ * @return
354
+ */
355
+ inline std::ostream& operator<<(std::ostream& os, const XLCellAssignable& c)
356
+ {
357
+ os << c.getString();
358
+ // TODO: send to stream different data types based on cell data type
359
+ return os;
360
+ }
361
+ } // namespace OpenXLSX
362
+
363
+ #ifdef _MSC_VER // conditionally enable MSVC specific pragmas to avoid other compilers warning about unknown pragmas
364
+ # pragma warning(pop)
365
+ #endif // _MSC_VER
366
+
367
+ #endif // OPENXLSX_XLCELL_HPP
@@ -0,0 +1,252 @@
1
+ /*
2
+
3
+ ____ ____ ___ ____ ____ ____ ___
4
+ 6MMMMb `MM( )M' `MM' 6MMMMb\`MM( )M'
5
+ 8P Y8 `MM. d' MM 6M' ` `MM. d'
6
+ 6M Mb __ ____ ____ ___ __ `MM. d' MM MM `MM. d'
7
+ MM MM `M6MMMMb 6MMMMb `MM 6MMb `MM. d' MM YM. `MM. d'
8
+ MM MM MM' `Mb 6M' `Mb MMM9 `Mb `MMd MM YMMMMb `MMd
9
+ MM MM MM MM MM MM MM' MM dMM. MM `Mb dMM.
10
+ MM MM MM MM MMMMMMMM MM MM d'`MM. MM MM d'`MM.
11
+ YM M9 MM MM MM MM MM d' `MM. MM MM d' `MM.
12
+ 8b d8 MM. ,M9 YM d9 MM MM d' `MM. MM / L ,M9 d' `MM.
13
+ YMMMM9 MMYMMM9 YMMMM9 _MM_ _MM_M(_ _)MM_ _MMMMMMM MYMMMM9 _M(_ _)MM_
14
+ MM
15
+ MM
16
+ _MM_
17
+
18
+ Copyright (c) 2018, Kenneth Troldal Balslev
19
+
20
+ All rights reserved.
21
+
22
+ Redistribution and use in source and binary forms, with or without
23
+ modification, are permitted provided that the following conditions are met:
24
+ - Redistributions of source code must retain the above copyright
25
+ notice, this list of conditions and the following disclaimer.
26
+ - Redistributions in binary form must reproduce the above copyright
27
+ notice, this list of conditions and the following disclaimer in the
28
+ documentation and/or other materials provided with the distribution.
29
+ - Neither the name of the author nor the
30
+ names of any contributors may be used to endorse or promote products
31
+ derived from this software without specific prior written permission.
32
+
33
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
34
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
35
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
36
+ DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
37
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
38
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
39
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
40
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
41
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
42
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
43
+
44
+ */
45
+
46
+ #ifndef OPENXLSX_XLCELLITERATOR_HPP
47
+ #define OPENXLSX_XLCELLITERATOR_HPP
48
+
49
+ #ifdef _MSC_VER // conditionally enable MSVC specific pragmas to avoid other compilers warning about unknown pragmas
50
+ # pragma warning(push)
51
+ # pragma warning(disable : 4251)
52
+ # pragma warning(disable : 4275)
53
+ #endif // _MSC_VER
54
+
55
+ #include <algorithm>
56
+
57
+ #include "OpenXLSX-Exports.hpp"
58
+ #include "XLCell.hpp"
59
+ #include "XLCellReference.hpp"
60
+ #include "XLIterator.hpp"
61
+ #include "XLXmlParserForwardDeclarations.hpp"
62
+
63
+ namespace OpenXLSX
64
+ {
65
+ /**
66
+ * @brief locate the XML row node within sheetDataNode for the row at rowNumber
67
+ * @param sheetDataNode the XML sheetData node to search in
68
+ * @param rowNumber the number of the row to locate
69
+ * @return the XMLNode pointing to the row, or an empty XMLNode if the row does not exist
70
+ */
71
+ XMLNode findRowNode(XMLNode sheetDataNode, uint32_t rowNumber);
72
+
73
+ /**
74
+ * @brief locate the XML cell node within rownode for the cell at columnNumber
75
+ * @param rowNode the XML node of the row to search in
76
+ * @param columnNumber the column number of the cell to locate
77
+ * @return the XMLNode pointing to the cell, or an empty XMLNode if the cell does not exist
78
+ */
79
+ XMLNode findCellNode(XMLNode rowNode, uint16_t columnNumber);
80
+
81
+ class OPENXLSX_EXPORT XLCellIterator
82
+ {
83
+ public:
84
+ using iterator_category = std::forward_iterator_tag;
85
+ using value_type = XLCell;
86
+ using difference_type = int64_t;
87
+ using pointer = XLCell*;
88
+ using reference = XLCell&;
89
+
90
+ /**
91
+ * @brief
92
+ * @param cellRange
93
+ * @param loc
94
+ * @param colStyles is an optional vector with all column styles configured for the worksheet when the iterator is created.
95
+ * This vector - if provided - will be used to get default cell styles for newly created cells, instead of performing
96
+ * a potentially expensive lookup in <cols>
97
+ */
98
+ explicit XLCellIterator(const XLCellRange& cellRange, XLIteratorLocation loc, std::vector<XLStyleIndex> const * colStyles);
99
+
100
+ /**
101
+ * @brief
102
+ */
103
+ ~XLCellIterator();
104
+
105
+ /**
106
+ * @brief
107
+ * @param other
108
+ */
109
+ XLCellIterator(const XLCellIterator& other);
110
+
111
+ /**
112
+ * @brief
113
+ * @param other
114
+ */
115
+ [[maybe_unused]] XLCellIterator(XLCellIterator&& other) noexcept;
116
+
117
+ /**
118
+ * @brief
119
+ * @param other
120
+ * @return
121
+ */
122
+ XLCellIterator& operator=(const XLCellIterator& other);
123
+
124
+ /**
125
+ * @brief
126
+ * @param other
127
+ * @return
128
+ */
129
+ XLCellIterator& operator=(XLCellIterator&& other) noexcept;
130
+
131
+ private: // ===== Switch to private method that is used by the XLIterator increment operator++ and the dereference operators * and ->
132
+ static constexpr const bool XLCreateIfMissing = true; // code readability for updateCurrentCell parameter createIfMissing
133
+ static constexpr const bool XLDoNotCreateIfMissing = false; // "
134
+ /**
135
+ * @brief update m_currentCell by fetching (or inserting) a cell at m_currentRow, m_currentColumn
136
+ * @param createIfMissing m_currentCell will only be inserted if createIfMissing is true
137
+ */
138
+ void updateCurrentCell(bool createIfMissing);
139
+
140
+ public: // ===== Switch back to public methods
141
+ /**
142
+ * @brief
143
+ * @return
144
+ */
145
+ XLCellIterator& operator++();
146
+
147
+ /**
148
+ * @brief
149
+ * @return
150
+ */
151
+ XLCellIterator operator++(int); // NOLINT
152
+
153
+ /**
154
+ * @brief
155
+ * @return
156
+ */
157
+ reference operator*();
158
+
159
+ /**
160
+ * @brief
161
+ * @return
162
+ */
163
+ pointer operator->();
164
+
165
+ /**
166
+ * @brief
167
+ * @param rhs
168
+ * @return
169
+ */
170
+ bool operator==(const XLCellIterator& rhs) const;
171
+
172
+ /**
173
+ * @brief
174
+ * @param rhs
175
+ * @return
176
+ */
177
+ bool operator!=(const XLCellIterator& rhs) const;
178
+
179
+ /**
180
+ * @brief determine whether the cell that the iterator points to exists (cell at m_currentRow, m_currentColumn)
181
+ * @return true if XML already has an entry for that cell, otherwise false
182
+ */
183
+ bool cellExists();
184
+
185
+ /**
186
+ * @brief determine whether iterator is at 1 beyond the last cell in range
187
+ * @return
188
+ * @note 28-07-2024: Removed const from return type (Troldal)
189
+ */
190
+ bool endReached() const { return m_endReached; }
191
+
192
+ /**
193
+ * @brief
194
+ * @param last
195
+ * @return
196
+ */
197
+ uint64_t distance(const XLCellIterator& last);
198
+
199
+ /**
200
+ * @brief get the XLCellReference::address corresponding to the current iterator position
201
+ * @return an XLCellReference::address, with m_bottomRight.col() + 1 for the beyond-the-end iterator
202
+ * @note 28-07-2024: Removed const from return type (Troldal)
203
+ */
204
+ std::string address() const;
205
+
206
+ private:
207
+ std::unique_ptr<XMLNode> m_dataNode; /**< */
208
+ XLCellReference m_topLeft; /**< The cell reference of the first cell in the range */
209
+ XLCellReference m_bottomRight; /**< The cell reference of the last cell in the range */
210
+ XLSharedStringsRef m_sharedStrings; /**< */
211
+ bool m_endReached; /**< */
212
+ std::unique_ptr<XMLNode> m_hintNode; /**< The cell node of the last existing cell found up to current iterator position */
213
+ uint32_t m_hintRow; /**< the row number for m_hintCell */
214
+ XLCell m_currentCell; /**< The cell to which the iterator is currently pointing, if it exists, otherwise an empty XLCell */
215
+ static constexpr const int XLNotLoaded = 0; // code readability for m_currentCellStatus
216
+ static constexpr const int XLNoSuchCell = 1; // "
217
+ static constexpr const int XLLoaded = 2; // "
218
+ int m_currentCellStatus; /**< Status of m_currentCell: XLNotLoaded, XLNoSuchCell or XLLoaded */
219
+ uint32_t m_currentRow;
220
+ uint16_t m_currentColumn;
221
+ std::vector<XLStyleIndex> const * m_colStyles;
222
+ };
223
+
224
+ /**
225
+ * @brief ostream output of XLIterator position as XLCellReference::address
226
+ * @param os the ostream destination
227
+ * @param it the XLIterator whose position to send to the stream
228
+ * @return
229
+ */
230
+ inline std::ostream& operator<<(std::ostream& os, const XLCellIterator& it)
231
+ {
232
+ os << it.address();
233
+ return os;
234
+ }
235
+ } // namespace OpenXLSX
236
+
237
+ // ===== Template specialization for std::distance.
238
+ namespace std // NOLINT
239
+ {
240
+ using OpenXLSX::XLCellIterator;
241
+ template<>
242
+ inline std::iterator_traits<XLCellIterator>::difference_type distance<XLCellIterator>(XLCellIterator first, XLCellIterator last)
243
+ {
244
+ return static_cast<std::iterator_traits<XLCellIterator>::difference_type>(first.distance(last));
245
+ }
246
+ } // namespace std
247
+
248
+ #ifdef _MSC_VER // conditionally enable MSVC specific pragmas to avoid other compilers warning about unknown pragmas
249
+ # pragma warning(pop)
250
+ #endif // _MSC_VER
251
+
252
+ #endif // OPENXLSX_XLCELLITERATOR_HPP