diff options
Diffstat (limited to 'sc/source/filter/oox/pivottablebuffer.cxx')
-rw-r--r-- | sc/source/filter/oox/pivottablebuffer.cxx | 66 |
1 files changed, 64 insertions, 2 deletions
diff --git a/sc/source/filter/oox/pivottablebuffer.cxx b/sc/source/filter/oox/pivottablebuffer.cxx index 99b80b97231c..04a432ae8d92 100644 --- a/sc/source/filter/oox/pivottablebuffer.cxx +++ b/sc/source/filter/oox/pivottablebuffer.cxx @@ -49,6 +49,9 @@ #include "dapiuno.hxx" #include "dpobject.hxx" #include "dpsave.hxx" +#include "dpdimsave.hxx" +#include "document.hxx" +#include "documentimport.hxx" namespace oox { namespace xls { @@ -424,11 +427,12 @@ void PivotTableField::finalizeDateGroupingImport( const Reference< XDataPilotFie { if( maDPFieldName.isEmpty() ) // prevent endless loops if file format is broken { - if( const PivotCacheField* pCacheField = mrPivotTable.getCacheField( mnFieldIndex ) ) + if( PivotCacheField* pCacheField = mrPivotTable.getCacheField( mnFieldIndex ) ) { if( !pCacheField->isDatabaseField() && pCacheField->hasDateGrouping() && (pCacheField->getGroupBaseField() == nBaseFieldIdx) ) { maDPFieldName = pCacheField->createDateGroupField( rxBaseDPField ); + pCacheField->setFinalGroupName(maDPFieldName); OSL_ENSURE( !maDPFieldName.isEmpty(), "PivotTableField::finalizeDateGroupingImport - cannot create date group field" ); } } @@ -453,6 +457,7 @@ void PivotTableField::finalizeParentGroupingImport( const Reference< XDataPilotF pCacheField->applyItemCaptions( captionList ); maDPFieldName = pCacheField->createParentGroupField( rxBaseDPField, rBaseCacheField, orItemNames ); + pCacheField->setFinalGroupName(maDPFieldName); // on success, try to create nested group fields Reference< XDataPilotField > xDPField = mrPivotTable.getDataPilotField( maDPFieldName ); if( xDPField.is() ) @@ -461,6 +466,33 @@ void PivotTableField::finalizeParentGroupingImport( const Reference< XDataPilotF } } +void PivotTableField::finalizeImportBasedOnCache( const Reference< XDataPilotDescriptor >& rxDPDesc) +{ + /* Process all fields based on source data, other fields (e.g. group + fields) are processed based on cache fields.*/ + Reference< XDataPilotField > xDPField; + sal_Int32 nDatabaseIdx = mrPivotTable.getCacheDatabaseIndex( mnFieldIndex ); + if( (nDatabaseIdx >= 0) && rxDPDesc.is() ) try + { + // Try to get the source field and its name from passed DataPilot descriptor + Reference< XIndexAccess > xDPFieldsIA( rxDPDesc->getDataPilotFields(), UNO_SET_THROW ); + xDPField.set( xDPFieldsIA->getByIndex( nDatabaseIdx ), UNO_QUERY_THROW ); + Reference< XNamed > xDPFieldName( xDPField, UNO_QUERY_THROW ); + maDPFieldName = xDPFieldName->getName(); + SAL_WARN_IF( maDPFieldName.isEmpty(), "sc.filter", "PivotTableField::finalizeImportBasedOnCache - no field name in source data found" ); + } + catch( Exception& ) + { + } + + // Use group names already generated for another table using the same group field. + if( const PivotCacheField* pCacheField = mrPivotTable.getCacheField( mnFieldIndex ) ) + { + if(!pCacheField->getFinalGroupName().isEmpty()) + maDPFieldName = pCacheField->getFinalGroupName(); + } +} + void PivotTableField::convertRowField() { convertRowColPageField( XML_axisRow ); @@ -1190,7 +1222,7 @@ void PivotTable::finalizeImport() aDescProp.setProperty( PROP_DrillDownOnDoubleClick, maDefModel.mbEnableDrill ); // finalize all fields, this finds field names and creates grouping fields - maFields.forEachMem(&PivotTableField::finalizeImport, ::std::cref(mxDPDescriptor)); + finalizeFieldsImport(); // all row fields for( IndexVector::iterator aIt = maRowFields.begin(), aEnd = maRowFields.end(); aIt != aEnd; ++aIt ) @@ -1250,6 +1282,36 @@ void PivotTable::finalizeImport() } } +void PivotTable::finalizeFieldsImport() +{ + if (maFields.empty()) + return; + + /* Check whether group fields are already imported for an other table + sharing the same groups. */ + ScDPObject* pDPObj = getDPObject(); + const ScDocument& rDoc = getDocImport().getDoc(); + if (rDoc.HasPivotTable()) + { + const ScDPCollection* pDPCollection = rDoc.GetDPCollection(); + assert(pDPCollection != nullptr); + const ScDPDimensionSaveData* pGroups = nullptr; + bool bRefFound = pDPCollection->GetReferenceGroups(*pDPObj, &pGroups); + // Apply reference groups on this table. + if (bRefFound && pGroups && pGroups->HasGroupDimensions()) { + ScDPSaveData* pSaveData = pDPObj->GetSaveData(); + if (pSaveData) { + pSaveData->SetDimensionData(pGroups); + pDPObj->ReloadGroupTableData(); + maFields.forEachMem(&PivotTableField::finalizeImportBasedOnCache, ::std::cref(mxDPDescriptor)); + return; + } + + } + } + maFields.forEachMem(&PivotTableField::finalizeImport, ::std::cref(mxDPDescriptor)); +} + void PivotTable::finalizeDateGroupingImport( const Reference< XDataPilotField >& rxBaseDPField, sal_Int32 nBaseFieldIdx ) { // process all fields, there is no chaining information in the cache fields |