react-native-nitro-xlsx 0.2.5 → 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.
- package/NitroXlsx.podspec +26 -27
- package/Package.swift +31 -10
- package/README.md +21 -9
- package/android/CMakeLists.txt +20 -27
- package/cpp/HybridNitroXlsx.cpp +25 -1
- package/cpp/HybridXlsxCellFormat.cpp +46 -146
- package/cpp/HybridXlsxCellFormat.hpp +9 -41
- package/cpp/HybridXlsxConditionalFormat.cpp +4 -1
- package/cpp/HybridXlsxConditionalFormats.cpp +5 -1
- package/cpp/HybridXlsxWorkbook.cpp +38 -8
- package/cpp/HybridXlsxWorkbook.hpp +10 -1
- package/cpp/HybridXlsxWorksheet.cpp +422 -141
- package/cpp/HybridXlsxWorksheet.hpp +4 -1
- package/cpp/XlsxCacheDir.cpp +25 -2
- package/cpp/XlsxCacheDir.hpp +3 -1
- package/cpp/XlsxCellStyle.hpp +360 -0
- package/cpp/XlsxJson.cpp +29 -8
- package/package.json +2 -2
- package/scripts/run-cpp-tests.sh +1 -1
- package/scripts/sync-openxlsx-headers.sh +34 -0
- package/src/__mocks__/react-native-nitro-modules.ts +523 -20
- package/src/__tests__/index.test.ts +124 -16
- package/src/index.ts +13 -13
- package/thirdparty/OpenXLSX/.clang-format +118 -0
- package/thirdparty/OpenXLSX/.clang-tidy +28 -0
- package/thirdparty/OpenXLSX/.gitignore +130 -0
- package/thirdparty/OpenXLSX/Benchmarks/2024-07-29-benchmarks_before_XMLNode_wrappers +46 -0
- package/thirdparty/OpenXLSX/Benchmarks/2024-07-29-benchmarks_with_XMLNode_wrappers_and_namespace_and_stripping +49 -0
- package/thirdparty/OpenXLSX/Benchmarks/2024-07-29-benchmarks_with_XMLNode_wrappers_and_namespace_char_support +49 -0
- package/thirdparty/OpenXLSX/Benchmarks/2024-07-29-benchmarks_with_XMLNode_wrappers_and_namespace_support +49 -0
- package/thirdparty/OpenXLSX/Benchmarks/2024-07-29-benchmarks_with_XMLNode_wrappers_and_namespaced_name_disabled +49 -0
- package/thirdparty/OpenXLSX/Benchmarks/2024-08-11-benchmarks_post-XLCellIterator-Rework +46 -0
- package/thirdparty/OpenXLSX/Benchmarks/2024-08-14-benchmarks_post-default-row-column-style-support +46 -0
- package/thirdparty/OpenXLSX/Benchmarks/2024-09-02-benchmarks +46 -0
- package/thirdparty/OpenXLSX/Benchmarks/2024-12-19-benchmarks +46 -0
- package/thirdparty/OpenXLSX/Benchmarks/2024-12-30-benchmarks-post-XLSharedStrings-by-ref +46 -0
- package/thirdparty/OpenXLSX/Benchmarks/2025-01-09-benchmarks-post-conditionalFormatsAndSheetProtection +46 -0
- package/thirdparty/OpenXLSX/Benchmarks/2025-01-10-benchmarks-post-XLCellValue-bugfix +46 -0
- package/thirdparty/OpenXLSX/Benchmarks/2025-01-31-benchmarks-post-XLComments-implementation +46 -0
- package/thirdparty/OpenXLSX/Benchmarks/2025-02-02-benchmarks-post-XLRowIterator-Rework +46 -0
- package/thirdparty/OpenXLSX/Benchmarks/2025-07-20-benchmarks-after-hiding-pugixml-internals +46 -0
- package/thirdparty/OpenXLSX/Benchmarks/2025-08-29-benchmarks-after-code-review-with-libzip +46 -0
- package/thirdparty/OpenXLSX/Benchmarks/Benchmark.cpp +249 -0
- package/thirdparty/OpenXLSX/Benchmarks/CMakeLists.txt +19 -0
- package/thirdparty/OpenXLSX/CMakeLists.txt +466 -0
- package/thirdparty/OpenXLSX/Documentation/CMakeLists.txt +31 -0
- package/thirdparty/OpenXLSX/Documentation/Doxyfile.in +2471 -0
- package/thirdparty/OpenXLSX/Documentation/DoxygenLayout.xml +194 -0
- package/thirdparty/OpenXLSX/Documentation/customdoxygen.css +1355 -0
- package/thirdparty/OpenXLSX/Examples/CMakeLists.txt +103 -0
- package/thirdparty/OpenXLSX/Examples/Demo1.cpp +279 -0
- package/thirdparty/OpenXLSX/Examples/Demo10.cpp +545 -0
- package/thirdparty/OpenXLSX/Examples/Demo1A.cpp +137 -0
- package/thirdparty/OpenXLSX/Examples/Demo2.cpp +65 -0
- package/thirdparty/OpenXLSX/Examples/Demo3.cpp +89 -0
- package/thirdparty/OpenXLSX/Examples/Demo4.cpp +86 -0
- package/thirdparty/OpenXLSX/Examples/Demo5.cpp +77 -0
- package/thirdparty/OpenXLSX/Examples/Demo6.cpp +103 -0
- package/thirdparty/OpenXLSX/Examples/Demo7.cpp +79 -0
- package/thirdparty/OpenXLSX/Examples/Demo8.cpp +117 -0
- package/thirdparty/OpenXLSX/Examples/Demo9.cpp +363 -0
- package/thirdparty/OpenXLSX/Examples/cmake/FindLIBZIP.cmake +61 -0
- package/thirdparty/OpenXLSX/Examples/external/CustomZip/CustomZip.hpp +256 -0
- package/thirdparty/OpenXLSX/LICENSE.md +29 -0
- package/thirdparty/OpenXLSX/Makefile.GNU +530 -0
- package/thirdparty/OpenXLSX/Notes/TBDs.txt +16 -0
- package/thirdparty/OpenXLSX/Notes/confirmed-TBCs.txt +8 -0
- package/thirdparty/OpenXLSX/Notes/styles-missing-support.xml +12 -0
- package/thirdparty/OpenXLSX/Notes/todo-list.txt +108 -0
- package/thirdparty/OpenXLSX/OpenXLSX/CMakeLists.txt +631 -0
- package/thirdparty/OpenXLSX/OpenXLSX/OpenXLSX.hpp +63 -0
- package/thirdparty/OpenXLSX/OpenXLSX/OpenXLSXConfig.cmake +11 -0
- package/thirdparty/OpenXLSX/OpenXLSX/cmake/bundle_static_library.cmake +198 -0
- package/thirdparty/OpenXLSX/OpenXLSX/cmake/patch_pkg_config.cmake +69 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/IZipArchive.hpp +361 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/IZipArchive.hpp +361 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/OpenXLSX-Exports.hpp +12 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLCell.hpp +367 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLCellIterator.hpp +252 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLCellRange.hpp +223 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLCellReference.hpp +317 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLCellValue.hpp +793 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLColor.hpp +232 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLColumn.hpp +159 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLCommandQuery.hpp +228 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLComments.hpp +270 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLConstants.hpp +18 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLContentTypes.hpp +264 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLDateTime.hpp +175 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLDocument.hpp +505 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLDrawing.hpp +452 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLException.hpp +161 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLFormula.hpp +375 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLIterator.hpp +40 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLMergeCells.hpp +216 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLProperties.hpp +348 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLRelationships.hpp +348 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLRow.hpp +721 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLRowData.hpp +488 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLSharedStrings.hpp +204 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLSheet.hpp +1640 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLStyles.hpp +2390 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLTables.hpp +132 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLWorkbook.hpp +404 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLXmlData.hpp +283 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLXmlFile.hpp +194 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLXmlParser.hpp +282 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLXmlParserForwardDeclarations.hpp +85 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLZipArchive.hpp +232 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/detail/LibZip.hpp +447 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/detail/OpenXLSXFileSystemTools.hpp +207 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/detail/Zippy.hpp +1375 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX-Exports.hpp +12 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLCell.hpp +367 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLCellIterator.hpp +252 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLCellRange.hpp +223 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLCellReference.hpp +317 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLCellValue.hpp +793 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLColor.hpp +232 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLColumn.hpp +159 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLCommandQuery.hpp +228 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLComments.hpp +270 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLConstants.hpp +18 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLContentTypes.hpp +264 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLDateTime.hpp +175 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLDocument.hpp +505 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLDrawing.hpp +452 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLException.hpp +161 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLFormula.hpp +375 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLIterator.hpp +40 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLMergeCells.hpp +216 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLProperties.hpp +348 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLRelationships.hpp +348 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLRow.hpp +721 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLRowData.hpp +488 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLSharedStrings.hpp +204 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLSheet.hpp +1640 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLStyles.hpp +2390 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLTables.hpp +132 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLWorkbook.hpp +404 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLXmlData.hpp +283 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLXmlFile.hpp +194 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLXmlParser.hpp +282 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLXmlParserForwardDeclarations.hpp +85 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLZipArchive.hpp +232 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/detail/LibZip.hpp +447 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/detail/OpenXLSXFileSystemTools.hpp +207 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/detail/Zippy.hpp +1375 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLCell.cpp +340 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLCellIterator.cpp +427 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLCellRange.cpp +221 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLCellReference.cpp +408 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLCellValue.cpp +519 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLColor.cpp +202 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLColumn.cpp +141 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLComments.cpp +637 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLContentTypes.cpp +329 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLDateTime.cpp +269 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLDocument.cpp +1678 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLDrawing.cpp +784 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLFormula.cpp +201 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLMergeCells.cpp +357 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLProperties.cpp +810 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLRelationships.cpp +529 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLRow.cpp +918 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLRowData.cpp +508 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLSharedStrings.cpp +220 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLSheet.cpp +1970 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLStyles.cpp +3014 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLTables.cpp +125 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLWorkbook.cpp +784 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLXmlData.cpp +247 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLXmlFile.cpp +160 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLXmlParser.cpp +261 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLZipArchive.cpp +266 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/utilities/XLUtilities.hpp +478 -0
- package/thirdparty/OpenXLSX/README.md +1279 -0
- package/thirdparty/OpenXLSX/Scripts/cmake-cleanup.sh +102 -0
- package/thirdparty/OpenXLSX/Scripts/compile.sh +23 -0
- package/thirdparty/OpenXLSX/Scripts/demos-cleanup.sh +25 -0
- package/thirdparty/OpenXLSX/Scripts/demos-run-all.sh +60 -0
- package/thirdparty/OpenXLSX/Scripts/guarded-xml-format.sh +47 -0
- package/thirdparty/OpenXLSX/Scripts/make-gnu.sh +11 -0
- package/thirdparty/OpenXLSX/Scripts/uninstall-manifest.sh +48 -0
- package/thirdparty/OpenXLSX/Scripts/xml-format-all.sh +19 -0
- package/thirdparty/OpenXLSX/Scripts/xml-format.sh +38 -0
- package/thirdparty/OpenXLSX/Tests/CMakeLists.txt +37 -0
- package/thirdparty/OpenXLSX/Tests/catch/catch.hpp +17799 -0
- package/thirdparty/OpenXLSX/Tests/catch/catch_reporter_automake.hpp +68 -0
- package/thirdparty/OpenXLSX/Tests/catch/catch_reporter_sonarqube.hpp +182 -0
- package/thirdparty/OpenXLSX/Tests/catch/catch_reporter_tap.hpp +278 -0
- package/thirdparty/OpenXLSX/Tests/catch/catch_reporter_teamcity.hpp +212 -0
- package/thirdparty/OpenXLSX/Tests/main.cpp +55 -0
- package/thirdparty/OpenXLSX/Tests/testXLCell.cpp +176 -0
- package/thirdparty/OpenXLSX/Tests/testXLCellRange.cpp +180 -0
- package/thirdparty/OpenXLSX/Tests/testXLCellReference.cpp +160 -0
- package/thirdparty/OpenXLSX/Tests/testXLCellValue.cpp +366 -0
- package/thirdparty/OpenXLSX/Tests/testXLCellValueProxy.cpp +255 -0
- package/thirdparty/OpenXLSX/Tests/testXLColor.cpp +75 -0
- package/thirdparty/OpenXLSX/Tests/testXLDateTime.cpp +229 -0
- package/thirdparty/OpenXLSX/Tests/testXLDocument.cpp +197 -0
- package/thirdparty/OpenXLSX/Tests/testXLFormula.cpp +131 -0
- package/thirdparty/OpenXLSX/Tests/testXLRow.cpp +597 -0
- package/thirdparty/OpenXLSX/Tests/testXLSheet.cpp +77 -0
- package/thirdparty/OpenXLSX/Tests/ziptest-with-libs.cpp +88 -0
- package/thirdparty/OpenXLSX/Tests/ziptest.cpp +735 -0
- package/thirdparty/OpenXLSX/cmake/get-git-HEAD-ID.cmake +45 -0
- package/thirdparty/OpenXLSX/cmake/libopenxlsxCPackOptions.cmake.in +20 -0
- package/thirdparty/OpenXLSX/cmake/manage_dependency.cmake +813 -0
- package/thirdparty/OpenXLSX/cmake/recursive_library_type_test.cmake +52 -0
- package/thirdparty/OpenXLSX/gnu-make-crutch/OpenXLSX-Exports-shared.hpp +42 -0
- package/thirdparty/OpenXLSX/gnu-make-crutch/OpenXLSX-Exports-static.hpp +42 -0
- package/thirdparty/OpenXLSX/vcpkg.json +24 -0
- package/thirdparty/README.md +46 -0
- package/thirdparty/miniz/.clang-format +47 -0
- package/thirdparty/miniz/.travis.yml +2 -0
- package/thirdparty/miniz/CMakeLists.txt +333 -0
- package/thirdparty/miniz/CMakePresets.json +31 -0
- package/thirdparty/miniz/ChangeLog.md +272 -0
- package/thirdparty/miniz/Config.cmake.in +1 -0
- package/thirdparty/miniz/LICENSE +22 -0
- package/thirdparty/miniz/amalgamate.sh +57 -0
- package/thirdparty/miniz/examples/example1.c +105 -0
- package/thirdparty/miniz/examples/example2.c +164 -0
- package/thirdparty/miniz/examples/example3.c +269 -0
- package/thirdparty/miniz/examples/example4.c +102 -0
- package/thirdparty/miniz/examples/example5.c +327 -0
- package/thirdparty/miniz/examples/example6.c +189 -0
- package/thirdparty/miniz/meson.build +21 -0
- package/thirdparty/miniz/miniz.c +646 -0
- package/thirdparty/miniz/miniz.h +615 -0
- package/thirdparty/miniz/miniz.pc.in +13 -0
- package/thirdparty/miniz/miniz_common.h +89 -0
- package/thirdparty/miniz/miniz_export.h +20 -0
- package/thirdparty/miniz/miniz_tdef.c +1602 -0
- package/thirdparty/miniz/miniz_tdef.h +199 -0
- package/thirdparty/miniz/miniz_tinfl.c +778 -0
- package/thirdparty/miniz/miniz_tinfl.h +150 -0
- package/thirdparty/miniz/miniz_zip.c +4895 -0
- package/thirdparty/miniz/miniz_zip.h +454 -0
- package/thirdparty/miniz/readme.md +46 -0
- package/thirdparty/miniz/test.sh +36 -0
- package/thirdparty/miniz/tests/add_in_place_fuzzer.c +87 -0
- package/thirdparty/miniz/tests/catch_amalgamated.cpp +10795 -0
- package/thirdparty/miniz/tests/catch_amalgamated.hpp +13143 -0
- package/thirdparty/miniz/tests/checksum_fuzzer.c +26 -0
- package/thirdparty/miniz/tests/compress_fuzzer.c +91 -0
- package/thirdparty/miniz/tests/flush_fuzzer.c +88 -0
- package/thirdparty/miniz/tests/fuzz_main.c +55 -0
- package/thirdparty/miniz/tests/large_fuzzer.c +133 -0
- package/thirdparty/miniz/tests/main.cpp +185 -0
- package/thirdparty/miniz/tests/miniz_tdefl_fuzzer.cc +115 -0
- package/thirdparty/miniz/tests/miniz_tester.cpp +1881 -0
- package/thirdparty/miniz/tests/miniz_zip_validate_fuzzer.cc +71 -0
- package/thirdparty/miniz/tests/miniz_zip_writer_fuzzer.cc +96 -0
- package/thirdparty/miniz/tests/ossfuzz.sh +48 -0
- package/thirdparty/miniz/tests/small_fuzzer.c +126 -0
- package/thirdparty/miniz/tests/timer.cpp +152 -0
- package/thirdparty/miniz/tests/timer.h +40 -0
- package/thirdparty/miniz/tests/uncompress2_fuzzer.c +21 -0
- package/thirdparty/miniz/tests/uncompress_fuzzer.c +30 -0
- package/thirdparty/miniz/tests/zip.dict +9 -0
- package/thirdparty/miniz/tests/zip_fuzzer.c +63 -0
- package/thirdparty/pugixml/.codecov.yml +7 -0
- package/thirdparty/pugixml/.gitattributes +1 -0
- package/thirdparty/pugixml/CMakeLists.txt +330 -0
- package/thirdparty/pugixml/LICENSE.md +24 -0
- package/thirdparty/pugixml/Makefile +98 -0
- package/thirdparty/pugixml/README.md +81 -0
- package/thirdparty/pugixml/SECURITY.md +9 -0
- package/thirdparty/pugixml/appveyor.yml +50 -0
- package/thirdparty/pugixml/docs/config.adoc +7 -0
- package/thirdparty/pugixml/docs/images/dom_tree.png +0 -0
- package/thirdparty/pugixml/docs/images/vs2005_link1.png +0 -0
- package/thirdparty/pugixml/docs/images/vs2005_link2.png +0 -0
- package/thirdparty/pugixml/docs/images/vs2005_pch1.png +0 -0
- package/thirdparty/pugixml/docs/images/vs2005_pch2.png +0 -0
- package/thirdparty/pugixml/docs/images/vs2005_pch3.png +0 -0
- package/thirdparty/pugixml/docs/images/vs2005_pch4.png +0 -0
- package/thirdparty/pugixml/docs/images/vs2010_link1.png +0 -0
- package/thirdparty/pugixml/docs/images/vs2010_link2.png +0 -0
- package/thirdparty/pugixml/docs/manual.adoc +3326 -0
- package/thirdparty/pugixml/docs/manual.html +6395 -0
- package/thirdparty/pugixml/docs/quickstart.adoc +287 -0
- package/thirdparty/pugixml/docs/quickstart.html +1107 -0
- package/thirdparty/pugixml/docs/samples/character.xml +8 -0
- package/thirdparty/pugixml/docs/samples/custom_memory_management.cpp +27 -0
- package/thirdparty/pugixml/docs/samples/include.cpp +64 -0
- package/thirdparty/pugixml/docs/samples/load_error_handling.cpp +33 -0
- package/thirdparty/pugixml/docs/samples/load_file.cpp +16 -0
- package/thirdparty/pugixml/docs/samples/load_memory.cpp +66 -0
- package/thirdparty/pugixml/docs/samples/load_options.cpp +30 -0
- package/thirdparty/pugixml/docs/samples/load_stream.cpp +97 -0
- package/thirdparty/pugixml/docs/samples/modify_add.cpp +29 -0
- package/thirdparty/pugixml/docs/samples/modify_base.cpp +43 -0
- package/thirdparty/pugixml/docs/samples/modify_remove.cpp +27 -0
- package/thirdparty/pugixml/docs/samples/save_custom_writer.cpp +116 -0
- package/thirdparty/pugixml/docs/samples/save_declaration.cpp +27 -0
- package/thirdparty/pugixml/docs/samples/save_file.cpp +17 -0
- package/thirdparty/pugixml/docs/samples/save_options.cpp +48 -0
- package/thirdparty/pugixml/docs/samples/save_stream.cpp +18 -0
- package/thirdparty/pugixml/docs/samples/save_subtree.cpp +26 -0
- package/thirdparty/pugixml/docs/samples/text.cpp +35 -0
- package/thirdparty/pugixml/docs/samples/transitions.xml +7 -0
- package/thirdparty/pugixml/docs/samples/traverse_base.cpp +51 -0
- package/thirdparty/pugixml/docs/samples/traverse_iter.cpp +27 -0
- package/thirdparty/pugixml/docs/samples/traverse_predicate.cpp +48 -0
- package/thirdparty/pugixml/docs/samples/traverse_rangefor.cpp +32 -0
- package/thirdparty/pugixml/docs/samples/traverse_walker.cpp +35 -0
- package/thirdparty/pugixml/docs/samples/tree.xml +12 -0
- package/thirdparty/pugixml/docs/samples/weekly-shift_jis.xml +78 -0
- package/thirdparty/pugixml/docs/samples/weekly-utf-16.xml +0 -0
- package/thirdparty/pugixml/docs/samples/weekly-utf-8.xml +78 -0
- package/thirdparty/pugixml/docs/samples/xgconsole.xml +12 -0
- package/thirdparty/pugixml/docs/samples/xpath_error.cpp +43 -0
- package/thirdparty/pugixml/docs/samples/xpath_query.cpp +36 -0
- package/thirdparty/pugixml/docs/samples/xpath_select.cpp +28 -0
- package/thirdparty/pugixml/docs/samples/xpath_variables.cpp +38 -0
- package/thirdparty/pugixml/readme.txt +50 -0
- package/thirdparty/pugixml/scripts/archive.py +54 -0
- package/thirdparty/pugixml/scripts/cocoapods_push.sh +4 -0
- package/thirdparty/pugixml/scripts/natvis/pugixml.natvis +77 -0
- package/thirdparty/pugixml/scripts/natvis/pugixml_compact.natvis +506 -0
- package/thirdparty/pugixml/scripts/nuget/build/native/pugixml-propertiesui.xml +17 -0
- package/thirdparty/pugixml/scripts/nuget/build/native/pugixml.targets +28 -0
- package/thirdparty/pugixml/scripts/nuget/pugixml.nuspec +20 -0
- package/thirdparty/pugixml/scripts/nuget_build.ps1 +60 -0
- package/thirdparty/pugixml/scripts/premake4.lua +92 -0
- package/thirdparty/pugixml/scripts/pugixml-config.cmake.in +12 -0
- package/thirdparty/pugixml/scripts/pugixml.pc.in +11 -0
- package/thirdparty/pugixml/scripts/pugixml.podspec +14 -0
- package/thirdparty/pugixml/scripts/pugixml.xcodeproj/project.pbxproj +212 -0
- package/thirdparty/pugixml/scripts/pugixml_airplay.mkf +13 -0
- package/thirdparty/pugixml/scripts/pugixml_codeblocks.cbp +44 -0
- package/thirdparty/pugixml/scripts/pugixml_codelite.project +56 -0
- package/thirdparty/pugixml/scripts/pugixml_dll.rc +45 -0
- package/thirdparty/pugixml/scripts/pugixml_vs2005.vcproj +343 -0
- package/thirdparty/pugixml/scripts/pugixml_vs2005_static.vcproj +343 -0
- package/thirdparty/pugixml/scripts/pugixml_vs2008.vcproj +339 -0
- package/thirdparty/pugixml/scripts/pugixml_vs2008_static.vcproj +339 -0
- package/thirdparty/pugixml/scripts/pugixml_vs2010.vcxproj +191 -0
- package/thirdparty/pugixml/scripts/pugixml_vs2010_static.vcxproj +191 -0
- package/thirdparty/pugixml/scripts/pugixml_vs2013.vcxproj +199 -0
- package/thirdparty/pugixml/scripts/pugixml_vs2013_static.vcxproj +199 -0
- package/thirdparty/pugixml/scripts/pugixml_vs2015.vcxproj +172 -0
- package/thirdparty/pugixml/scripts/pugixml_vs2015_static.vcxproj +176 -0
- package/thirdparty/pugixml/scripts/pugixml_vs2017.vcxproj +172 -0
- package/thirdparty/pugixml/scripts/pugixml_vs2017_static.vcxproj +176 -0
- package/thirdparty/pugixml/scripts/pugixml_vs2019.vcxproj +176 -0
- package/thirdparty/pugixml/scripts/pugixml_vs2019_static.vcxproj +180 -0
- package/thirdparty/pugixml/scripts/pugixml_vs2022.vcxproj +176 -0
- package/thirdparty/pugixml/scripts/pugixml_vs2022_static.vcxproj +180 -0
- package/thirdparty/pugixml/scripts/pugixml_vs2026.vcxproj +176 -0
- package/thirdparty/pugixml/scripts/pugixml_vs2026_static.vcxproj +180 -0
- package/thirdparty/pugixml/scripts/sbom.cdx.json +47 -0
- package/thirdparty/pugixml/src/pugiconfig.hpp +81 -0
- package/thirdparty/pugixml/src/pugixml.cpp +13776 -0
- package/thirdparty/pugixml/src/pugixml.hpp +1604 -0
- package/thirdparty/pugixml/tests/allocator.cpp +175 -0
- package/thirdparty/pugixml/tests/allocator.hpp +10 -0
- package/thirdparty/pugixml/tests/autotest-appveyor.ps1 +93 -0
- package/thirdparty/pugixml/tests/cmake-appveyor.ps1 +57 -0
- package/thirdparty/pugixml/tests/data/empty.xml +0 -0
- package/thirdparty/pugixml/tests/data/large.xml +1 -0
- package/thirdparty/pugixml/tests/data/latintest_latin1.xml +1 -0
- package/thirdparty/pugixml/tests/data/latintest_utf8.xml +1 -0
- package/thirdparty/pugixml/tests/data/multiline.xml +3 -0
- package/thirdparty/pugixml/tests/data/small.xml +1 -0
- package/thirdparty/pugixml/tests/data/truncation.xml +19 -0
- package/thirdparty/pugixml/tests/data/utftest_utf16_be.xml +0 -0
- package/thirdparty/pugixml/tests/data/utftest_utf16_be_bom.xml +0 -0
- package/thirdparty/pugixml/tests/data/utftest_utf16_be_clean.xml +0 -0
- package/thirdparty/pugixml/tests/data/utftest_utf16_be_nodecl.xml +0 -0
- package/thirdparty/pugixml/tests/data/utftest_utf16_le.xml +0 -0
- package/thirdparty/pugixml/tests/data/utftest_utf16_le_bom.xml +0 -0
- package/thirdparty/pugixml/tests/data/utftest_utf16_le_clean.xml +0 -0
- package/thirdparty/pugixml/tests/data/utftest_utf16_le_nodecl.xml +0 -0
- package/thirdparty/pugixml/tests/data/utftest_utf32_be.xml +0 -0
- package/thirdparty/pugixml/tests/data/utftest_utf32_be_bom.xml +0 -0
- package/thirdparty/pugixml/tests/data/utftest_utf32_be_clean.xml +0 -0
- package/thirdparty/pugixml/tests/data/utftest_utf32_be_nodecl.xml +0 -0
- package/thirdparty/pugixml/tests/data/utftest_utf32_le.xml +0 -0
- package/thirdparty/pugixml/tests/data/utftest_utf32_le_bom.xml +0 -0
- package/thirdparty/pugixml/tests/data/utftest_utf32_le_clean.xml +0 -0
- package/thirdparty/pugixml/tests/data/utftest_utf32_le_nodecl.xml +0 -0
- package/thirdparty/pugixml/tests/data/utftest_utf8.xml +87 -0
- package/thirdparty/pugixml/tests/data/utftest_utf8_bom.xml +87 -0
- package/thirdparty/pugixml/tests/data/utftest_utf8_clean.xml +84 -0
- package/thirdparty/pugixml/tests/data/utftest_utf8_nodecl.xml +86 -0
- package/thirdparty/pugixml/tests/data//321/202/320/265/321/201/321/202.xml +1 -0
- package/thirdparty/pugixml/tests/data_fuzz_parse/basic.xml +1 -0
- package/thirdparty/pugixml/tests/data_fuzz_parse/doctype.xml +1 -0
- package/thirdparty/pugixml/tests/data_fuzz_parse/refs.xml +1 -0
- package/thirdparty/pugixml/tests/data_fuzz_parse/types.xml +1 -0
- package/thirdparty/pugixml/tests/data_fuzz_parse/utf16.xml +0 -0
- package/thirdparty/pugixml/tests/data_fuzz_parse/utf32.xml +0 -0
- package/thirdparty/pugixml/tests/data_fuzz_xpath/basic.xpath +1 -0
- package/thirdparty/pugixml/tests/data_fuzz_xpath/functions.xpath +1 -0
- package/thirdparty/pugixml/tests/data_fuzz_xpath/math.xpath +1 -0
- package/thirdparty/pugixml/tests/data_fuzz_xpath/path.xpath +1 -0
- package/thirdparty/pugixml/tests/data_fuzz_xpath/predicate.xpath +1 -0
- package/thirdparty/pugixml/tests/fuzz_parse.cpp +14 -0
- package/thirdparty/pugixml/tests/fuzz_parse.dict +72 -0
- package/thirdparty/pugixml/tests/fuzz_setup.sh +11 -0
- package/thirdparty/pugixml/tests/fuzz_xpath.cpp +46 -0
- package/thirdparty/pugixml/tests/fuzz_xpath.dict +72 -0
- package/thirdparty/pugixml/tests/helpers.hpp +114 -0
- package/thirdparty/pugixml/tests/main.cpp +218 -0
- package/thirdparty/pugixml/tests/test.cpp +220 -0
- package/thirdparty/pugixml/tests/test.hpp +175 -0
- package/thirdparty/pugixml/tests/test_compact.cpp +150 -0
- package/thirdparty/pugixml/tests/test_deprecated.cpp +25 -0
- package/thirdparty/pugixml/tests/test_document.cpp +1910 -0
- package/thirdparty/pugixml/tests/test_dom_modify.cpp +2122 -0
- package/thirdparty/pugixml/tests/test_dom_text.cpp +601 -0
- package/thirdparty/pugixml/tests/test_dom_traverse.cpp +1481 -0
- package/thirdparty/pugixml/tests/test_header_guard.cpp +3 -0
- package/thirdparty/pugixml/tests/test_header_iosfwd_1.cpp +3 -0
- package/thirdparty/pugixml/tests/test_header_iosfwd_2.cpp +3 -0
- package/thirdparty/pugixml/tests/test_header_iostream_1.cpp +3 -0
- package/thirdparty/pugixml/tests/test_header_iostream_2.cpp +3 -0
- package/thirdparty/pugixml/tests/test_header_only_1.cpp +21 -0
- package/thirdparty/pugixml/tests/test_header_only_2.cpp +21 -0
- package/thirdparty/pugixml/tests/test_header_string_1.cpp +3 -0
- package/thirdparty/pugixml/tests/test_header_string_2.cpp +3 -0
- package/thirdparty/pugixml/tests/test_header_string_iostream.cpp +5 -0
- package/thirdparty/pugixml/tests/test_memory.cpp +303 -0
- package/thirdparty/pugixml/tests/test_parse.cpp +1463 -0
- package/thirdparty/pugixml/tests/test_parse_doctype.cpp +366 -0
- package/thirdparty/pugixml/tests/test_unicode.cpp +152 -0
- package/thirdparty/pugixml/tests/test_version.cpp +5 -0
- package/thirdparty/pugixml/tests/test_write.cpp +757 -0
- package/thirdparty/pugixml/tests/test_xpath.cpp +833 -0
- package/thirdparty/pugixml/tests/test_xpath_api.cpp +646 -0
- package/thirdparty/pugixml/tests/test_xpath_functions.cpp +844 -0
- package/thirdparty/pugixml/tests/test_xpath_operators.cpp +566 -0
- package/thirdparty/pugixml/tests/test_xpath_parse.cpp +428 -0
- package/thirdparty/pugixml/tests/test_xpath_paths.cpp +787 -0
- package/thirdparty/pugixml/tests/test_xpath_paths_abbrev_w3c.cpp +219 -0
- package/thirdparty/pugixml/tests/test_xpath_paths_w3c.cpp +312 -0
- package/thirdparty/pugixml/tests/test_xpath_variables.cpp +683 -0
- package/thirdparty/pugixml/tests/test_xpath_xalan_1.cpp +411 -0
- package/thirdparty/pugixml/tests/test_xpath_xalan_2.cpp +417 -0
- package/thirdparty/pugixml/tests/test_xpath_xalan_3.cpp +321 -0
- package/thirdparty/pugixml/tests/test_xpath_xalan_4.cpp +300 -0
- package/thirdparty/pugixml/tests/test_xpath_xalan_5.cpp +295 -0
- package/thirdparty/pugixml/tests/writer_string.cpp +79 -0
- package/thirdparty/pugixml/tests/writer_string.hpp +27 -0
- package/scripts/prepare-openxlsx.js +0 -126
|
@@ -0,0 +1,427 @@
|
|
|
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
|
+
// ===== External Includes ===== //
|
|
47
|
+
|
|
48
|
+
// ===== OpenXLSX Includes ===== //
|
|
49
|
+
#include "XLCellIterator.hpp"
|
|
50
|
+
#include "XLCellRange.hpp"
|
|
51
|
+
#include "XLCellReference.hpp"
|
|
52
|
+
#include "XLException.hpp"
|
|
53
|
+
#include "XLXmlParser.hpp" // pugixml wrapper
|
|
54
|
+
#include "utilities/XLUtilities.hpp"
|
|
55
|
+
|
|
56
|
+
using namespace OpenXLSX;
|
|
57
|
+
|
|
58
|
+
namespace OpenXLSX { // utility functions findRowNode and findCellNode
|
|
59
|
+
/**
|
|
60
|
+
* @details
|
|
61
|
+
*/
|
|
62
|
+
XMLNode findRowNode(XMLNode sheetDataNode, uint32_t rowNumber)
|
|
63
|
+
{
|
|
64
|
+
if (rowNumber < 1 || rowNumber > OpenXLSX::MAX_ROWS) {
|
|
65
|
+
using namespace std::literals::string_literals;
|
|
66
|
+
throw XLCellAddressError("rowNumber "s + std::to_string( rowNumber ) + " is outside valid range [1;"s + std::to_string(OpenXLSX::MAX_ROWS) + "]"s);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// ===== Get the last child of sheetDataNode that is of type node_element.
|
|
70
|
+
XMLNode rowNode = sheetDataNode.last_child_of_type(pugi::node_element);
|
|
71
|
+
|
|
72
|
+
// ===== If there are now rows in the worksheet, or the requested row is beyond the current max row, return an empty node
|
|
73
|
+
if (rowNode.empty() || (rowNumber > rowNode.attribute("r").as_ullong()))
|
|
74
|
+
return XMLNode{};
|
|
75
|
+
|
|
76
|
+
// ===== If the requested node is closest to the end, start from the end and search backwards.
|
|
77
|
+
if (rowNode.attribute("r").as_ullong() - rowNumber < rowNumber) {
|
|
78
|
+
while (not rowNode.empty() && (rowNode.attribute("r").as_ullong() > rowNumber)) rowNode = rowNode.previous_sibling_of_type(pugi::node_element);
|
|
79
|
+
if (rowNode.empty() || (rowNode.attribute("r").as_ullong() != rowNumber))
|
|
80
|
+
return XMLNode{};
|
|
81
|
+
}
|
|
82
|
+
// ===== Otherwise, start from the beginning
|
|
83
|
+
else {
|
|
84
|
+
// ===== At this point, it is guaranteed that there is at least one node_element in the row that is not empty.
|
|
85
|
+
rowNode = sheetDataNode.first_child_of_type(pugi::node_element);
|
|
86
|
+
|
|
87
|
+
// ===== It has been verified above that the requested rowNumber is <= the row number of the last node_element, therefore this loop will halt.
|
|
88
|
+
while (rowNode.attribute("r").as_ullong() < rowNumber) rowNode = rowNode.next_sibling_of_type(pugi::node_element);
|
|
89
|
+
if (rowNode.attribute("r").as_ullong() > rowNumber)
|
|
90
|
+
return XMLNode{};
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
return rowNode;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* @details
|
|
98
|
+
*/
|
|
99
|
+
XMLNode findCellNode(XMLNode rowNode, uint16_t columnNumber)
|
|
100
|
+
{
|
|
101
|
+
if (columnNumber < 1 || columnNumber > OpenXLSX::MAX_COLS) {
|
|
102
|
+
using namespace std::literals::string_literals;
|
|
103
|
+
throw XLException("XLWorksheet::column: columnNumber "s + std::to_string(columnNumber) + " is outside allowed range [1;"s + std::to_string(MAX_COLS) + "]"s);
|
|
104
|
+
}
|
|
105
|
+
if (rowNode.empty()) return XMLNode{};
|
|
106
|
+
|
|
107
|
+
XMLNode cellNode = rowNode.last_child_of_type(pugi::node_element);
|
|
108
|
+
|
|
109
|
+
// ===== If there are no cells in the current row, or the requested cell is beyond the last cell in the row...
|
|
110
|
+
if (cellNode.empty() || (XLCellReference(cellNode.attribute("r").value()).column() < columnNumber))
|
|
111
|
+
return XMLNode{};
|
|
112
|
+
|
|
113
|
+
// ===== If the requested node is closest to the end, start from the end and search backwards...
|
|
114
|
+
if (XLCellReference(cellNode.attribute("r").value()).column() - columnNumber < columnNumber) {
|
|
115
|
+
while (not cellNode.empty() && (XLCellReference(cellNode.attribute("r").value()).column() > columnNumber))
|
|
116
|
+
cellNode = cellNode.previous_sibling_of_type(pugi::node_element);
|
|
117
|
+
if (cellNode.empty() || (XLCellReference(cellNode.attribute("r").value()).column() < columnNumber))
|
|
118
|
+
return XMLNode{};
|
|
119
|
+
}
|
|
120
|
+
// ===== Otherwise, start from the beginning
|
|
121
|
+
else {
|
|
122
|
+
// ===== At this point, it is guaranteed that there is at least one node_element in the row that is not empty.
|
|
123
|
+
cellNode = rowNode.first_child_of_type(pugi::node_element);
|
|
124
|
+
|
|
125
|
+
// ===== It has been verified above that the requested columnNumber is <= the column number of the last node_element, therefore this loop will halt:
|
|
126
|
+
while (XLCellReference(cellNode.attribute("r").value()).column() < columnNumber)
|
|
127
|
+
cellNode = cellNode.next_sibling_of_type(pugi::node_element);
|
|
128
|
+
if (XLCellReference(cellNode.attribute("r").value()).column() > columnNumber)
|
|
129
|
+
return XMLNode{};
|
|
130
|
+
}
|
|
131
|
+
return cellNode;
|
|
132
|
+
}
|
|
133
|
+
} // namespace OpenXLSX
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* @details
|
|
138
|
+
*/
|
|
139
|
+
XLCellIterator::XLCellIterator(const XLCellRange& cellRange, XLIteratorLocation loc, std::vector<XLStyleIndex> const * colStyles)
|
|
140
|
+
: m_dataNode(std::make_unique<XMLNode>(*cellRange.m_dataNode)),
|
|
141
|
+
m_topLeft(cellRange.m_topLeft),
|
|
142
|
+
m_bottomRight(cellRange.m_bottomRight),
|
|
143
|
+
m_sharedStrings(cellRange.m_sharedStrings),
|
|
144
|
+
m_endReached(false),
|
|
145
|
+
m_hintNode(std::make_unique<XMLNode>()),
|
|
146
|
+
m_hintRow(0),
|
|
147
|
+
m_currentCell(),
|
|
148
|
+
m_currentCellStatus(XLNotLoaded),
|
|
149
|
+
m_currentRow(0),
|
|
150
|
+
m_currentColumn(0),
|
|
151
|
+
m_colStyles(colStyles)
|
|
152
|
+
{
|
|
153
|
+
if (loc == XLIteratorLocation::End)
|
|
154
|
+
m_endReached = true;
|
|
155
|
+
else {
|
|
156
|
+
m_currentRow = m_topLeft.row();
|
|
157
|
+
m_currentColumn = m_topLeft.column();
|
|
158
|
+
}
|
|
159
|
+
if (m_colStyles == nullptr)
|
|
160
|
+
throw XLInternalError("XLCellIterator constructor parameter colStyles must not be nullptr");
|
|
161
|
+
// std::cout << "XLCellIterator constructed with topLeft " << m_topLeft.address() << " and bottomRight " << m_bottomRight.address() << std::endl;
|
|
162
|
+
// std::cout << "XLCellIterator m_endReached is " << ( m_endReached ? "true" : "false" ) << std::endl;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* @details
|
|
167
|
+
*/
|
|
168
|
+
XLCellIterator::~XLCellIterator() = default;
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* @details
|
|
172
|
+
*/
|
|
173
|
+
XLCellIterator::XLCellIterator(const XLCellIterator& other)
|
|
174
|
+
: m_dataNode(std::make_unique<XMLNode>(*other.m_dataNode)),
|
|
175
|
+
m_topLeft (other.m_topLeft),
|
|
176
|
+
m_bottomRight (other.m_bottomRight),
|
|
177
|
+
m_sharedStrings(other.m_sharedStrings),
|
|
178
|
+
m_endReached (other.m_endReached),
|
|
179
|
+
m_hintNode(std::make_unique<XMLNode>(*other.m_hintNode)),
|
|
180
|
+
m_hintRow (other.m_hintRow),
|
|
181
|
+
m_currentCell (other.m_currentCell),
|
|
182
|
+
m_currentCellStatus(other.m_currentCellStatus),
|
|
183
|
+
m_currentRow (other.m_currentRow),
|
|
184
|
+
m_currentColumn(other.m_currentColumn),
|
|
185
|
+
m_colStyles (other.m_colStyles)
|
|
186
|
+
{}
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* @details
|
|
190
|
+
*/
|
|
191
|
+
XLCellIterator::XLCellIterator(XLCellIterator&& other) noexcept = default;
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* @details
|
|
195
|
+
*/
|
|
196
|
+
XLCellIterator& XLCellIterator::operator=(const XLCellIterator& other)
|
|
197
|
+
{
|
|
198
|
+
if (&other != this) {
|
|
199
|
+
*m_dataNode = *other.m_dataNode;
|
|
200
|
+
m_topLeft = other.m_topLeft;
|
|
201
|
+
m_bottomRight = other.m_bottomRight;
|
|
202
|
+
m_sharedStrings = other.m_sharedStrings;
|
|
203
|
+
m_endReached = other.m_endReached;
|
|
204
|
+
*m_hintNode = *other.m_hintNode;
|
|
205
|
+
m_hintRow = other.m_hintRow;
|
|
206
|
+
m_currentCell = other.m_currentCell;
|
|
207
|
+
m_currentCellStatus = other.m_currentCellStatus;
|
|
208
|
+
m_currentRow = other.m_currentRow;
|
|
209
|
+
m_currentColumn = other.m_currentColumn;
|
|
210
|
+
m_colStyles = other.m_colStyles;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
return *this;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* @details
|
|
218
|
+
*/
|
|
219
|
+
XLCellIterator& XLCellIterator::operator=(XLCellIterator&& other) noexcept = default;
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* @brief update m_currentCell by fetching (or inserting) a cell at m_currentRow, m_currentColumn
|
|
223
|
+
*/
|
|
224
|
+
void XLCellIterator::updateCurrentCell(bool createIfMissing)
|
|
225
|
+
{
|
|
226
|
+
// ===== Quick exit checks - can't be true when m_endReached
|
|
227
|
+
if (m_currentCellStatus == XLLoaded) return; // nothing to do, cell is already loaded
|
|
228
|
+
if (!createIfMissing && m_currentCellStatus == XLNoSuchCell) return; // nothing to do, cell has already been determined as missing
|
|
229
|
+
|
|
230
|
+
// At this stage, m_currentCellStatus is XLUnloaded or XLNoSuchCell and createIfMissing == true
|
|
231
|
+
|
|
232
|
+
if (m_endReached)
|
|
233
|
+
throw XLInputError("XLCellIterator updateCurrentCell: iterator should not be dereferenced when endReached() == true");
|
|
234
|
+
|
|
235
|
+
// ===== Cell needs to be updated
|
|
236
|
+
|
|
237
|
+
if (m_hintNode->empty()) { // no hint has been established: fetch first cell node the "tedious" way
|
|
238
|
+
if (createIfMissing) // getCellNode / getRowNode create missing cells
|
|
239
|
+
m_currentCell = XLCell(getCellNode(getRowNode(*m_dataNode, m_currentRow), m_currentColumn, 0, *m_colStyles), m_sharedStrings.get());
|
|
240
|
+
else // findCellNode / findRowNode return an empty cell for missing cells
|
|
241
|
+
m_currentCell = XLCell(findCellNode(findRowNode(*m_dataNode, m_currentRow), m_currentColumn), m_sharedStrings.get());
|
|
242
|
+
}
|
|
243
|
+
else {
|
|
244
|
+
// ===== Find or create, and fetch an XLCell at m_currentRow, m_currentColumn
|
|
245
|
+
if (m_currentRow == m_hintRow) { // new cell is within the same row
|
|
246
|
+
// ===== Start from m_hintNode and search forwards...
|
|
247
|
+
XMLNode cellNode = m_hintNode->next_sibling_of_type(pugi::node_element);
|
|
248
|
+
uint16_t colNo = 0;
|
|
249
|
+
while (not cellNode.empty()) {
|
|
250
|
+
colNo = XLCellReference(cellNode.attribute("r").value()).column();
|
|
251
|
+
if(colNo >= m_currentColumn) break; // if desired cell was reached / passed, break before incrementing cellNode
|
|
252
|
+
cellNode = cellNode.next_sibling_of_type(pugi::node_element);
|
|
253
|
+
}
|
|
254
|
+
if (colNo != m_currentColumn) cellNode = XMLNode{}; // if a higher column number was found, set empty node (means: "missing")
|
|
255
|
+
// ===== Create missing cell node if createIfMissing == true
|
|
256
|
+
if (createIfMissing && cellNode.empty()) {
|
|
257
|
+
cellNode = m_hintNode->parent().insert_child_after("c", *m_hintNode);
|
|
258
|
+
setDefaultCellAttributes(cellNode, XLCellReference(m_currentRow, m_currentColumn).address(), m_hintNode->parent(),
|
|
259
|
+
/**/ m_currentColumn, *m_colStyles);
|
|
260
|
+
}
|
|
261
|
+
m_currentCell = XLCell(cellNode, m_sharedStrings.get()); // cellNode.empty() can be true if createIfMissing == false and cell is not found
|
|
262
|
+
}
|
|
263
|
+
else if (m_currentRow > m_hintRow) {
|
|
264
|
+
// ===== Start from m_hintNode parent row and search forwards...
|
|
265
|
+
XMLNode rowNode = m_hintNode->parent().next_sibling_of_type(pugi::node_element);
|
|
266
|
+
uint32_t rowNo = 0;
|
|
267
|
+
while (not rowNode.empty()) {
|
|
268
|
+
rowNo = rowNode.attribute("r").as_ullong();
|
|
269
|
+
if (rowNo >= m_currentRow) break; // if desired row was reached / passed, break before incrementing rowNode
|
|
270
|
+
rowNode = rowNode.next_sibling_of_type(pugi::node_element);
|
|
271
|
+
}
|
|
272
|
+
if (rowNo != m_currentRow) rowNode = XMLNode{}; // if a higher row number was found, set empty node (means: "missing")
|
|
273
|
+
// ===== Create missing row node if createIfMissing == true
|
|
274
|
+
if (createIfMissing && rowNode.empty()) {
|
|
275
|
+
rowNode = m_dataNode->insert_child_after("row", m_hintNode->parent());
|
|
276
|
+
rowNode.append_attribute("r").set_value(m_currentRow);
|
|
277
|
+
}
|
|
278
|
+
if (rowNode.empty()) // if row could not be found / created
|
|
279
|
+
m_currentCell = XLCell{}; // make sure m_currentCell is set to an empty cell
|
|
280
|
+
else { // else: row found
|
|
281
|
+
if (createIfMissing) {
|
|
282
|
+
// ===== Pass the already known m_currentRow to getCellNode so that it does not have to be fetched again
|
|
283
|
+
m_currentCell = XLCell(getCellNode (rowNode, m_currentColumn, m_currentRow, *m_colStyles), m_sharedStrings.get());
|
|
284
|
+
}
|
|
285
|
+
else // ===== Do a "soft find" if a missing cell shall not be created
|
|
286
|
+
m_currentCell = XLCell(findCellNode(rowNode, m_currentColumn), m_sharedStrings.get());
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
else
|
|
290
|
+
throw XLInternalError("XLCellIterator::updateCurrentCell: an internal error occured (m_currentRow < m_hintRow)");
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
if (m_currentCell.empty()) // if cell is confirmed missing
|
|
294
|
+
m_currentCellStatus = XLNoSuchCell; // mark this status for further calls to updateCurrentCell()
|
|
295
|
+
else {
|
|
296
|
+
// ===== If the current cell exists, update the hints
|
|
297
|
+
m_hintNode = std::make_unique<XMLNode>(*m_currentCell.m_cellNode); // 2024-08-11: don't store a full XLCell, just the XMLNode, for better performance
|
|
298
|
+
m_hintRow = m_currentRow;
|
|
299
|
+
m_currentCellStatus = XLLoaded; // mark cell status for further calls to updateCurrentCell()
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
/**
|
|
304
|
+
* @details
|
|
305
|
+
*/
|
|
306
|
+
XLCellIterator& XLCellIterator::operator++()
|
|
307
|
+
{
|
|
308
|
+
if (m_endReached)
|
|
309
|
+
throw XLInputError("XLCellIterator: tried to increment beyond end operator");
|
|
310
|
+
|
|
311
|
+
if (m_currentColumn < m_bottomRight.column())
|
|
312
|
+
++m_currentColumn;
|
|
313
|
+
else if(m_currentRow < m_bottomRight.row()) {
|
|
314
|
+
++m_currentRow;
|
|
315
|
+
m_currentColumn = m_topLeft.column();
|
|
316
|
+
}
|
|
317
|
+
else
|
|
318
|
+
m_endReached = true;
|
|
319
|
+
|
|
320
|
+
m_currentCellStatus = XLNotLoaded; // trigger a new attempt to locate / create the cell via updateCurrentCell
|
|
321
|
+
|
|
322
|
+
return *this;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
/**
|
|
326
|
+
* @details
|
|
327
|
+
*/
|
|
328
|
+
XLCellIterator XLCellIterator::operator++(int) // NOLINT
|
|
329
|
+
{
|
|
330
|
+
auto oldIter(*this);
|
|
331
|
+
++(*this);
|
|
332
|
+
return oldIter;
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
/**
|
|
336
|
+
* @details
|
|
337
|
+
*/
|
|
338
|
+
XLCell& XLCellIterator::operator*()
|
|
339
|
+
{
|
|
340
|
+
// std::cout << "XLCellIterator dereference operator* invoked" << std::endl;
|
|
341
|
+
updateCurrentCell(XLCreateIfMissing);
|
|
342
|
+
return m_currentCell;
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
/**
|
|
346
|
+
* @details
|
|
347
|
+
*/
|
|
348
|
+
XLCellIterator::pointer XLCellIterator::operator->()
|
|
349
|
+
{
|
|
350
|
+
// std::cout << "XLCellIterator dereference operator-> invoked" << std::endl;
|
|
351
|
+
updateCurrentCell(XLCreateIfMissing);
|
|
352
|
+
return &m_currentCell;
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
/**
|
|
356
|
+
* @details
|
|
357
|
+
*/
|
|
358
|
+
bool XLCellIterator::operator==(const XLCellIterator& rhs) const
|
|
359
|
+
{
|
|
360
|
+
// BUGFIX 2024-08-10: there was no test for (!m_currentCell && rhs.m_currentCell),
|
|
361
|
+
// leading to a potential dereference of a nullptr in m_currentCell::m_cellNode
|
|
362
|
+
|
|
363
|
+
if (m_endReached && rhs.m_endReached) return true; // If both iterators are end iterators
|
|
364
|
+
|
|
365
|
+
if ((m_currentColumn != rhs.m_currentColumn) // if iterators point to a different column or row
|
|
366
|
+
||(m_currentRow != rhs.m_currentRow))
|
|
367
|
+
return false; // that means no match
|
|
368
|
+
|
|
369
|
+
// CAUTION: for performance reasons, disabled all checks whether this and rhs are iterators on the same worksheet & range
|
|
370
|
+
return true;
|
|
371
|
+
|
|
372
|
+
// if (*m_dataNode != *rhs.m_dataNode) return false; // TBD: iterators over different worksheets may never match
|
|
373
|
+
// TBD if iterators shall be considered not equal if they were created on different XLCellRanges
|
|
374
|
+
// this would require checking the topLeft and bottomRight references, potentially costing CPU time
|
|
375
|
+
|
|
376
|
+
// return m_currentCell == rhs.m_currentCell; // match only if cell nodes are equal
|
|
377
|
+
// CAUTION: in the current code, that means iterators that point to the same column & row in different worksheets,
|
|
378
|
+
// and cells that do not exist in both sheets, will be considered equal
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
/**
|
|
382
|
+
* @details
|
|
383
|
+
*/
|
|
384
|
+
bool XLCellIterator::operator!=(const XLCellIterator& rhs) const { return !(*this == rhs); }
|
|
385
|
+
|
|
386
|
+
/**
|
|
387
|
+
* @details
|
|
388
|
+
*/
|
|
389
|
+
bool XLCellIterator::cellExists()
|
|
390
|
+
{
|
|
391
|
+
// ===== Update m_currentCell once so that cellExists will always test the correct cell (an empty cell if current cell doesn't exist)
|
|
392
|
+
updateCurrentCell(XLDoNotCreateIfMissing);
|
|
393
|
+
return not m_currentCell.empty();
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
/**
|
|
397
|
+
* @details
|
|
398
|
+
* @note 2024-06-03: implemented a calculated distance based on m_currentCell, m_topLeft and m_bottomRight (if m_endReached)
|
|
399
|
+
* accordingly, implemented defined setting of m_endReached at all times
|
|
400
|
+
*/
|
|
401
|
+
uint64_t XLCellIterator::distance(const XLCellIterator& last)
|
|
402
|
+
{
|
|
403
|
+
// ===== Determine rows and columns, taking into account beyond-the-end iterators
|
|
404
|
+
uint32_t row = (m_endReached ? m_bottomRight.row() : m_currentRow);
|
|
405
|
+
uint16_t col = (m_endReached ? m_bottomRight.column() + 1 : m_currentColumn);
|
|
406
|
+
uint32_t lastRow = (last.m_endReached ? last.m_bottomRight.row() : last.m_currentRow);
|
|
407
|
+
// ===== lastCol can store +1 for beyond-the-end iterator without overflow because MAX_COLS is less than max uint16_t
|
|
408
|
+
uint16_t lastCol = (last.m_endReached ? last.m_bottomRight.column() + 1 : last.m_currentColumn);
|
|
409
|
+
|
|
410
|
+
uint16_t rowWidth = m_bottomRight.column() - m_topLeft.column() + 1; // amount of cells in a row of the iterator range
|
|
411
|
+
int64_t distance = ((int64_t)(lastRow) - row) * rowWidth // row distance * rowWidth
|
|
412
|
+
+ (int64_t)(lastCol) - col; // + column distance (may be negative)
|
|
413
|
+
if (distance < 0)
|
|
414
|
+
throw XLInputError("XLCellIterator::distance is negative");
|
|
415
|
+
|
|
416
|
+
return static_cast<uint64_t>(distance); // after excluding negative result: cast back to positive value
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
/**
|
|
420
|
+
* @details
|
|
421
|
+
*/
|
|
422
|
+
std::string XLCellIterator::address() const
|
|
423
|
+
{
|
|
424
|
+
uint32_t row = (m_endReached ? m_bottomRight.row() : m_currentRow);
|
|
425
|
+
uint16_t col = (m_endReached ? m_bottomRight.column() + 1 : m_currentColumn);
|
|
426
|
+
return (m_endReached ? "END(" : "") + XLCellReference(row, col).address() + (m_endReached ? ")" : "");
|
|
427
|
+
}
|
|
@@ -0,0 +1,221 @@
|
|
|
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
|
+
// ===== External Includes ===== //
|
|
47
|
+
|
|
48
|
+
// ===== OpenXLSX Includes ===== //
|
|
49
|
+
#include "XLCellRange.hpp"
|
|
50
|
+
#include "XLXmlParser.hpp" // pugixml wrapper
|
|
51
|
+
|
|
52
|
+
using namespace OpenXLSX;
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* @details
|
|
56
|
+
*/
|
|
57
|
+
XLCellRange::XLCellRange()
|
|
58
|
+
: m_dataNode(std::make_unique<XMLNode>(XMLNode{})),
|
|
59
|
+
m_topLeft(XLCellReference("A1")),
|
|
60
|
+
m_bottomRight(XLCellReference("A1")),
|
|
61
|
+
m_sharedStrings(XLSharedStringsDefaulted),
|
|
62
|
+
m_columnStyles{}
|
|
63
|
+
{}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* @details From the two XLCellReference objects, the constructor calculates the dimensions of the range.
|
|
67
|
+
* If the range exceeds the current bounds of the spreadsheet, the spreadsheet is resized to fit.
|
|
68
|
+
* @pre
|
|
69
|
+
* @post
|
|
70
|
+
*/
|
|
71
|
+
XLCellRange::XLCellRange(const XMLNode& dataNode,
|
|
72
|
+
const XLCellReference& topLeft,
|
|
73
|
+
const XLCellReference& bottomRight,
|
|
74
|
+
const XLSharedStrings& sharedStrings)
|
|
75
|
+
: m_dataNode(std::make_unique<XMLNode>(dataNode)),
|
|
76
|
+
m_topLeft(topLeft),
|
|
77
|
+
m_bottomRight(bottomRight),
|
|
78
|
+
m_sharedStrings(sharedStrings),
|
|
79
|
+
m_columnStyles{}
|
|
80
|
+
{
|
|
81
|
+
if (m_topLeft.row() > m_bottomRight.row() || m_topLeft.column() > m_bottomRight.column()) {
|
|
82
|
+
using namespace std::literals::string_literals;
|
|
83
|
+
throw XLInputError("XLCellRange constructor: topLeft ("s + topLeft.address() + ")"s
|
|
84
|
+
/**/ + " does not point to a lower or equal row and column than bottomRight ("s + bottomRight.address() + ")"s);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* @details explicit copy constructor
|
|
90
|
+
*/
|
|
91
|
+
XLCellRange::XLCellRange(const XLCellRange& other)
|
|
92
|
+
: m_dataNode(std::make_unique<XMLNode>(*other.m_dataNode)),
|
|
93
|
+
m_topLeft(other.m_topLeft),
|
|
94
|
+
m_bottomRight(other.m_bottomRight),
|
|
95
|
+
m_sharedStrings(other.m_sharedStrings),
|
|
96
|
+
m_columnStyles(other.m_columnStyles)
|
|
97
|
+
{}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* @details use the default move constructor, i.e. memberwise move.
|
|
101
|
+
*/
|
|
102
|
+
XLCellRange::XLCellRange(XLCellRange&& other) noexcept = default;
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* @details
|
|
106
|
+
*/
|
|
107
|
+
XLCellRange::~XLCellRange() = default;
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* @details explicit copy assignment
|
|
111
|
+
*/
|
|
112
|
+
XLCellRange& XLCellRange::operator=(const XLCellRange& other)
|
|
113
|
+
{
|
|
114
|
+
if (&other != this) {
|
|
115
|
+
*m_dataNode = *other.m_dataNode;
|
|
116
|
+
m_topLeft = other.m_topLeft;
|
|
117
|
+
m_bottomRight = other.m_bottomRight;
|
|
118
|
+
m_sharedStrings = other.m_sharedStrings;
|
|
119
|
+
m_columnStyles = other.m_columnStyles;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
return *this;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* @details use the default move assignment, i.e. memberwise move.
|
|
127
|
+
*/
|
|
128
|
+
XLCellRange& XLCellRange::operator=(XLCellRange&& other) noexcept = default;
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* @details Predetermine all defined column styles & gather them in a vector for performant access when XLCellIterator creates new cells
|
|
132
|
+
*/
|
|
133
|
+
void XLCellRange::fetchColumnStyles()
|
|
134
|
+
{
|
|
135
|
+
XMLNode cols = m_dataNode->parent().child("cols");
|
|
136
|
+
|
|
137
|
+
uint16_t vecPos = 0;
|
|
138
|
+
XMLNode col = cols.first_child_of_type(pugi::node_element);
|
|
139
|
+
while (not col.empty()) {
|
|
140
|
+
uint16_t minCol = col.attribute("min").as_int(0);
|
|
141
|
+
uint16_t maxCol = col.attribute("max").as_int(0);
|
|
142
|
+
if (minCol > maxCol || !minCol || !maxCol) {
|
|
143
|
+
using namespace std::literals::string_literals;
|
|
144
|
+
throw XLInputError(
|
|
145
|
+
"column attributes min (\""s + col.attribute("min").value() + "\") and max (\""s + col.attribute("min").value() + "\")"s
|
|
146
|
+
" must be set and min must not be larger than max"s
|
|
147
|
+
);
|
|
148
|
+
}
|
|
149
|
+
if (maxCol > m_columnStyles.size()) m_columnStyles.resize(maxCol); // resize m_columnStyles if necessary
|
|
150
|
+
for( ; vecPos + 1 < minCol; ++vecPos ) m_columnStyles[ vecPos ] = XLDefaultCellFormat; // set all non-defined columns to default
|
|
151
|
+
XLStyleIndex colStyle = col.attribute("style").as_uint(XLDefaultCellFormat); // acquire column style attribute
|
|
152
|
+
for( ; vecPos < maxCol; ++vecPos ) m_columnStyles[ vecPos ] = colStyle; // set all covered columns to defined style
|
|
153
|
+
col = col.next_sibling_of_type(pugi::node_element); // advance to next <col> entry, if any
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* @details
|
|
159
|
+
*/
|
|
160
|
+
const XLCellReference XLCellRange::topLeft() const { return m_topLeft; }
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* @details
|
|
164
|
+
*/
|
|
165
|
+
const XLCellReference XLCellRange::bottomRight() const { return m_bottomRight; }
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* @details Evaluate the top left and bottom right cells as string references and
|
|
169
|
+
* concatenate them with a colon ':'
|
|
170
|
+
*/
|
|
171
|
+
std::string XLCellRange::address() const { return m_topLeft.address() + ":" + m_bottomRight.address(); }
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* @details
|
|
175
|
+
* @pre
|
|
176
|
+
* @post
|
|
177
|
+
*/
|
|
178
|
+
uint32_t XLCellRange::numRows() const { return m_bottomRight.row() + 1 - m_topLeft.row(); }
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* @details
|
|
182
|
+
* @pre
|
|
183
|
+
* @post
|
|
184
|
+
*/
|
|
185
|
+
uint16_t XLCellRange::numColumns() const { return m_bottomRight.column() + 1 - m_topLeft.column(); }
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* @details
|
|
189
|
+
* @pre
|
|
190
|
+
* @post
|
|
191
|
+
*/
|
|
192
|
+
XLCellIterator XLCellRange::begin() const { return XLCellIterator(*this, XLIteratorLocation::Begin, &m_columnStyles); }
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* @details
|
|
196
|
+
* @pre
|
|
197
|
+
* @post
|
|
198
|
+
*/
|
|
199
|
+
XLCellIterator XLCellRange::end() const { return XLCellIterator(*this, XLIteratorLocation::End, &m_columnStyles); }
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* @details
|
|
203
|
+
* @pre
|
|
204
|
+
* @post
|
|
205
|
+
*/
|
|
206
|
+
void XLCellRange::clear()
|
|
207
|
+
{
|
|
208
|
+
for (auto& cell : *this) cell.value().clear();
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* @details Iterate over the full range and set format for each existing cell
|
|
213
|
+
*/
|
|
214
|
+
bool XLCellRange::setFormat(size_t cellFormatIndex)
|
|
215
|
+
{
|
|
216
|
+
// ===== Iterate over all cells in the range
|
|
217
|
+
for (auto it = begin(); it != end(); ++it)
|
|
218
|
+
if (!it->setCellFormat(cellFormatIndex)) // attempt to set cell format
|
|
219
|
+
return false; // fail if any setCellFormat failed
|
|
220
|
+
return true; // success if loop finished nominally
|
|
221
|
+
}
|