sc/qa/unit/data/xls/pivottable_page_field_filter.xls |binary sc/qa/unit/subsequent_export-test.cxx | 95 +++++++++++++++++++ sc/source/filter/excel/xipivot.cxx | 71 ++++++++------ sc/source/filter/inc/xipivot.hxx | 4 4 files changed, 141 insertions(+), 29 deletions(-)
New commits: commit 55a43f30a54816e13eb6704a8ec5952a63b01a64 Author: Tamás Zolnai <tamas.zol...@collabora.com> Date: Tue Sep 12 13:36:14 2017 +0200 tdf#112348: Pivot table: page field filtering is not imported from XLS Change-Id: I3477cd17f679bdfefb9340656999630380713d3f Reviewed-on: https://gerrit.libreoffice.org/42201 Tested-by: Jenkins <c...@libreoffice.org> Reviewed-by: Tamás Zolnai <tamas.zol...@collabora.com> diff --git a/sc/qa/unit/data/xls/pivottable_page_field_filter.xls b/sc/qa/unit/data/xls/pivottable_page_field_filter.xls new file mode 100755 index 000000000000..4f8a3b8ab650 Binary files /dev/null and b/sc/qa/unit/data/xls/pivottable_page_field_filter.xls differ diff --git a/sc/qa/unit/subsequent_export-test.cxx b/sc/qa/unit/subsequent_export-test.cxx index afe46cdd2947..0cccc54f026d 100644 --- a/sc/qa/unit/subsequent_export-test.cxx +++ b/sc/qa/unit/subsequent_export-test.cxx @@ -217,6 +217,7 @@ public: void testPivotTableBoolFieldFilter(); void testPivotTableRowColPageFieldFilter(); void testPivotTableEmptyItem(); + void testPivotTablePageFieldFilter(); CPPUNIT_TEST_SUITE(ScExportTest); CPPUNIT_TEST(test); @@ -328,6 +329,7 @@ public: CPPUNIT_TEST(testPivotTableBoolFieldFilter); CPPUNIT_TEST(testPivotTableRowColPageFieldFilter); CPPUNIT_TEST(testPivotTableEmptyItem); + CPPUNIT_TEST(testPivotTablePageFieldFilter); CPPUNIT_TEST_SUITE_END(); @@ -4738,6 +4740,99 @@ void ScExportTest::testPivotTableEmptyItem() xDocSh->DoClose(); } +void ScExportTest::testPivotTablePageFieldFilter() +{ + ScDocShellRef xDocSh = loadDoc("pivottable_page_field_filter.", FORMAT_XLS); + CPPUNIT_ASSERT_MESSAGE("Failed to load file", xDocSh.is()); + ScDocument& rDoc = xDocSh->GetDocument(); + ScDPCollection* pDPs = rDoc.GetDPCollection(); + CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), pDPs->GetCount()); + + // Reload and check filtering of row dimensions + xDocSh = saveAndReload( &(*xDocSh), FORMAT_XLS); + CPPUNIT_ASSERT_MESSAGE("Failed to load file", xDocSh.is()); + ScDocument& rLoadedDoc = xDocSh->GetDocument(); + pDPs = rLoadedDoc.GetDPCollection(); + CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), pDPs->GetCount()); + const ScDPObject* pDPObj = &(*pDPs)[0]; + CPPUNIT_ASSERT(pDPObj); + ScDPSaveData* pSaveData = pDPObj->GetSaveData(); + CPPUNIT_ASSERT(pSaveData); + + // Only one item is selected (an empty item) + { + ScDPSaveDimension* pSaveDim = pSaveData->GetExistingDimensionByName("Product"); + CPPUNIT_ASSERT(pSaveDim); + const ScDPSaveDimension::MemberList& rMembers = pSaveDim->GetMembers(); + CPPUNIT_ASSERT_EQUAL(size_t(3), rMembers.size()); + ScDPSaveMember* pMember = pSaveDim->GetExistingMemberByName("Banana"); + CPPUNIT_ASSERT(pMember); + CPPUNIT_ASSERT(pMember->HasIsVisible() && !pMember->GetIsVisible()); + pMember = pSaveDim->GetExistingMemberByName("Carrots"); + CPPUNIT_ASSERT(pMember); + CPPUNIT_ASSERT(pMember->HasIsVisible() && !pMember->GetIsVisible()); + pMember = pSaveDim->GetExistingMemberByName(""); + CPPUNIT_ASSERT(pMember); + CPPUNIT_ASSERT(pMember->HasIsVisible() && pMember->GetIsVisible()); + } + + // More items are selected, but not all + { + ScDPSaveDimension* pSaveDim = pSaveData->GetExistingDimensionByName("Category"); + CPPUNIT_ASSERT(pSaveDim); + + const ScDPSaveDimension::MemberList& rMembers = pSaveDim->GetMembers(); + CPPUNIT_ASSERT_EQUAL(size_t(3), rMembers.size()); + ScDPSaveMember* pMember = pSaveDim->GetExistingMemberByName("Vegetables"); + CPPUNIT_ASSERT(pMember); + CPPUNIT_ASSERT(pMember->HasIsVisible() && !pMember->GetIsVisible()); + pMember = pSaveDim->GetExistingMemberByName("Fruit"); + CPPUNIT_ASSERT(pMember); + CPPUNIT_ASSERT(pMember->HasIsVisible() && pMember->GetIsVisible()); + pMember = pSaveDim->GetExistingMemberByName(""); + CPPUNIT_ASSERT(pMember); + CPPUNIT_ASSERT(pMember->HasIsVisible() && pMember->GetIsVisible()); + } + + // All items are selected + { + ScDPSaveDimension* pSaveDim = pSaveData->GetExistingDimensionByName("Order ID"); + CPPUNIT_ASSERT(pSaveDim); + + const ScDPSaveDimension::MemberList& rMembers = pSaveDim->GetMembers(); + CPPUNIT_ASSERT_EQUAL(size_t(3), rMembers.size()); + ScDPSaveMember* pMember = pSaveDim->GetExistingMemberByName("1"); + CPPUNIT_ASSERT(pMember); + CPPUNIT_ASSERT(pMember->HasIsVisible() && pMember->GetIsVisible()); + pMember = pSaveDim->GetExistingMemberByName("2"); + CPPUNIT_ASSERT(pMember); + CPPUNIT_ASSERT(pMember->HasIsVisible() && pMember->GetIsVisible()); + pMember = pSaveDim->GetExistingMemberByName("3"); + CPPUNIT_ASSERT(pMember); + CPPUNIT_ASSERT(pMember->HasIsVisible() && pMember->GetIsVisible()); + } + + // Only one item is selected (a non-empty item) + { + ScDPSaveDimension* pSaveDim = pSaveData->GetExistingDimensionByName("Country"); + CPPUNIT_ASSERT(pSaveDim); + + const ScDPSaveDimension::MemberList& rMembers = pSaveDim->GetMembers(); + CPPUNIT_ASSERT_EQUAL(size_t(3), rMembers.size()); + ScDPSaveMember* pMember = pSaveDim->GetExistingMemberByName("United States"); + CPPUNIT_ASSERT(pMember); + CPPUNIT_ASSERT(pMember->HasIsVisible() && !pMember->GetIsVisible()); + pMember = pSaveDim->GetExistingMemberByName("United Kingdom"); + CPPUNIT_ASSERT(pMember); + CPPUNIT_ASSERT(pMember->HasIsVisible() && pMember->GetIsVisible()); + pMember = pSaveDim->GetExistingMemberByName(""); + CPPUNIT_ASSERT(pMember); + CPPUNIT_ASSERT(pMember->HasIsVisible() && !pMember->GetIsVisible()); + } + + xDocSh->DoClose(); +} + CPPUNIT_TEST_SUITE_REGISTRATION(ScExportTest); CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/sc/source/filter/excel/xipivot.cxx b/sc/source/filter/excel/xipivot.cxx index ae68e9fe016c..b382c6f088fe 100644 --- a/sc/source/filter/excel/xipivot.cxx +++ b/sc/source/filter/excel/xipivot.cxx @@ -882,26 +882,21 @@ const OUString* XclImpPTItem::GetItemName() const return nullptr; } -void XclImpPTItem::ReadSxvi( XclImpStream& rStrm ) -{ - rStrm >> maItemInfo; -} - -void XclImpPTItem::ConvertItem( ScDPSaveDimension& rSaveDim, ScDPObject* pObj, const XclImpRoot& rRoot ) const +std::pair<bool, OUString> XclImpPTItem::GetItemName(const ScDPSaveDimension& rSaveDim, ScDPObject* pObj, const XclImpRoot& rRoot) const { if(!mpCacheField) - return; + return std::pair<bool, OUString>(false, OUString()); const XclImpPCItem* pCacheItem = mpCacheField->GetItem( maItemInfo.mnCacheIdx ); if(!pCacheItem) - return; + return std::pair<bool, OUString>(false, OUString()); OUString sItemName; if(pCacheItem->GetType() == EXC_PCITEM_TEXT || pCacheItem->GetType() == EXC_PCITEM_ERROR) { const OUString* pItemName = pCacheItem->GetText(); if(!pItemName) - return; + return std::pair<bool, OUString>(false, OUString()); sItemName = *pItemName; } else if (pCacheItem->GetType() == EXC_PCITEM_DOUBLE) @@ -925,16 +920,30 @@ void XclImpPTItem::ConvertItem( ScDPSaveDimension& rSaveDim, ScDPObject* pObj, c // sItemName is an empty string } else // EXC_PCITEM_INVALID - return; + return std::pair<bool, OUString>(false, OUString()); + + return std::pair<bool, OUString>(true, sItemName); +} + +void XclImpPTItem::ReadSxvi( XclImpStream& rStrm ) +{ + rStrm >> maItemInfo; +} +void XclImpPTItem::ConvertItem( ScDPSaveDimension& rSaveDim, ScDPObject* pObj, const XclImpRoot& rRoot ) const +{ // Find member and set properties - ScDPSaveMember* pMember = rSaveDim.GetExistingMemberByName( sItemName ); - if(pMember) + std::pair<bool, OUString> aReturnedName = GetItemName(rSaveDim, pObj, rRoot); + if(aReturnedName.first) { - pMember->SetIsVisible( !::get_flag( maItemInfo.mnFlags, EXC_SXVI_HIDDEN ) ); - pMember->SetShowDetails( !::get_flag( maItemInfo.mnFlags, EXC_SXVI_HIDEDETAIL ) ); - if (maItemInfo.HasVisName()) - pMember->SetLayoutName(*maItemInfo.GetVisName()); + ScDPSaveMember* pMember = rSaveDim.GetExistingMemberByName(aReturnedName.second); + if(pMember) + { + pMember->SetIsVisible( !::get_flag( maItemInfo.mnFlags, EXC_SXVI_HIDDEN ) ); + pMember->SetShowDetails( !::get_flag( maItemInfo.mnFlags, EXC_SXVI_HIDEDETAIL ) ); + if (maItemInfo.HasVisName()) + pMember->SetLayoutName(*maItemInfo.GetVisName()); + } } } @@ -1016,12 +1025,7 @@ void XclImpPTField::SetPageFieldInfo( const XclPTPageFieldInfo& rPageInfo ) void XclImpPTField::ConvertPageField( ScDPSaveData& rSaveData ) const { OSL_ENSURE( maFieldInfo.mnAxes & EXC_SXVD_AXIS_PAGE, "XclImpPTField::ConvertPageField - no page field" ); - if( ScDPSaveDimension* pSaveDim = ConvertRCPField( rSaveData ) ) - { - const OUString* pName = GetItemName( maPageInfo.mnSelItem ); - if (pName) - pSaveDim->SetCurrentPage(pName); - } + ConvertRCPField( rSaveData ); } // hidden fields -------------------------------------------------------------- @@ -1163,7 +1167,7 @@ ScDPSaveDimension* XclImpPTField::ConvertRCPField( ScDPSaveData& rSaveData ) con return &rSaveDim; } -void XclImpPTField::ConvertFieldInfo( const ScDPSaveData& rSaveData, ScDPObject* pObj, const XclImpRoot& rRoot ) const +void XclImpPTField::ConvertFieldInfo( const ScDPSaveData& rSaveData, ScDPObject* pObj, const XclImpRoot& rRoot, bool bPageField ) const { const OUString& rFieldName = GetFieldName(); if( rFieldName.isEmpty() ) @@ -1173,13 +1177,24 @@ void XclImpPTField::ConvertFieldInfo( const ScDPSaveData& rSaveData, ScDPObject* if( !pCacheField || !pCacheField->IsSupportedField() ) return; - ScDPSaveDimension* pTest = rSaveData.GetExistingDimensionByName(rFieldName); - if (!pTest) + ScDPSaveDimension* pSaveDim = rSaveData.GetExistingDimensionByName(rFieldName); + if (!pSaveDim) return; - pTest->SetShowEmpty( ::get_flag( maFieldExtInfo.mnFlags, EXC_SXVDEX_SHOWALL ) ); + pSaveDim->SetShowEmpty( ::get_flag( maFieldExtInfo.mnFlags, EXC_SXVDEX_SHOWALL ) ); for( XclImpPTItemVec::const_iterator aIt = maItems.begin(), aEnd = maItems.end(); aIt != aEnd; ++aIt ) - (*aIt)->ConvertItem( *pTest, pObj, rRoot ); + (*aIt)->ConvertItem( *pSaveDim, pObj, rRoot ); + + if(bPageField && maPageInfo.mnSelItem != EXC_SXPI_ALLITEMS) + { + const XclImpPTItem* pItem = GetItem( maPageInfo.mnSelItem ); + if(pItem) + { + std::pair<bool, OUString> aReturnedName = pItem->GetItemName(*pSaveDim, pObj, rRoot); + if(aReturnedName.first) + pSaveDim->SetCurrentPage(&aReturnedName.second); + } + } } void XclImpPTField::ConvertDataField( ScDPSaveDimension& rSaveDim, const XclPTDataFieldInfo& rDataInfo ) const @@ -1579,7 +1594,7 @@ void XclImpPivotTable::ApplyFieldInfo() // page fields for( auto aIt = maPageFields.begin(), aEnd = maPageFields.end(); aIt != aEnd; ++aIt ) if( const XclImpPTField* pField = GetField( *aIt ) ) - pField->ConvertFieldInfo( rSaveData, mpDPObj, *this ); + pField->ConvertFieldInfo( rSaveData, mpDPObj, *this, true ); // hidden fields for( sal_uInt16 nField = 0, nCount = GetFieldCount(); nField < nCount; ++nField ) diff --git a/sc/source/filter/inc/xipivot.hxx b/sc/source/filter/inc/xipivot.hxx index ef58d20c4f8c..3fd656cee83a 100644 --- a/sc/source/filter/inc/xipivot.hxx +++ b/sc/source/filter/inc/xipivot.hxx @@ -202,6 +202,8 @@ public: /** Returns the internal name of the item or 0, if no name could be found. */ const OUString* GetItemName() const; + /** Returns the internal name of the item. */ + std::pair<bool, OUString> GetItemName(const ScDPSaveDimension& rSaveDim, ScDPObject* pObj, const XclImpRoot& rRoot) const; /** Reads an SXVI record containing data of this item. */ void ReadSxvi( XclImpStream& rStrm ); @@ -268,7 +270,7 @@ public: void AddDataFieldInfo( const XclPTDataFieldInfo& rDataInfo ); void ConvertDataField( ScDPSaveData& rSaveData ) const; - void ConvertFieldInfo( const ScDPSaveData& rSaveData, ScDPObject* pObj, const XclImpRoot& rRoot ) const; + void ConvertFieldInfo( const ScDPSaveData& rSaveData, ScDPObject* pObj, const XclImpRoot& rRoot, bool bPageField = false ) const; private: ScDPSaveDimension* ConvertRCPField( ScDPSaveData& rSaveData ) const;
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits