diff --git a/sc/qa/unit/data/xls/pivottable_number_grouping.xls b/sc/qa/unit/data/xls/pivottable_number_grouping.xls new file mode 100644 index 000000000000..784bb74fafe8 Binary files /dev/null and b/sc/qa/unit/data/xls/pivottable_number_grouping.xls differ diff --git a/sc/qa/unit/pivottable_filters_test.cxx b/sc/qa/unit/pivottable_filters_test.cxx index 39b00a0602d6..34d05bbb5016 100644 --- a/sc/qa/unit/pivottable_filters_test.cxx +++ b/sc/qa/unit/pivottable_filters_test.cxx @@ -3011,6 +3011,20 @@ CPPUNIT_TEST_FIXTURE(ScPivotTableFiltersTest, testCalcFieldNameErrorXLSX) CPPUNIT_ASSERT_EQUAL(u"IF(#NAME? >0,#NAME?,0)"_ustr, aFormula); } +CPPUNIT_TEST_FIXTURE(ScPivotTableFiltersTest, testNumberGroupingXLS) +{ + createScDoc("xls/pivottable_number_grouping.xls"); + save(TestFilter::XLSX); + + xmlDocUniquePtr pCacheDef = parseExport(u"xl/pivotCache/pivotCacheDefinition1.xml"_ustr); + CPPUNIT_ASSERT(pCacheDef); + + assertXPath(pCacheDef, + "/x:pivotCacheDefinition/x:cacheFields/x:cacheField[@databaseField='0']/" + "x:fieldGroup/x:groupItems", + "count", u"3"); +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/filter/excel/xipivot.cxx b/sc/source/filter/excel/xipivot.cxx index 78602724ce88..f8ac4052f599 100644 --- a/sc/source/filter/excel/xipivot.cxx +++ b/sc/source/filter/excel/xipivot.cxx @@ -404,6 +404,18 @@ void XclImpPCField::ConvertGroupField( ScDPSaveData& rSaveData, const ScfStringV // private -------------------------------------------------------------------- +static OUString lcl_ItemToText( const XclImpPCItem& rItem ) +{ + const OUString& rText = rItem.ConvertToText(); + if( !rText.isEmpty() ) + return rText; + if( const double* pVal = rItem.GetDouble() ) + return OUString::number( *pVal ); + if( const sal_Int16* pVal = rItem.GetInteger() ) + return OUString::number( *pVal ); + return rText; +} + void XclImpPCField::ConvertStdGroupField( ScDPSaveData& rSaveData, const ScfStringVec& rVisNames ) const { const XclImpPCField* pBaseField = GetGroupBaseField(); @@ -419,7 +431,7 @@ void XclImpPCField::ConvertStdGroupField( ScDPSaveData& rSaveData, const ScfStri aGroupItems.reserve( maItems.size() ); // initialize with own item names for( const auto& rxItem : maItems ) - aGroupItems.emplace_back( rxItem->ConvertToText() ); + aGroupItems.emplace_back(lcl_ItemToText(*rxItem)); // *** iterate over all base items, set their names at corresponding own items *** for( sal_uInt16 nItemIdx = 0, nItemCount = static_cast< sal_uInt16 >( maGroupOrder.size() ); nItemIdx < nItemCount; ++nItemIdx ) @@ -427,7 +439,7 @@ void XclImpPCField::ConvertStdGroupField( ScDPSaveData& rSaveData, const ScfStri if( const XclImpPCItem* pBaseItem = pBaseField->GetItem( nItemIdx ) ) if( const XclImpPCItem* pGroupItem = GetItem( maGroupOrder[ nItemIdx ] ) ) if( *pBaseItem != *pGroupItem ) - aGroupItems[ maGroupOrder[ nItemIdx ] ].AddElement( pBaseItem->ConvertToText() ); + aGroupItems[maGroupOrder[nItemIdx]].AddElement(lcl_ItemToText(*pBaseItem)); // *** create the ScDPSaveGroupDimension object, fill with grouping info *** ScDPSaveGroupDimension aGroupDim( rBaseFieldName, GetFieldName( rVisNames ) );