diff options
author | Luboš Luňák <l.lunak@collabora.com> | 2022-03-15 20:03:50 +0100 |
---|---|---|
committer | Luboš Luňák <l.lunak@collabora.com> | 2022-03-15 22:39:17 +0100 |
commit | 1fa46653315810a579009f712f2c1bbdf1f5fd44 (patch) | |
tree | a4c5a7250b3d5304ce638976584ffd0c0344941a /sc | |
parent | 8da06340788296e5004f1625fc39fbf2a4c93fc9 (diff) |
fix comparison operators in Excel export, #2
It turns out that the end-vs-start comparison was intentional and
the file causing problems is broken, so more or less revert
83d599fd7c530d14f70ac60bd673b66640191bf7, and I'll handle
the problematic file in another commit.
Change-Id: I5c7538a7c3eeea9c5fd1661e1a9a2c3370b799c9
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/131636
Tested-by: Jenkins
Reviewed-by: Luboš Luňák <l.lunak@collabora.com>
Diffstat (limited to 'sc')
-rw-r--r-- | sc/qa/unit/data/xlsx/tdf58243.xlsx | bin | 0 -> 17952 bytes | |||
-rw-r--r-- | sc/qa/unit/subsequent_export_test2.cxx | 11 | ||||
-rw-r--r-- | sc/source/core/data/attarray.cxx | 9 | ||||
-rw-r--r-- | sc/source/filter/inc/sheetdatabuffer.hxx | 9 | ||||
-rw-r--r-- | sc/source/filter/oox/sheetdatabuffer.cxx | 2 |
5 files changed, 27 insertions, 4 deletions
diff --git a/sc/qa/unit/data/xlsx/tdf58243.xlsx b/sc/qa/unit/data/xlsx/tdf58243.xlsx Binary files differnew file mode 100644 index 000000000000..f95e13b4b6db --- /dev/null +++ b/sc/qa/unit/data/xlsx/tdf58243.xlsx diff --git a/sc/qa/unit/subsequent_export_test2.cxx b/sc/qa/unit/subsequent_export_test2.cxx index 0ed29cae605c..4d22a2ffdbc6 100644 --- a/sc/qa/unit/subsequent_export_test2.cxx +++ b/sc/qa/unit/subsequent_export_test2.cxx @@ -185,6 +185,7 @@ public: void testTdf145059(); void testTdf130104_XLSXIndent(); void testWholeRowBold(); + void testXlsxRowsOrder(); CPPUNIT_TEST_SUITE(ScExportTest2); @@ -303,6 +304,7 @@ public: CPPUNIT_TEST(testTdf145059); CPPUNIT_TEST(testTdf130104_XLSXIndent); CPPUNIT_TEST(testWholeRowBold); + CPPUNIT_TEST(testXlsxRowsOrder); CPPUNIT_TEST_SUITE_END(); @@ -3099,6 +3101,15 @@ void ScExportTest2::testWholeRowBold() xDocSh3->DoClose(); } +void ScExportTest2::testXlsxRowsOrder() +{ + ScDocShellRef xDocSh = loadDoc(u"tdf58243.", FORMAT_XLSX); + CPPUNIT_ASSERT(xDocSh.is()); + // Make sure code in SheetDataBuffer doesn't assert columns/rows sorting. + ScBootstrapFixture::exportTo(*xDocSh, FORMAT_XLSX); + xDocSh->DoClose(); +} + CPPUNIT_TEST_SUITE_REGISTRATION(ScExportTest2); CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/sc/source/core/data/attarray.cxx b/sc/source/core/data/attarray.cxx index a7ee5ff2276e..042213bda05c 100644 --- a/sc/source/core/data/attarray.cxx +++ b/sc/source/core/data/attarray.cxx @@ -923,6 +923,15 @@ void ScAttrArray::SetAttrEntries(std::vector<ScAttrEntry> && vNewData) pDocPool->Remove(*rEntry.pPattern); mvData = std::move(vNewData); + +#ifdef DBG_UTIL + SCROW lastEndRow = -1; + for(const auto& entry : mvData) + { // Verify that the data is not corrupted. + assert(entry.nEndRow > lastEndRow); + lastEndRow = entry.nEndRow; + } +#endif } static void lcl_MergeDeep( SfxItemSet& rMergeSet, const SfxItemSet& rSource ) diff --git a/sc/source/filter/inc/sheetdatabuffer.hxx b/sc/source/filter/inc/sheetdatabuffer.hxx index 0cca3f0c7c84..c212c8f0e09d 100644 --- a/sc/source/filter/inc/sheetdatabuffer.hxx +++ b/sc/source/filter/inc/sheetdatabuffer.hxx @@ -198,14 +198,19 @@ private: { bool operator() (const RowRangeStyle& lhs, const RowRangeStyle& rhs) const { - return lhs.mnStartRow<rhs.mnStartRow; + // This end-vs-start comparison is needed by the lower_bound() use + // in SheetDataBuffer::addColXfStyleProcessRowRanges() that searches + // for partially overlapping ranges. In all other places the ranges + // should be non-overlapping, in which case this is the same as the "normal" + // comparison. + return lhs.mnEndRow<rhs.mnStartRow; } }; struct StyleRowRangeCompEqual { bool operator() (const RowRangeStyle& lhs, const RowRangeStyle& rhs) const { - return lhs.mnStartRow==rhs.mnStartRow; + return lhs.mnStartRow==rhs.mnStartRow && lhs.mnEndRow == rhs.mnEndRow; } }; typedef ::o3tl::sorted_vector< RowRangeStyle, StyleRowRangeComp > RowStyles; diff --git a/sc/source/filter/oox/sheetdatabuffer.cxx b/sc/source/filter/oox/sheetdatabuffer.cxx index 6dbec9e6bd9d..259e3190107b 100644 --- a/sc/source/filter/oox/sheetdatabuffer.cxx +++ b/sc/source/filter/oox/sheetdatabuffer.cxx @@ -409,8 +409,6 @@ void SheetDataBuffer::addColXfStyleProcessRowRanges() RowRangeStyle aStyleRows; aStyleRows.mnNumFmt.first = nXfId; aStyleRows.mnNumFmt.second = -1; - aStyleRows.mnStartRow = rRange.mnFirst; - aStyleRows.mnEndRow = rRange.mnLast; // Reset row range for each column aStyleRows.mnStartRow = rRange.mnFirst; |