diff options
Diffstat (limited to 'sc')
-rw-r--r-- | sc/inc/dpcache.hxx | 1 | ||||
-rw-r--r-- | sc/qa/unit/data/ods/numgroup_example.ods | bin | 0 -> 17689 bytes | |||
-rw-r--r-- | sc/qa/unit/helper/qahelper.cxx | 10 | ||||
-rw-r--r-- | sc/qa/unit/helper/qahelper.hxx | 3 | ||||
-rw-r--r-- | sc/qa/unit/subsequent_export-test.cxx | 33 | ||||
-rw-r--r-- | sc/source/core/data/dpcache.cxx | 5 | ||||
-rw-r--r-- | sc/source/core/data/dpobject.cxx | 4 |
7 files changed, 52 insertions, 4 deletions
diff --git a/sc/inc/dpcache.hxx b/sc/inc/dpcache.hxx index 8386c1d4b3f3..4a41bc3aff46 100644 --- a/sc/inc/dpcache.hxx +++ b/sc/inc/dpcache.hxx @@ -144,6 +144,7 @@ public: SCROW SetGroupItem(long nDim, const ScDPItemData& rData); void GetGroupDimMemberIds(long nDim, std::vector<SCROW>& rIds) const; void ClearGroupFields(); + void ClearAllFields(); const ScDPNumGroupInfo* GetNumGroupInfo(long nDim) const; /** diff --git a/sc/qa/unit/data/ods/numgroup_example.ods b/sc/qa/unit/data/ods/numgroup_example.ods Binary files differnew file mode 100644 index 000000000000..008e1bfd4970 --- /dev/null +++ b/sc/qa/unit/data/ods/numgroup_example.ods diff --git a/sc/qa/unit/helper/qahelper.cxx b/sc/qa/unit/helper/qahelper.cxx index d414b1abfb96..809fdbf4bbd0 100644 --- a/sc/qa/unit/helper/qahelper.cxx +++ b/sc/qa/unit/helper/qahelper.cxx @@ -689,7 +689,7 @@ ScDocShellRef ScBootstrapFixture::saveAndReload( ScDocShell* pShell, sal_Int32 n return xDocSh; } -std::shared_ptr<utl::TempFile> ScBootstrapFixture::exportTo( ScDocShell* pShell, sal_Int32 nFormat ) +std::shared_ptr<utl::TempFile> ScBootstrapFixture::saveAs( ScDocShell* pShell, sal_Int32 nFormat ) { OUString aFilterName(aFileFormats[nFormat].pFilterName, strlen(aFileFormats[nFormat].pFilterName), RTL_TEXTENCODING_UTF8) ; OUString aFilterType(aFileFormats[nFormat].pTypeName, strlen(aFileFormats[nFormat].pTypeName), RTL_TEXTENCODING_UTF8); @@ -708,8 +708,16 @@ std::shared_ptr<utl::TempFile> ScBootstrapFixture::exportTo( ScDocShell* pShell, pExportFilter.get()->SetVersion(SOFFICE_FILEFORMAT_CURRENT); aStoreMedium.SetFilter(pExportFilter); pShell->DoSaveAs( aStoreMedium ); + + return pTempFile; +} + +std::shared_ptr<utl::TempFile> ScBootstrapFixture::exportTo( ScDocShell* pShell, sal_Int32 nFormat ) +{ + std::shared_ptr<utl::TempFile> pTempFile = saveAs(pShell, nFormat); pShell->DoClose(); + SfxFilterFlags nFormatType = aFileFormats[nFormat].nFormatType; if(nFormatType == XLSX_FORMAT_TYPE) validate(pTempFile->GetFileName(), test::OOXML); else if (nFormatType == ODS_FORMAT_TYPE) diff --git a/sc/qa/unit/helper/qahelper.hxx b/sc/qa/unit/helper/qahelper.hxx index f8d522e65387..c31569068a30 100644 --- a/sc/qa/unit/helper/qahelper.hxx +++ b/sc/qa/unit/helper/qahelper.hxx @@ -204,7 +204,8 @@ public: ScDocShellRef saveAndReload( ScDocShell* pShell, sal_Int32 nFormat ); - static std::shared_ptr<utl::TempFile> exportTo( ScDocShell* pShell, sal_Int32 nFormat ); + static std::shared_ptr<utl::TempFile> saveAs(ScDocShell* pShell, sal_Int32 nFormat); + static std::shared_ptr<utl::TempFile> exportTo(ScDocShell* pShell, sal_Int32 nFormat); void miscRowHeightsTest( TestParam const * aTestValues, unsigned int numElems ); }; diff --git a/sc/qa/unit/subsequent_export-test.cxx b/sc/qa/unit/subsequent_export-test.cxx index 2fb53a18ac3c..28f0782e5ad8 100644 --- a/sc/qa/unit/subsequent_export-test.cxx +++ b/sc/qa/unit/subsequent_export-test.cxx @@ -43,6 +43,8 @@ #include <validat.hxx> #include <attrib.hxx> #include <global.hxx> +#include <scmod.hxx> +#include <dpcache.hxx> #include <dpobject.hxx> #include <svx/svdoole2.hxx> @@ -211,6 +213,7 @@ public: void testTdf118990(); void testTdf121612(); + void testPivotCacheAfterExportXLSX(); CPPUNIT_TEST_SUITE(ScExportTest); CPPUNIT_TEST(test); @@ -322,6 +325,7 @@ public: CPPUNIT_TEST(testTdf118990); CPPUNIT_TEST(testTdf121612); + CPPUNIT_TEST(testPivotCacheAfterExportXLSX); CPPUNIT_TEST_SUITE_END(); @@ -4088,6 +4092,35 @@ void ScExportTest::testTdf121612() CPPUNIT_ASSERT_EQUAL(size_t(1), pDPColl->GetCount()); } +void ScExportTest::testPivotCacheAfterExportXLSX() +{ + ScDocShellRef xDocSh = loadDoc("numgroup_example.", FORMAT_ODS); + CPPUNIT_ASSERT(xDocSh.is()); + + // export only + std::shared_ptr<utl::TempFile> pTemp = ScBootstrapFixture::saveAs(xDocSh.get(), FORMAT_XLSX); + + ScDocument& rDoc = xDocSh->GetDocument(); + CPPUNIT_ASSERT(rDoc.HasPivotTable()); + + // Two pivot tables + ScDPCollection* pDPColl = rDoc.GetDPCollection(); + CPPUNIT_ASSERT(pDPColl); + CPPUNIT_ASSERT_EQUAL(size_t(2), pDPColl->GetCount()); + + // One cache + ScDPCollection::SheetCaches& rSheetCaches = pDPColl->GetSheetCaches(); + CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), rSheetCaches.size()); + const ScDPCache* pCache = rSheetCaches.getExistingCache(ScRange(0, 0, 0, 3, 30, 0)); + CPPUNIT_ASSERT_MESSAGE("Pivot cache is expected for A1:D31 on the first sheet.", pCache); + + // See if XLSX export didn't damage group info of the 1st pivot table + const ScDPNumGroupInfo* pInfo = pCache->GetNumGroupInfo(1); + CPPUNIT_ASSERT_MESSAGE("No number group info :(", pInfo); + + xDocSh->DoClose(); +} + CPPUNIT_TEST_SUITE_REGISTRATION(ScExportTest); CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/sc/source/core/data/dpcache.cxx b/sc/source/core/data/dpcache.cxx index 6d8a1e12df6b..803c2c7d8b6e 100644 --- a/sc/source/core/data/dpcache.cxx +++ b/sc/source/core/data/dpcache.cxx @@ -1391,6 +1391,11 @@ struct ClearGroupItems void ScDPCache::ClearGroupFields() { maGroupFields.clear(); +} + +void ScDPCache::ClearAllFields() +{ + ClearGroupFields(); std::for_each(maFields.begin(), maFields.end(), ClearGroupItems()); } diff --git a/sc/source/core/data/dpobject.cxx b/sc/source/core/data/dpobject.cxx index eebe2f5f10ac..cb733d25a8da 100644 --- a/sc/source/core/data/dpobject.cxx +++ b/sc/source/core/data/dpobject.cxx @@ -3561,9 +3561,9 @@ bool ScDPCollection::ReloadGroupsInCache(const ScDPObject* pDPObj, std::set<ScDP if (!pCache) return false; - // Clear the existing group data from the cache, and rebuild it from the + // Clear the existing group/field data from the cache, and rebuild it from the // dimension data. - pCache->ClearGroupFields(); + pCache->ClearAllFields(); const ScDPDimensionSaveData* pDimData = pSaveData->GetExistingDimensionData(); if (pDimData) pDimData->WriteToCache(*pCache); |