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,375 @@
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_XLFORMULA_HPP
47
+ #define OPENXLSX_XLFORMULA_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
+ // ===== External Includes ===== //
56
+ #include <iostream> // std::ostream
57
+ #include <string>
58
+ #include <variant>
59
+
60
+ // ===== OpenXLSX Includes ===== //
61
+ #include "OpenXLSX-Exports.hpp"
62
+ #include "XLXmlParserForwardDeclarations.hpp"
63
+
64
+ // ========== CLASS AND ENUM TYPE DEFINITIONS ========== //
65
+ namespace OpenXLSX
66
+ {
67
+ constexpr bool XLResetValue = true;
68
+ constexpr bool XLPreserveValue = false;
69
+
70
+ //---------- Forward Declarations ----------//
71
+ class XLFormulaProxy;
72
+ class XLCell;
73
+
74
+ /**
75
+ * @brief The XLFormula class encapsulates the concept of an Excel formula. The class is essentially
76
+ * a wrapper around a std::string.
77
+ * @warning This class currently only supports simple formulas. Array formulas and shared formulas are
78
+ * not supported. Unfortunately, many spreadsheets have shared formulas, so this class is probably
79
+ * best used for adding formulas, not reading them from an existing spreadsheet.
80
+ * @todo Enable handling of shared and array formulas.
81
+ */
82
+ class OPENXLSX_EXPORT XLFormula
83
+ {
84
+ //---------- Friend Declarations ----------//
85
+
86
+ friend bool operator==(const XLFormula& lhs, const XLFormula& rhs);
87
+ friend bool operator!=(const XLFormula& lhs, const XLFormula& rhs);
88
+ friend std::ostream& operator<<(std::ostream& os, const XLFormula& value);
89
+
90
+ public:
91
+ /**
92
+ * @brief Constructor
93
+ */
94
+ XLFormula();
95
+
96
+ /**
97
+ * @brief Constructor, taking a string-type argument
98
+ * @tparam T Type of argument used. Must be string-type.
99
+ * @param formula The formula to initialize the object with.
100
+ */
101
+ template<typename T,
102
+ typename = std::enable_if_t<
103
+ std::is_same_v<std::decay_t<T>, std::string> || std::is_same_v<std::decay_t<T>, std::string_view> ||
104
+ std::is_same_v<std::decay_t<T>, const char*> || std::is_same_v<std::decay_t<T>, char*>>>
105
+ explicit XLFormula(T formula)
106
+ {
107
+ // ===== If the argument is a const char *, use the argument directly; otherwise, assume it has a .c_str() function.
108
+ if constexpr (std::is_same_v<std::decay_t<T>, const char*> || std::is_same_v<std::decay_t<T>, char*>)
109
+ m_formulaString = formula;
110
+ else if constexpr (std::is_same_v<std::decay_t<T>, std::string_view>)
111
+ m_formulaString = std::string(formula);
112
+ else
113
+ m_formulaString = formula.c_str();
114
+ }
115
+
116
+ /**
117
+ * @brief Copy constructor.
118
+ * @param other Object to be copied.
119
+ */
120
+ XLFormula(const XLFormula& other);
121
+
122
+ /**
123
+ * @brief Move constructor.
124
+ * @param other Object to be moved.
125
+ */
126
+ XLFormula(XLFormula&& other) noexcept;
127
+
128
+ /**
129
+ * @brief Destructor.
130
+ */
131
+ ~XLFormula();
132
+
133
+ /**
134
+ * @brief Copy assignment operator.
135
+ * @param other Object to be copied.
136
+ * @return Reference to copied-to object.
137
+ */
138
+ XLFormula& operator=(const XLFormula& other);
139
+
140
+ /**
141
+ * @brief Move assignment operator.
142
+ * @param other Object to be moved.
143
+ * @return Reference to moved-to object.
144
+ */
145
+ XLFormula& operator=(XLFormula&& other) noexcept;
146
+
147
+ /**
148
+ * @brief Templated assignment operator, taking a string-type object as an argument.
149
+ * @tparam T Type of argument (only string-types are allowed).
150
+ * @param formula String containing the formula.
151
+ * @return Reference to the assigned-to object.
152
+ */
153
+ template<typename T,
154
+ typename = std::enable_if_t<
155
+ std::is_same_v<std::decay_t<T>, std::string> || std::is_same_v<std::decay_t<T>, std::string_view> ||
156
+ std::is_same_v<std::decay_t<T>, const char*> || std::is_same_v<std::decay_t<T>, char*>>>
157
+ XLFormula& operator=(T formula)
158
+ {
159
+ XLFormula temp(formula);
160
+ std::swap(*this, temp);
161
+ return *this;
162
+ }
163
+
164
+ /**
165
+ * @brief Templated setter function, taking a string-type object as an argument.
166
+ * @tparam T Type of argument (only string-types are allowed).
167
+ * @param formula String containing the formula.
168
+ */
169
+ template<typename T,
170
+ typename = std::enable_if_t<
171
+ std::is_same_v<std::decay_t<T>, std::string> || std::is_same_v<std::decay_t<T>, std::string_view> ||
172
+ std::is_same_v<std::decay_t<T>, const char*> || std::is_same_v<std::decay_t<T>, char*>>>
173
+ void set(T formula)
174
+ {
175
+ *this = formula;
176
+ }
177
+
178
+ /**
179
+ * @brief Get the formula as a std::string.
180
+ * @return A std::string with the formula.
181
+ */
182
+ std::string get() const;
183
+
184
+ /**
185
+ * @brief Conversion operator, for converting object to a std::string.
186
+ * @return The formula as a std::string.
187
+ */
188
+ operator std::string() const; // NOLINT
189
+
190
+ /**
191
+ * @brief Clear the formula.
192
+ * @return Return a reference to the cleared object.
193
+ */
194
+ XLFormula& clear();
195
+
196
+ private:
197
+ std::string m_formulaString; /**< A std::string, holding the formula string.*/
198
+ };
199
+
200
+ /**
201
+ * @brief The XLFormulaProxy serves as a placeholder for XLFormula objects. This enable
202
+ * getting and setting formulas through the same interface.
203
+ */
204
+ class OPENXLSX_EXPORT XLFormulaProxy
205
+ {
206
+ friend class XLCell;
207
+ friend class XLFormula;
208
+
209
+ private:
210
+ /**
211
+ * @brief Constructor, taking pointers to the cell and cell node objects.
212
+ * @param cell Pointer to the associated cell object.
213
+ * @param cellNode Pointer to the associated cell node object.
214
+ */
215
+ XLFormulaProxy(XLCell* cell, XMLNode* cellNode);
216
+
217
+ /**
218
+ * @brief Copy constructor.
219
+ * @param other Object to be copied.
220
+ */
221
+ XLFormulaProxy(const XLFormulaProxy& other);
222
+
223
+ /**
224
+ * @brief Move constructor.
225
+ * @param other Object to be moved.
226
+ */
227
+ XLFormulaProxy(XLFormulaProxy&& other) noexcept;
228
+
229
+ public:
230
+ /**
231
+ * @brief Destructor
232
+ */
233
+ ~XLFormulaProxy();
234
+
235
+ /**
236
+ * @brief Copy assignment operator.
237
+ * @param other Object to be copied.
238
+ * @return A reference to the copied-to object.
239
+ */
240
+ XLFormulaProxy& operator=(const XLFormulaProxy& other);
241
+
242
+ private:
243
+ /**
244
+ * @brief Move assignment operator.
245
+ * @param other Object to be moved.
246
+ * @return A reference to the moved-to object.
247
+ */
248
+ XLFormulaProxy& operator=(XLFormulaProxy&& other) noexcept;
249
+
250
+ public:
251
+ /**
252
+ * @brief Templated assignment operator, taking a string-type argument.
253
+ * @tparam T Type of argument.
254
+ * @param formula The formula string to be assigned.
255
+ * @return A reference to the copied-to object.
256
+ */
257
+ template<
258
+ typename T,
259
+ typename = std::enable_if_t<std::is_same_v<std::decay_t<T>, XLFormula> || std::is_same_v<std::decay_t<T>, std::string> ||
260
+ std::is_same_v<std::decay_t<T>, std::string_view> || std::is_same_v<std::decay_t<T>, const char*> ||
261
+ std::is_same_v<std::decay_t<T>, char*>>>
262
+ XLFormulaProxy& operator=(T formula)
263
+ {
264
+ if constexpr (std::is_same_v<std::decay_t<T>, XLFormula>)
265
+ setFormulaString(formula.get().c_str());
266
+ else if constexpr (std::is_same_v<std::decay_t<T>, std::string>)
267
+ setFormulaString(formula.c_str());
268
+ else if constexpr (std::is_same_v<std::decay_t<T>, std::string_view>)
269
+ setFormulaString(std::string(formula).c_str());
270
+ else
271
+ setFormulaString(formula);
272
+
273
+ return *this;
274
+ }
275
+
276
+ /**
277
+ * @brief Templated setter, taking a string-type argument.
278
+ * @tparam T Type of argument.
279
+ * @param formula The formula string to be assigned.
280
+ */
281
+ template<typename T,
282
+ typename = std::enable_if_t<
283
+ std::is_same_v<std::decay_t<T>, std::string> || std::is_same_v<std::decay_t<T>, std::string_view> ||
284
+ std::is_same_v<std::decay_t<T>, const char*> || std::is_same_v<std::decay_t<T>, char*>>>
285
+ void set(T formula)
286
+ {
287
+ *this = formula;
288
+ }
289
+
290
+ /**
291
+ * @brief Get the formula as a std::string.
292
+ * @return A std::string with the formula.
293
+ */
294
+ std::string get() const;
295
+
296
+ /**
297
+ * @brief Clear the formula.
298
+ * @return Return a reference to the cleared object.
299
+ */
300
+ XLFormulaProxy& clear();
301
+
302
+ /**
303
+ * @brief Conversion operator, for converting the object to a std::string.
304
+ * @return The formula as a std::string.
305
+ */
306
+ operator std::string() const; // NOLINT
307
+
308
+ /**
309
+ * @brief Implicit conversion to XLFormula object.
310
+ * @return Returns the corresponding XLFormula object.
311
+ */
312
+ operator XLFormula() const; // NOLINT
313
+
314
+ private:
315
+ /**
316
+ * @brief Set the formula to the given string.
317
+ * @param formulaString String holding the formula.
318
+ * @param resetValue if true (XLResetValue), the cell value will be set to 0, if false (XLPreserveValue), it will remain unchanged
319
+ */
320
+ void setFormulaString(const char* formulaString, bool resetValue = XLResetValue);
321
+
322
+ /**
323
+ * @brief Get the underlying XLFormula object.
324
+ * @return A XLFormula object.
325
+ * @throw XLFormulaError if the formula is of 'shared' or 'array' types.
326
+ */
327
+ XLFormula getFormula() const;
328
+
329
+ //---------- Private Member Variables ---------- //
330
+ XLCell* m_cell; /**< Pointer to the owning XLCell object. */
331
+ XMLNode* m_cellNode; /**< Pointer to corresponding XML cell node. */
332
+ };
333
+ } // namespace OpenXLSX
334
+
335
+ // ========== FRIEND FUNCTION IMPLEMENTATIONS ========== //
336
+ namespace OpenXLSX
337
+ {
338
+ /**
339
+ * @brief
340
+ * @param lhs
341
+ * @param rhs
342
+ * @return
343
+ */
344
+ inline bool operator==(const XLFormula& lhs, const XLFormula& rhs) { return lhs.m_formulaString == rhs.m_formulaString; }
345
+
346
+ /**
347
+ * @brief
348
+ * @param lhs
349
+ * @param rhs
350
+ * @return
351
+ */
352
+ inline bool operator!=(const XLFormula& lhs, const XLFormula& rhs) { return lhs.m_formulaString != rhs.m_formulaString; }
353
+
354
+ /**
355
+ * @brief send a formula string to an ostream
356
+ * @param os the output destination
357
+ * @param value the formula to send to os
358
+ * @return
359
+ */
360
+ inline std::ostream& operator<<(std::ostream& os, const XLFormula& value) { return os << value.m_formulaString; }
361
+
362
+ /**
363
+ * @brief send a formula string to an ostream
364
+ * @param os the output destination
365
+ * @param value the formula proxy whose formula to send to os
366
+ * @return
367
+ */
368
+ inline std::ostream& operator<<(std::ostream& os, const XLFormulaProxy& value) { return os << value.get(); }
369
+ } // namespace OpenXLSX
370
+
371
+ #ifdef _MSC_VER // conditionally enable MSVC specific pragmas to avoid other compilers warning about unknown pragmas
372
+ # pragma warning(pop)
373
+ #endif // _MSC_VER
374
+
375
+ #endif // OPENXLSX_XLFORMULA_HPP
@@ -0,0 +1,40 @@
1
+ //
2
+ // Created by Kenneth Balslev on 22/08/2020.
3
+ //
4
+
5
+ #ifndef OPENXLSX_XLITERATOR_HPP
6
+ #define OPENXLSX_XLITERATOR_HPP
7
+
8
+ #include <memory> // std::unique_ptr
9
+
10
+ namespace OpenXLSX
11
+ {
12
+ enum class XLIteratorDirection { Forward, Reverse };
13
+ enum class XLIteratorLocation { Begin, End };
14
+
15
+ template<typename T>
16
+ class OPENXLSX_EXPORT XLReverseRange {
17
+ public:
18
+ /**
19
+ * @brief Construct a reverse range from an lvalue (existing variable)
20
+ */
21
+ XLReverseRange(T& rr)
22
+ : m_RR(nullptr),
23
+ m_rr(rr)
24
+ {}
25
+ /**
26
+ * @brief Construct a reverse range from an rvalue (temporary variable)
27
+ */
28
+ XLReverseRange(T&& rr)
29
+ : m_RR(std::make_unique<T>(rr)),
30
+ m_rr(*m_RR)
31
+ {}
32
+ typename T::reverse_iterator begin() { return m_rr.rbegin(); }
33
+ typename T::reverse_iterator end() { return m_rr.rend(); }
34
+ private:
35
+ std::unique_ptr<T> m_RR;
36
+ T& m_rr;
37
+ };
38
+ } // namespace OpenXLSX
39
+
40
+ #endif // OPENXLSX_XLITERATOR_HPP
@@ -0,0 +1,216 @@
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_XLMERGECELLS_HPP
47
+ #define OPENXLSX_XLMERGECELLS_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 <deque>
56
+ #include <limits> // std::numeric_limits
57
+ #include <memory> // std::unique_ptr
58
+ #include <ostream> // std::basic_ostream
59
+ #include <string>
60
+ #include <string_view> // std::string_view
61
+ #include <vector> // std::vector
62
+
63
+ // ===== OpenXLSX Includes ===== //
64
+ #include "OpenXLSX-Exports.hpp"
65
+ #include "XLCellReference.hpp"
66
+ #include "XLXmlParserForwardDeclarations.hpp"
67
+
68
+ namespace OpenXLSX
69
+ {
70
+ typedef int32_t XLMergeIndex;
71
+ constexpr const XLMergeIndex XLMergeNotFound = -1;
72
+
73
+ // pull request #261: wrapped max in parentheses to prevent expansion of windows.h "max" macro
74
+ constexpr size_t XLMaxMergeCells = (std::numeric_limits< XLMergeIndex >::max)();
75
+
76
+ /**
77
+ * @brief This class encapsulate the Excel concept of <mergeCells>. Each worksheet that has merged cells has a list of
78
+ * (empty) <mergeCell> elements within that array, with a sole attribute ref="..." with ... being a range reference, e.g. A1:B5
79
+ * Unfortunately, since an empty <mergeCells> element is not allowed, the class must have access to the worksheet root node and
80
+ * delete the <mergeCells> element each time the merge count is zero
81
+ */
82
+ class OPENXLSX_EXPORT XLMergeCells
83
+ {
84
+ //----------------------------------------------------------------------------------------------------------------------
85
+ // Public Member Functions
86
+ //----------------------------------------------------------------------------------------------------------------------
87
+
88
+ public:
89
+ /**
90
+ * @brief
91
+ */
92
+ XLMergeCells();
93
+
94
+ /**
95
+ * @brief
96
+ * @param node The root node of the worksheet document - must not be an empty node
97
+ * @param nodeOrder the worksheet node sequence to respect when inserting <mergeCells> node
98
+ */
99
+ explicit XLMergeCells(const XMLNode& rootNode, std::vector< std::string_view > const & nodeOrder);
100
+
101
+ /**
102
+ * @brief Destructor
103
+ */
104
+ ~XLMergeCells();
105
+
106
+ /**
107
+ * @brief Copy constructor
108
+ * @param other
109
+ */
110
+ XLMergeCells(const XLMergeCells& other);
111
+
112
+ /**
113
+ * @brief Move constructor
114
+ * @param other
115
+ */
116
+ XLMergeCells(XLMergeCells&& other);
117
+
118
+ /**
119
+ * @brief Copy assignment operator
120
+ * @param other
121
+ * @return
122
+ */
123
+ XLMergeCells& operator=(const XLMergeCells& other);
124
+
125
+ /**
126
+ * @brief Move assignment operator
127
+ * @param other
128
+ * @return
129
+ */
130
+ XLMergeCells& operator=(XLMergeCells&& other);
131
+
132
+ /**
133
+ * @brief test if XLMergeCells has been initialized with a valid XMLNode
134
+ * @return true if m_rootNode is neither nullptr nor an empty XMLNode
135
+ */
136
+ bool valid() const;
137
+
138
+ /**
139
+ * @brief get the index of a <mergeCell> entry by its reference
140
+ * @param reference the reference to search for
141
+ * @return XLMergeNotFound (-1) if no such reference exists, 0-based index otherwise
142
+ */
143
+ XLMergeIndex findMerge(const std::string& reference) const;
144
+
145
+ /**
146
+ * @brief test if a mergeCell with reference exists, equivalent to findMerge(reference) >= 0
147
+ * @param reference the reference to find
148
+ * @return true if reference exists, false otherwise
149
+ */
150
+ bool mergeExists(const std::string& reference) const;
151
+
152
+ /**
153
+ * @brief get the index of a <mergeCell> entry of which cellReference is a part
154
+ * @param cellRef the cell reference (string or XLCellReference) to search for in the merged ranges
155
+ * @return XLMergeNotFound (-1) if no such reference exists, 0-based index otherwise
156
+ */
157
+ XLMergeIndex findMergeByCell(const std::string& cellRef) const;
158
+ XLMergeIndex findMergeByCell(XLCellReference cellRef) const;
159
+
160
+ /**
161
+ * @brief get the amount of entries in <mergeCells>
162
+ * @return the count of defined cell merges
163
+ */
164
+ size_t count() const;
165
+
166
+ /**
167
+ * @brief return the cell reference string for the given index
168
+ * @param index
169
+ * @return
170
+ */
171
+ const char* merge(XLMergeIndex index) const;
172
+
173
+ /**
174
+ * @brief Operator overload: allow [] as shortcut access to merge
175
+ */
176
+ const char* operator[](XLMergeIndex index) const { return merge(index); }
177
+
178
+ /**
179
+ * @brief Append a new merge to the list of merges
180
+ * @param reference The reference to append.
181
+ * @return An XLMergeIndex with the index of the appended merge
182
+ * @throws XLInputException if the reference would overlap with an existing reference
183
+ */
184
+ XLMergeIndex appendMerge(const std::string& reference);
185
+
186
+ /**
187
+ * @brief Delete the merge at the given index.
188
+ * @param index The index to delete
189
+ * @note Previously obtained merge indexes will be invalidated when calling deleteMerge
190
+ * @throws XLInputException if the index does not exist
191
+ */
192
+ void deleteMerge(XLMergeIndex index);
193
+
194
+ /**
195
+ * @brief Delete all merges of the worksheet
196
+ */
197
+ void deleteAll();
198
+
199
+ /**
200
+ * @brief print the XML contents of the mergeCells array using the underlying XMLNode print function
201
+ */
202
+ void print(std::basic_ostream<char>& ostr) const;
203
+
204
+ private:
205
+ std::unique_ptr<XMLNode> m_rootNode; /**< An XMLNode object with the worksheet root node (document element) */
206
+ std::vector< std::string_view > m_nodeOrder; /**< worksheet XML root node required child sequence as passed into constructor */
207
+ std::unique_ptr<XMLNode> m_mergeCellsNode; /**< An XMLNode object with the mergeCells item */
208
+ std::deque<std::string> m_referenceCache;
209
+ };
210
+ } // namespace OpenXLSX
211
+
212
+ #ifdef _MSC_VER // conditionally enable MSVC specific pragmas to avoid other compilers warning about unknown pragmas
213
+ # pragma warning(pop)
214
+ #endif // _MSC_VER
215
+
216
+ #endif // OPENXLSX_XLMERGECELLS_HPP