From c379168711858664baabe7fa482a4c7dd3bc7891 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Toma=C5=BE=20Vajngerl?= Date: Thu, 11 Apr 2024 16:31:32 +0900 Subject: [PATCH] pivot: PivotTableFormatOutput to resolve and set PT cell format MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This adds the PivotTableFormatOutput, which main responsibility is to resolve the reference for which the pivot table format is set to. It first prepares the format data into such a structure that it is easier to match with the pivot table fields and data. Then the pivot table data is filled during the output, where we remember the cell positions of the pivot table output. The last step is to resolve the pivot table format references with the filled data, where the cell formats are applied to the output. PivotTableFormatsImportExport was added to test the correctnes of the functionality. Change-Id: Ie67ea15b3aa74739f15937800d03d256b8f68277 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165992 Tested-by: Jenkins Reviewed-by: Tomaž Vajngerl --- ...c_pivottable_formats_import_export_test.mk | 86 +++++ sc/Library_sc.mk | 1 + sc/Module_sc.mk | 1 + sc/inc/dpobject.hxx | 4 +- sc/inc/dpoutput.hxx | 16 +- sc/inc/pivot/DPOutLevelData.hxx | 65 ++++ sc/inc/pivot/PivotTableFormatOutput.hxx | 112 ++++++ sc/inc/pivot/PivotTableFormats.hxx | 41 ++- sc/qa/unit/PivotTableFormatsImportExport.cxx | 161 ++++++++ ...tsTest_1_DataFieldInRow_RowLabelColor.xlsx | Bin 0 -> 16366 bytes ...est_2_DataFieldInRow_ColumnLabelColor.xlsx | Bin 0 -> 16579 bytes ..._3_DataFieldInColumn_ColumnLabelColor.xlsx | Bin 0 -> 16305 bytes ...atsTest_4_DataFieldInColumn_DataColor.xlsx | Bin 0 -> 16310 bytes ...ieldInColumnAndTwoRowFields_DataColor.xlsx | Bin 0 -> 16841 bytes ...t_6_SingleDataFieldInColumn_DataColor.xlsx | Bin 0 -> 17015 bytes ...est_7_TwoRowTwoColumnFields_DataColor.xlsx | Bin 0 -> 17354 bytes .../core/data/PivotTableFormatOutput.cxx | 348 ++++++++++++++++++ sc/source/core/data/dpobject.cxx | 14 +- sc/source/core/data/dpoutput.cxx | 99 ++--- sc/source/filter/oox/PivotTableFormat.cxx | 21 +- 20 files changed, 862 insertions(+), 107 deletions(-) create mode 100644 sc/CppunitTest_sc_pivottable_formats_import_export_test.mk create mode 100644 sc/inc/pivot/DPOutLevelData.hxx create mode 100644 sc/inc/pivot/PivotTableFormatOutput.hxx create mode 100644 sc/qa/unit/PivotTableFormatsImportExport.cxx create mode 100644 sc/qa/unit/data/xlsx/pivot-table/PivotTableCellFormatsTest_1_DataFieldInRow_RowLabelColor.xlsx create mode 100644 sc/qa/unit/data/xlsx/pivot-table/PivotTableCellFormatsTest_2_DataFieldInRow_ColumnLabelColor.xlsx create mode 100644 sc/qa/unit/data/xlsx/pivot-table/PivotTableCellFormatsTest_3_DataFieldInColumn_ColumnLabelColor.xlsx create mode 100644 sc/qa/unit/data/xlsx/pivot-table/PivotTableCellFormatsTest_4_DataFieldInColumn_DataColor.xlsx create mode 100644 sc/qa/unit/data/xlsx/pivot-table/PivotTableCellFormatsTest_5_DataFieldInColumnAndTwoRowFields_DataColor.xlsx create mode 100644 sc/qa/unit/data/xlsx/pivot-table/PivotTableCellFormatsTest_6_SingleDataFieldInColumn_DataColor.xlsx create mode 100644 sc/qa/unit/data/xlsx/pivot-table/PivotTableCellFormatsTest_7_TwoRowTwoColumnFields_DataColor.xlsx create mode 100644 sc/source/core/data/PivotTableFormatOutput.cxx diff --git a/sc/CppunitTest_sc_pivottable_formats_import_export_test.mk b/sc/CppunitTest_sc_pivottable_formats_import_export_test.mk new file mode 100644 index 000000000000..827137a7d5f9 --- /dev/null +++ b/sc/CppunitTest_sc_pivottable_formats_import_export_test.mk @@ -0,0 +1,86 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +$(eval $(call gb_CppunitTest_CppunitTest,sc_pivottable_formats_import_export_test)) + +$(eval $(call gb_CppunitTest_use_common_precompiled_header,sc_pivottable_formats_import_export_test)) + +$(eval $(call gb_CppunitTest_add_exception_objects,sc_pivottable_formats_import_export_test, \ + sc/qa/unit/PivotTableFormatsImportExport \ +)) + +$(eval $(call gb_CppunitTest_use_externals,sc_pivottable_formats_import_export_test, \ + boost_headers \ + mdds_headers \ + libxml2 \ +)) + +$(eval $(call gb_CppunitTest_use_libraries,sc_pivottable_formats_import_export_test, \ + basegfx \ + comphelper \ + cppu \ + cppuhelper \ + drawinglayer \ + drawinglayercore \ + editeng \ + for \ + forui \ + i18nlangtag \ + msfilter \ + oox \ + sal \ + salhelper \ + sax \ + sc \ + scqahelper \ + sfx \ + sot \ + subsequenttest \ + svl \ + svt \ + svx \ + svxcore \ + test \ + tk \ + tl \ + ucbhelper \ + unotest \ + utl \ + vcl \ + xo \ +)) + +$(eval $(call gb_CppunitTest_set_include,sc_pivottable_formats_import_export_test,\ + -I$(SRCDIR)/sc/source/ui/inc \ + -I$(SRCDIR)/sc/inc \ + $$(INCLUDE) \ +)) + +$(eval $(call gb_CppunitTest_use_api,sc_pivottable_formats_import_export_test,\ + udkapi \ + offapi \ + oovbaapi \ +)) + +$(eval $(call gb_CppunitTest_use_ure,sc_pivottable_formats_import_export_test)) +$(eval $(call gb_CppunitTest_use_vcl,sc_pivottable_formats_import_export_test)) + +$(eval $(call gb_CppunitTest_use_rdb,sc_pivottable_formats_import_export_test,services)) + +$(eval $(call gb_CppunitTest_use_custom_headers,sc_pivottable_formats_import_export_test,\ + officecfg/registry \ +)) + +$(eval $(call gb_CppunitTest_use_configuration,sc_pivottable_formats_import_export_test)) + +$(eval $(call gb_CppunitTest_add_arguments,sc_pivottable_formats_import_export_test, \ + -env:arg-env=$(gb_Helper_LIBRARY_PATH_VAR)"$$$${$(gb_Helper_LIBRARY_PATH_VAR)+=$$$$$(gb_Helper_LIBRARY_PATH_VAR)}" \ +)) + +# vim: set noet sw=4 ts=4: diff --git a/sc/Library_sc.mk b/sc/Library_sc.mk index 273eaab04435..eaa79cf10903 100644 --- a/sc/Library_sc.mk +++ b/sc/Library_sc.mk @@ -178,6 +178,7 @@ $(eval $(call gb_Library_add_exception_objects,sc,\ sc/source/core/data/pagepar \ sc/source/core/data/patattr \ sc/source/core/data/pivot2 \ + sc/source/core/data/PivotTableFormatOutput \ sc/source/core/data/poolcach \ sc/source/core/data/poolhelp \ sc/source/core/data/postit \ diff --git a/sc/Module_sc.mk b/sc/Module_sc.mk index d966be26e8dc..25b43c6b19df 100644 --- a/sc/Module_sc.mk +++ b/sc/Module_sc.mk @@ -85,6 +85,7 @@ $(eval $(call gb_Module_add_slowcheck_targets,sc, \ CppunitTest_sc_new_cond_format_api \ CppunitTest_sc_pdf_export \ CppunitTest_sc_pivottable_filters_test \ + CppunitTest_sc_pivottable_formats_import_export_test \ CppunitTest_sc_sparkline_test \ CppunitTest_sc_subsequent_filters_test \ CppunitTest_sc_subsequent_filters_test2 \ diff --git a/sc/inc/dpobject.hxx b/sc/inc/dpobject.hxx index fd1783cda03e..06ffc0085cf2 100644 --- a/sc/inc/dpobject.hxx +++ b/sc/inc/dpobject.hxx @@ -108,7 +108,6 @@ private: bool mbSettingsChanged : 1; bool mbEnableGetPivotData : 1; - ScDPTableData* GetTableData(); void CreateObjects(); void CreateOutput(); void ClearSource(); @@ -130,6 +129,8 @@ public: void InvalidateData(); void Clear(); void ClearTableData(); + ScDPTableData* GetTableData(); + SC_DLLPUBLIC void ReloadGroupTableData(); SC_DLLPUBLIC void Output( const ScAddress& rPos ); @@ -188,6 +189,7 @@ public: tools::Rectangle& rPosRect, css::sheet::DataPilotFieldOrientation& rOrient, tools::Long& rDimPos ); bool IsFilterButton( const ScAddress& rPos ); + static OUString GetFormattedString(ScDPTableData* pTableData, tools::Long nDimension, const double fValue); SC_DLLPUBLIC OUString GetFormattedString( std::u16string_view rDimName, const double fValue ); double GetPivotData( diff --git a/sc/inc/dpoutput.hxx b/sc/inc/dpoutput.hxx index 01ae4fb1c600..11251afd4fdf 100644 --- a/sc/inc/dpoutput.hxx +++ b/sc/inc/dpoutput.hxx @@ -29,6 +29,7 @@ #include "dptypes.hxx" #include "pivot/PivotTableFormats.hxx" +#include "pivot/PivotTableFormatOutput.hxx" #include #include @@ -44,11 +45,13 @@ namespace tools { class Rectangle; } class ScDocument; struct ScDPOutLevelData; class ScDPOutputImpl; +class ScDPObject; class ScDPOutput { private: ScDocument* mpDocument; + sc::FormatOutput maFormatOutput; css::uno::Reference mxSource; ScAddress maStartPos; std::vector mpColFields; @@ -66,8 +69,6 @@ private: sal_uInt32 mnSingleNumberFormat; size_t mnRowDims; // Including empty ones. - std::unique_ptr mpFormats; - // Output geometry related parameters sal_Int32 mnColCount; sal_Int32 mnRowCount; @@ -116,10 +117,11 @@ private: void outputDataResults(SCTAB nTab); public: - ScDPOutput( ScDocument* pD, - css::uno::Reference< css::sheet::XDimensionsSupplier> xSrc, - const ScAddress& rPos, bool bFilter, bool bExpandCollapse ); - ~ScDPOutput(); + ScDPOutput(ScDocument* pDocument, + css::uno::Reference xSource, + const ScAddress& rPosition, bool bFilter, bool bExpandCollapse, + ScDPObject& rObject); + ~ScDPOutput(); void SetPosition( const ScAddress& rPos ); @@ -147,7 +149,7 @@ public: void setFormats(sc::PivotTableFormats const& rPivotTableFormats) { - mpFormats.reset(new sc::PivotTableFormats(rPivotTableFormats)); + maFormatOutput.setFormats(rPivotTableFormats); } static void GetDataDimensionNames( diff --git a/sc/inc/pivot/DPOutLevelData.hxx b/sc/inc/pivot/DPOutLevelData.hxx new file mode 100644 index 000000000000..01f06d990655 --- /dev/null +++ b/sc/inc/pivot/DPOutLevelData.hxx @@ -0,0 +1,65 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include +#include + +#include +#include + +using namespace css; + +struct ScDPOutLevelData +{ + tools::Long mnDim; + tools::Long mnHier; + tools::Long mnLevel; + tools::Long mnDimPos; + sal_uInt32 mnSrcNumFmt; /// Prevailing number format used in the source data. + uno::Sequence maResult; + OUString maName; /// Name is the internal field name. + OUString maCaption; /// Caption is the name visible in the output table. + bool mbHasHiddenMember : 1; + bool mbDataLayout : 1; + bool mbPageDim : 1; + + ScDPOutLevelData(tools::Long nDim, tools::Long nHier, tools::Long nLevel, tools::Long nDimPos, + sal_uInt32 nSrcNumFmt, const uno::Sequence& aResult, + OUString aName, OUString aCaption, bool bHasHiddenMember, bool bDataLayout, + bool bPageDim) + : mnDim(nDim) + , mnHier(nHier) + , mnLevel(nLevel) + , mnDimPos(nDimPos) + , mnSrcNumFmt(nSrcNumFmt) + , maResult(aResult) + , maName(std::move(aName)) + , maCaption(std::move(aCaption)) + , mbHasHiddenMember(bHasHiddenMember) + , mbDataLayout(bDataLayout) + , mbPageDim(bPageDim) + { + } + + // bug (73840) in uno::Sequence - copy and then assign doesn't work! +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/inc/pivot/PivotTableFormatOutput.hxx b/sc/inc/pivot/PivotTableFormatOutput.hxx new file mode 100644 index 000000000000..59cad62c013c --- /dev/null +++ b/sc/inc/pivot/PivotTableFormatOutput.hxx @@ -0,0 +1,112 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#pragma once + +#include +#include +#include +#include +#include "PivotTableFormats.hxx" + +#include +#include + +namespace com::sun::star::sheet +{ +struct MemberResult; +} + +class ScDPObject; +struct ScDPOutLevelData; + +namespace sc +{ +enum class FormatResultDirection +{ + ROW, + COLUMN +}; + +struct FormatOutputField +{ + tools::Long nDimension = -2; + OUString aName; + sal_Int32 nIndex = -1; + bool bSet = false; +}; + +struct FormatOutputEntry +{ + FormatType eType = FormatType::None; + std::optional onTab = std::nullopt; + std::shared_ptr pPattern; + + std::vector aRowOutputFields; + std::vector aColumnOutputFields; +}; + +struct FieldData +{ + tools::Long mnDimension = -2; + OUString aName; + tools::Long nIndex; + + bool bIsSet = false; + bool bIsMember = false; + bool bSubtotal = false; + bool bContinue = false; +}; + +struct LineData +{ + std::optional oLine = std::nullopt; + std::optional oPosition = std::nullopt; + std::vector maFields; +}; + +class NameResolver; + +class FormatOutput +{ +private: + ScDPObject& mrObject; + +public: + FormatOutput(ScDPObject& rObject) + : mrObject(rObject) + { + } + + std::unique_ptr mpFormats; + std::vector maFormatOutputEntries; + + std::vector maRowLines; + std::vector maColumnLines; + + void setFormats(sc::PivotTableFormats const& rPivotTableFormats) + { + mpFormats.reset(new sc::PivotTableFormats(rPivotTableFormats)); + maFormatOutputEntries.resize(mpFormats->size()); + } + + void insertFieldMember(size_t nFieldIndex, const ScDPOutLevelData& rField, + tools::Long nMemberIndex, css::sheet::MemberResult const& rMember, + SCCOL nColPos, SCROW nRowPos, FormatResultDirection eResultDirection); + + void insertEmptyDataColumn(SCCOL nColPos, SCROW nRowPos); + + void apply(ScDocument& rDocument); + void prepare(SCTAB nTab, std::vector const& rColumnFields, + std::vector const& rRowFields, bool bColumnFieldIsDataOnly); +}; + +} // end sc + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/inc/pivot/PivotTableFormats.hxx b/sc/inc/pivot/PivotTableFormats.hxx index 7b65d0df5820..2665c088625c 100644 --- a/sc/inc/pivot/PivotTableFormats.hxx +++ b/sc/inc/pivot/PivotTableFormats.hxx @@ -17,31 +17,38 @@ namespace sc { -struct PivotTableFormat +/** Type of a pivot table cell format to which a selection can be made. */ +enum class FormatType { - sal_Int32 nField; - sal_Int32 nDataIndex; - std::shared_ptr pPattern; - - PivotTableFormat(sal_Int32 _nField, sal_Int32 _nDataIndex, - std::shared_ptr _pPattern) - : nField(_nField) - , nDataIndex(_nDataIndex) - , pPattern(_pPattern) - { - } + None, + Data, + Label }; +/** Information to make a selection in the pivot table. */ +struct Selection +{ + sal_Int32 nField = 0; + sal_uInt32 nDataIndex = 0; +}; + +/** Holds cell patter attributes and a selection information to which cells in the pivot table + * the pattern should be applied. + */ +struct PivotTableFormat +{ + FormatType eType = FormatType::None; + std::vector aSelections; + std::shared_ptr pPattern; +}; + +/** A holder for a collection of PivotTableFormat */ class PivotTableFormats { std::vector maFormats; public: - void add(sal_Int32 nField, sal_Int32 nDataIndex, - std::shared_ptr const& rpPattern) - { - maFormats.emplace_back(nField, nDataIndex, rpPattern); - } + void add(PivotTableFormat const& rPivotTableFormat) { maFormats.push_back(rPivotTableFormat); } size_t size() { return maFormats.size(); } diff --git a/sc/qa/unit/PivotTableFormatsImportExport.cxx b/sc/qa/unit/PivotTableFormatsImportExport.cxx new file mode 100644 index 000000000000..3cffe8cbc510 --- /dev/null +++ b/sc/qa/unit/PivotTableFormatsImportExport.cxx @@ -0,0 +1,161 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include + +#include "helper/qahelper.hxx" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace css; + +class ScPivotTableFormatsImportExport : public ScModelTestBase +{ +public: + ScPivotTableFormatsImportExport(); +}; + +ScPivotTableFormatsImportExport::ScPivotTableFormatsImportExport() + : ScModelTestBase("sc/qa/unit/data") +{ +} + +namespace +{ +Color getBackgroundColor(ScDocument& rDoc, OUString const& rAddressString) +{ + ScAddress aAddress; + aAddress.Parse(rAddressString, rDoc); + const ScPatternAttr* pPattern = rDoc.GetPattern(aAddress); + const SvxBrushItem& rItem = pPattern->GetItem(ATTR_BACKGROUND); + return rItem.GetColor(); +} + +Color getFontColor(ScDocument& rDoc, OUString const& rAddressString) +{ + ScAddress aAddress; + aAddress.Parse(rAddressString, rDoc); + const ScPatternAttr* pPattern = rDoc.GetPattern(aAddress); + const SvxColorItem& rItem = pPattern->GetItem(ATTR_FONT_COLOR); + return rItem.getColor(); +} +} // end anonymous namespace + +CPPUNIT_TEST_FIXTURE(ScPivotTableFormatsImportExport, + testPivotTableCellFormat_1_DataFieldInRow_RowLabelColor) +{ + auto assertDocument = [](ScDocument& rDoc) { + CPPUNIT_ASSERT_EQUAL(COL_YELLOW, getBackgroundColor(rDoc, u"G6"_ustr)); + CPPUNIT_ASSERT_EQUAL(COL_LIGHTRED, getFontColor(rDoc, u"G7"_ustr)); + }; + + createScDoc("xlsx/pivot-table/PivotTableCellFormatsTest_1_DataFieldInRow_RowLabelColor.xlsx"); + assertDocument(*getScDoc()); +} + +CPPUNIT_TEST_FIXTURE(ScPivotTableFormatsImportExport, + PivotTableCellFormatsTest_2_DataFieldInRow_ColumnLabelColor) +{ + auto assertDocument = [](ScDocument& rDoc) { + CPPUNIT_ASSERT_EQUAL(Color(0x00B050), getBackgroundColor(rDoc, u"H5"_ustr)); + }; + + createScDoc( + "xlsx/pivot-table/PivotTableCellFormatsTest_2_DataFieldInRow_ColumnLabelColor.xlsx"); + assertDocument(*getScDoc()); +} + +CPPUNIT_TEST_FIXTURE(ScPivotTableFormatsImportExport, + PivotTableCellFormatsTest_3_DataFieldInColumn_ColumnLabelColor) +{ + auto assertDocument = [](ScDocument& rDoc) { + CPPUNIT_ASSERT_EQUAL(COL_LIGHTRED, getFontColor(rDoc, u"H5"_ustr)); + CPPUNIT_ASSERT_EQUAL(Color(0x92D050), getBackgroundColor(rDoc, u"I5"_ustr)); + }; + + createScDoc( + "xlsx/pivot-table/PivotTableCellFormatsTest_3_DataFieldInColumn_ColumnLabelColor.xlsx"); + assertDocument(*getScDoc()); +} + +CPPUNIT_TEST_FIXTURE(ScPivotTableFormatsImportExport, + PivotTableCellFormatsTest_4_DataFieldInColumn_DataColor) +{ + auto assertDocument = [](ScDocument& rDoc) { + CPPUNIT_ASSERT_EQUAL(COL_LIGHTRED, getFontColor(rDoc, u"H7"_ustr)); + CPPUNIT_ASSERT_EQUAL(Color(0x92D050), getBackgroundColor(rDoc, u"I9"_ustr)); + }; + + createScDoc("xlsx/pivot-table/PivotTableCellFormatsTest_4_DataFieldInColumn_DataColor.xlsx"); + assertDocument(*getScDoc()); +} + +CPPUNIT_TEST_FIXTURE(ScPivotTableFormatsImportExport, + PivotTableCellFormatsTest_5_DataFieldInColumnAndTwoRowFields_DataColor) +{ + auto assertDocument = [](ScDocument& rDoc) { + CPPUNIT_ASSERT_EQUAL(COL_YELLOW, getBackgroundColor(rDoc, u"I8"_ustr)); + CPPUNIT_ASSERT_EQUAL(COL_LIGHTRED, getBackgroundColor(rDoc, u"I11"_ustr)); + CPPUNIT_ASSERT_EQUAL(Color(0x0070C0), getBackgroundColor(rDoc, u"J13"_ustr)); + }; + + createScDoc("xlsx/pivot-table//" + "PivotTableCellFormatsTest_5_DataFieldInColumnAndTwoRowFields_DataColor.xlsx"); + assertDocument(*getScDoc()); +} + +CPPUNIT_TEST_FIXTURE(ScPivotTableFormatsImportExport, + PivotTableCellFormatsTest_6_SingleDataFieldInColumn_DataColor) +{ + auto assertDocument = [](ScDocument& rDoc) { + CPPUNIT_ASSERT_EQUAL(COL_YELLOW, getBackgroundColor(rDoc, u"J8"_ustr)); + CPPUNIT_ASSERT_EQUAL(COL_LIGHTRED, getBackgroundColor(rDoc, u"J12"_ustr)); + }; + + createScDoc( + "xlsx/pivot-table//PivotTableCellFormatsTest_6_SingleDataFieldInColumn_DataColor.xlsx"); + assertDocument(*getScDoc()); +} + +CPPUNIT_TEST_FIXTURE(ScPivotTableFormatsImportExport, + PivotTableCellFormatsTest_7_TwoRowTwoColumnFields_DataColor) +{ + auto assertDocument = [](ScDocument& rDoc) { + CPPUNIT_ASSERT_EQUAL(COL_YELLOW, getBackgroundColor(rDoc, u"I7"_ustr)); + CPPUNIT_ASSERT_EQUAL(Color(0xFFC000), getBackgroundColor(rDoc, u"J8"_ustr)); + CPPUNIT_ASSERT_EQUAL(Color(0x0070C0), getBackgroundColor(rDoc, u"J9"_ustr)); + CPPUNIT_ASSERT_EQUAL(Color(0x00B0F0), getBackgroundColor(rDoc, u"J13"_ustr)); + CPPUNIT_ASSERT_EQUAL(Color(0x92D050), getBackgroundColor(rDoc, u"K12"_ustr)); + CPPUNIT_ASSERT_EQUAL(COL_LIGHTRED, getBackgroundColor(rDoc, u"L14"_ustr)); + }; + + createScDoc( + "xlsx/pivot-table//PivotTableCellFormatsTest_7_TwoRowTwoColumnFields_DataColor.xlsx"); + assertDocument(*getScDoc()); +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/qa/unit/data/xlsx/pivot-table/PivotTableCellFormatsTest_1_DataFieldInRow_RowLabelColor.xlsx b/sc/qa/unit/data/xlsx/pivot-table/PivotTableCellFormatsTest_1_DataFieldInRow_RowLabelColor.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..cd1b66f7cd06605d08d4e5609696dbedb25b32a9 GIT binary patch literal 16366 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 R(^%LL3E;_masHqG{Xg>~Eeiku literal 0 HcmV?d00001 diff --git a/sc/qa/unit/data/xlsx/pivot-table/PivotTableCellFormatsTest_2_DataFieldInRow_ColumnLabelColor.xlsx b/sc/qa/unit/data/xlsx/pivot-table/PivotTableCellFormatsTest_2_DataFieldInRow_ColumnLabelColor.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..e156cad5e0413e0a3a9285c30759790a592c6be9 GIT binary patch literal 16579 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 literal 0 HcmV?d00001 diff --git a/sc/qa/unit/data/xlsx/pivot-table/PivotTableCellFormatsTest_4_DataFieldInColumn_DataColor.xlsx b/sc/qa/unit/data/xlsx/pivot-table/PivotTableCellFormatsTest_4_DataFieldInColumn_DataColor.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..e3eaf72b3ebf9d102cb257fe38617c27be7a2a3a GIT binary patch literal 16310 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 W3_#QPgCd6tlmOU(G0yYHxBmmVMt@EK literal 0 HcmV?d00001 diff --git a/sc/qa/unit/data/xlsx/pivot-table/PivotTableCellFormatsTest_7_TwoRowTwoColumnFields_DataColor.xlsx b/sc/qa/unit/data/xlsx/pivot-table/PivotTableCellFormatsTest_7_TwoRowTwoColumnFields_DataColor.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..798e3bf82772d28e6652de183346451a4981957e GIT binary patch literal 17354 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 I?~nifAAed?7XSbN literal 0 HcmV?d00001 diff --git a/sc/source/core/data/PivotTableFormatOutput.cxx b/sc/source/core/data/PivotTableFormatOutput.cxx new file mode 100644 index 000000000000..350aef597ebd --- /dev/null +++ b/sc/source/core/data/PivotTableFormatOutput.cxx @@ -0,0 +1,348 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include +#include + +#include +#include +#include +#include +#include + +#include + +namespace sc +{ +class NameResolver +{ +private: + ScDPTableData& mrTableData; + ScDPCache const& mrCache; + + std::unordered_map> maNameCache; + + void fillNamesForDimension(std::vector& rNames, sal_Int32 nDimension) + { + for (const auto& rItemData : mrCache.GetDimMemberValues(nDimension)) + { + OUString sFormattedName; + if (rItemData.HasStringData() || rItemData.IsEmpty()) + sFormattedName = rItemData.GetString(); + else + sFormattedName = ScDPObject::GetFormattedString(&mrTableData, nDimension, + rItemData.GetValue()); + rNames.push_back(sFormattedName); + } + } + +public: + NameResolver(ScDPTableData& rTableData, ScDPCache const& rCache) + : mrTableData(rTableData) + , mrCache(rCache) + { + } + + OUString getNameForIndex(sal_uInt32 nIndex, sal_Int32 nDimension) + { + auto iterator = maNameCache.find(nDimension); + if (iterator == maNameCache.end()) + { + std::vector aNames; + fillNamesForDimension(aNames, nDimension); + maNameCache.emplace(nDimension, aNames); + return aNames[nIndex]; + } + else + { + std::vector& rNames = iterator->second; + return rNames[nIndex]; + } + } +}; + +namespace +{ +void initLines(std::vector& rLines, std::vector const& rFields) +{ + for (size_t i = 0; i < rFields.size(); i++) + { + size_t nFieldLength(rFields[i].maResult.getLength()); + if (rLines.size() < nFieldLength) + rLines.resize(nFieldLength); + + for (LineData& rLineData : rLines) + { + rLineData.maFields.resize(rFields.size()); + } + } +} + +void initFormatOutputField(std::vector& rOutputFields, + std::vector const& rFields, + PivotTableFormat const& rFormat, NameResolver& rNameResolver) +{ + rOutputFields.resize(rFields.size()); + for (size_t i = 0; i < rOutputFields.size(); i++) + { + FormatOutputField& rOutputField = rOutputFields[i]; + if (!rFields[i].mbDataLayout) + rOutputField.nDimension = rFields[i].mnDim; + + for (auto const& rSelection : rFormat.aSelections) + { + if (rSelection.nField == rOutputField.nDimension) + { + if (rOutputField.nDimension == -2) + { + rOutputField.aName = "DATA"; + rOutputField.nIndex = rSelection.nDataIndex; + rOutputField.bSet = true; + } + else + { + rOutputField.aName + = rNameResolver.getNameForIndex(rSelection.nDataIndex, rSelection.nField); + rOutputField.nIndex = rSelection.nDataIndex; + rOutputField.bSet = true; + } + } + } + } +} + +} // end anonymous namespace + +void FormatOutput::prepare(SCTAB nTab, std::vector const& rColumnFields, + std::vector const& rRowFields, + bool bColumnFieldIsDataOnly) +{ + if (!mpFormats) + return; + + initLines(maRowLines, rRowFields); + + if (rColumnFields.size() == 0 && bColumnFieldIsDataOnly) + { + maColumnLines.resize(1); + maColumnLines[0].maFields.resize(1); + } + else + { + initLines(maColumnLines, rColumnFields); + } + + auto* pTableData = mrObject.GetTableData(); + if (!pTableData) + return; + + ScDPFilteredCache const& rFilteredCache = pTableData->GetCacheTable(); + ScDPCache const& rCache = rFilteredCache.getCache(); + + NameResolver aNameResolver(*pTableData, rCache); + + size_t nFormatIndex = 0; + for (PivotTableFormat const& rFormat : mpFormats->getVector()) + { + sc::FormatOutputEntry& rEntry = maFormatOutputEntries[nFormatIndex]; + rEntry.pPattern = rFormat.pPattern; + rEntry.onTab = nTab; + rEntry.eType = rFormat.eType; + + initFormatOutputField(rEntry.aRowOutputFields, rRowFields, rFormat, aNameResolver); + + if (rColumnFields.size() == 0 && bColumnFieldIsDataOnly) + { + rEntry.aColumnOutputFields.resize(1); + FormatOutputField& rOutputField = rEntry.aColumnOutputFields[0]; + + for (auto const& rSelection : rFormat.aSelections) + { + if (rSelection.nField == -2) + { + rOutputField.aName = "DATA"; + rOutputField.nIndex = rSelection.nDataIndex; + rOutputField.bSet = true; + } + } + } + else + { + initFormatOutputField(rEntry.aColumnOutputFields, rColumnFields, rFormat, + aNameResolver); + } + nFormatIndex++; + } +} + +void FormatOutput::insertEmptyDataColumn(SCCOL nColPos, SCROW nRowPos) +{ + if (!mpFormats) + return; + + LineData& rLine = maColumnLines[0]; + rLine.oLine = nColPos; + rLine.oPosition = nRowPos; + + FieldData& rFieldData = rLine.maFields[0]; + rFieldData.nIndex = 0; + rFieldData.bIsSet = true; +} + +namespace +{ +void fillLineAndFieldData(std::vector& rLineDataVector, size_t nFieldIndex, + ScDPOutLevelData const& rField, tools::Long nMemberIndex, + sheet::MemberResult const& rMember, SCCOLROW nLine, SCCOLROW nPosition) +{ + LineData& rLine = rLineDataVector[nMemberIndex]; + rLine.oLine = nLine; + rLine.oPosition = nPosition; + + FieldData& rFieldData = rLine.maFields[nFieldIndex]; + if (!rField.mbDataLayout) + rFieldData.mnDimension = rField.mnDim; + rFieldData.aName = rMember.Name; + rFieldData.nIndex = nMemberIndex; + rFieldData.bIsSet = true; + rFieldData.bIsMember = rMember.Flags & sheet::MemberResultFlags::HASMEMBER; + rFieldData.bSubtotal = rMember.Flags & sheet::MemberResultFlags::SUBTOTAL; + rFieldData.bContinue = rMember.Flags & sheet::MemberResultFlags::CONTINUE; + + // Search previous entries for the name / value + if (rFieldData.bContinue) + { + tools::Long nCurrent = nMemberIndex - 1; + while (nCurrent >= 0 && rLineDataVector[nCurrent].maFields[nFieldIndex].bContinue) + nCurrent--; + + if (nCurrent >= 0) + { + FieldData& rCurrentFieldData = rLineDataVector[nCurrent].maFields[nFieldIndex]; + rFieldData.aName = rCurrentFieldData.aName; + rFieldData.nIndex = rCurrentFieldData.nIndex; + } + } +} +} // end anonymous namespace + +void FormatOutput::insertFieldMember(size_t nFieldIndex, ScDPOutLevelData const& rField, + tools::Long nMemberIndex, sheet::MemberResult const& rMember, + SCCOL nColPos, SCROW nRowPos, + sc::FormatResultDirection eResultDirection) +{ + if (!mpFormats) + return; + + if (eResultDirection == sc::FormatResultDirection::ROW) + fillLineAndFieldData(maRowLines, nFieldIndex, rField, nMemberIndex, rMember, nRowPos, + nColPos); + else if (eResultDirection == sc::FormatResultDirection::COLUMN) + fillLineAndFieldData(maColumnLines, nFieldIndex, rField, nMemberIndex, rMember, nColPos, + nRowPos); +} + +void FormatOutput::apply(ScDocument& rDocument) +{ + if (!mpFormats) + return; + + size_t nEntryIndex = 0; + for (auto const& rOutputEntry : maFormatOutputEntries) + { + if (!rOutputEntry.onTab || !rOutputEntry.pPattern) + continue; + + std::optional oRow; + std::optional oColumn; + + for (LineData const& rLineData : maRowLines) + { + bool bMatchesAll = true; + + for (size_t nIndex = 0; nIndex < rLineData.maFields.size(); nIndex++) + { + FieldData const& rFieldData = rLineData.maFields[nIndex]; + FormatOutputField const& rFormatEntry = rOutputEntry.aRowOutputFields[nIndex]; + + tools::Long nDimension = rFieldData.mnDimension; + if (nDimension == rFormatEntry.nDimension) + { + if (rFormatEntry.bSet) + { + if (nDimension == -2 && rFieldData.nIndex != rFormatEntry.nIndex) + bMatchesAll = false; + else if (nDimension != -2 && rFieldData.aName != rFormatEntry.aName) + bMatchesAll = false; + } + } + else + { + bMatchesAll = false; + } + } + + if (bMatchesAll) + { + if (rLineData.oLine && rLineData.oPosition + && rOutputEntry.eType == FormatType::Label) + rDocument.ApplyPattern(*rLineData.oPosition, *rLineData.oLine, + *rOutputEntry.onTab, *rOutputEntry.pPattern); + else if (rOutputEntry.eType == FormatType::Data) + oRow = rLineData.oLine; + break; + } + } + + for (LineData const& rLineData : maColumnLines) + { + bool bMatchesAll = true; + for (size_t nIndex = 0; nIndex < rLineData.maFields.size(); nIndex++) + { + FieldData const& rFieldData = rLineData.maFields[nIndex]; + FormatOutputField const& rFormatEntry = rOutputEntry.aColumnOutputFields[nIndex]; + + tools::Long nDimension = rFieldData.mnDimension; + if (nDimension == rFormatEntry.nDimension) + { + if (rFormatEntry.bSet) + { + if (nDimension == -2 && rFieldData.nIndex != rFormatEntry.nIndex) + bMatchesAll = false; + else if (nDimension != -2 && rFieldData.aName != rFormatEntry.aName) + bMatchesAll = false; + } + } + else + { + bMatchesAll = false; + } + } + if (bMatchesAll) + { + if (rLineData.oLine && rLineData.oPosition + && rOutputEntry.eType == FormatType::Label) + rDocument.ApplyPattern(*rLineData.oLine, *rLineData.oPosition, + *rOutputEntry.onTab, *rOutputEntry.pPattern); + else if (rOutputEntry.eType == FormatType::Data) + oColumn = rLineData.oLine; + break; + } + } + if (oColumn && oRow && rOutputEntry.eType == FormatType::Data) + { + rDocument.ApplyPattern(*oColumn, *oRow, *rOutputEntry.onTab, *rOutputEntry.pPattern); + } + nEntryIndex++; + } +} + +} // end sc + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/core/data/dpobject.cxx b/sc/source/core/data/dpobject.cxx index 3f98a5fcc40c..d80acccb55c4 100644 --- a/sc/source/core/data/dpobject.cxx +++ b/sc/source/core/data/dpobject.cxx @@ -528,7 +528,7 @@ void ScDPObject::CreateOutput() bool bFilterButton = IsSheetData() && mpSaveData && mpSaveData->GetFilterButton(); bool bExpandCollapse = mpSaveData ? mpSaveData->GetExpandCollapse() : false; - mpOutput.reset(new ScDPOutput(mpDocument, mxSource, maOutputRange.aStart, bFilterButton, bExpandCollapse)); + mpOutput.reset(new ScDPOutput(mpDocument, mxSource, maOutputRange.aStart, bFilterButton, bExpandCollapse, *this)); mpOutput->SetHeaderLayout(mbHeaderLayout); if (mpSaveData->hasFormats()) mpOutput->setFormats(mpSaveData->getFormats()); @@ -1442,6 +1442,13 @@ void ScDPObject::GetMemberResultNames(ScDPUniqueStringSet& rNames, tools::Long n mpOutput->GetMemberResultNames(rNames, nDimension); // used only with table data -> level not needed } +OUString ScDPObject::GetFormattedString(ScDPTableData* pTableData, tools::Long nDimension, const double fValue) +{ + ScDPItemData aItemData; + aItemData.SetValue(fValue); + return pTableData->GetFormattedString(nDimension, aItemData, false); +} + OUString ScDPObject::GetFormattedString(std::u16string_view rDimName, const double fValue) { ScDPTableData* pTableData = GetTableData(); @@ -1454,9 +1461,8 @@ OUString ScDPObject::GetFormattedString(std::u16string_view rDimName, const doub if(rDimName == pTableData->getDimensionName(nDim)) break; } - ScDPItemData aItemData; - aItemData.SetValue(fValue); - return GetTableData()->GetFormattedString(nDim, aItemData, false); + + return GetFormattedString(pTableData, nDim, fValue); } diff --git a/sc/source/core/data/dpoutput.cxx b/sc/source/core/data/dpoutput.cxx index 8847f857a181..1b20d6fc3a56 100644 --- a/sc/source/core/data/dpoutput.cxx +++ b/sc/source/core/data/dpoutput.cxx @@ -29,6 +29,7 @@ #include #include +#include #include #include #include @@ -41,6 +42,7 @@ #include #include #include +#include #include #include @@ -82,31 +84,6 @@ using ::com::sun::star::sheet::DataPilotTableResultData; #define SC_DP_FRAME_COLOR Color(0,0,0) //( 0x20, 0x40, 0x68 ) -struct ScDPOutLevelData -{ - tools::Long mnDim; - tools::Long mnHier; - tools::Long mnLevel; - tools::Long mnDimPos; - sal_uInt32 mnSrcNumFmt; /// Prevailing number format used in the source data. - uno::Sequence maResult; - OUString maName; /// Name is the internal field name. - OUString maCaption; /// Caption is the name visible in the output table. - bool mbHasHiddenMember:1; - bool mbDataLayout:1; - bool mbPageDim:1; - - ScDPOutLevelData(tools::Long nDim, tools::Long nHier, tools::Long nLevel, tools::Long nDimPos, sal_uInt32 nSrcNumFmt, const uno::Sequence &aResult, - OUString aName, OUString aCaption, bool bHasHiddenMember, bool bDataLayout, bool bPageDim) : - mnDim(nDim), mnHier(nHier), mnLevel(nLevel), mnDimPos(nDimPos), mnSrcNumFmt(nSrcNumFmt), maResult(aResult), - maName(std::move(aName)), maCaption(std::move(aCaption)), mbHasHiddenMember(bHasHiddenMember), mbDataLayout(bDataLayout), - mbPageDim(bPageDim) - { - } - - // bug (73840) in uno::Sequence - copy and then assign doesn't work! -}; - namespace { struct ScDPOutLevelDataComparator @@ -509,8 +486,9 @@ uno::Sequence getVisiblePageMembersAsResults( const uno::Re } // end anonymous namespace ScDPOutput::ScDPOutput(ScDocument* pDocument, uno::Reference xSource, - const ScAddress& rPosition, bool bFilter, bool bExpandCollapse) + const ScAddress& rPosition, bool bFilter, bool bExpandCollapse, ScDPObject& rObject) : mpDocument(pDocument) + , maFormatOutput(rObject) , mxSource(std::move(xSource)) , maStartPos(rPosition) , mnColFormatCount(0) @@ -1036,16 +1014,16 @@ void ScDPOutput::outputColumnHeaders(SCTAB nTab, ScDPOutputImpl& rOutputImpl) tools::Long nThisColCount = rMemberSequence.getLength(); OSL_ENSURE(nThisColCount == mnColCount, "count mismatch"); //TODO: ??? - tools::Long nColumnIndex = -1; for (tools::Long nColumn = 0; nColumn < nThisColCount; nColumn++) { - if (!(pMemberArray[nColumn].Flags & sheet::MemberResultFlags::CONTINUE)) - nColumnIndex++; + sheet::MemberResult const& rMember = rMemberSequence[nColumn]; SCCOL nColPos = mnDataStartCol + SCCOL(nColumn); //TODO: check for overflow - HeaderCell(nColPos, nRowPos, nTab, pMemberArray[nColumn], true, nField); - if ((pMemberArray[nColumn].Flags & sheet::MemberResultFlags::HASMEMBER) && - !(pMemberArray[nColumn].Flags & sheet::MemberResultFlags::SUBTOTAL)) + + HeaderCell(nColPos, nRowPos, nTab, rMember, true, nField); + + if ((rMember.Flags & sheet::MemberResultFlags::HASMEMBER) && + !(rMember.Flags & sheet::MemberResultFlags::SUBTOTAL)) { // Check the number of columns this spreads tools::Long nEnd = nColumn; @@ -1071,27 +1049,13 @@ void ScDPOutput::outputColumnHeaders(SCTAB nTab, ScDPOutputImpl& rOutputImpl) lcl_SetStyleById(mpDocument, nTab, nColPos, nRowPos, nColPos, mnDataStartRow - 1, STR_PIVOT_STYLENAME_CATEGORY); } } - else if (pMemberArray[nColumn].Flags & sheet::MemberResultFlags::SUBTOTAL) + else if (rMember.Flags & sheet::MemberResultFlags::SUBTOTAL) { rOutputImpl.AddCol(nColPos); } - // Apply format - if (mpFormats) - { - auto& rColumnField = mpColFields[nField]; - tools::Long nDimension = -2; - if (!rColumnField.mbDataLayout) - nDimension = rColumnField.mnDim; - - for (auto& aFormat : mpFormats->getVector()) - { - if (aFormat.nField == nDimension && aFormat.nDataIndex == nColumnIndex) - { - mpDocument->ApplyPattern(nColPos, nRowPos, nTab, *aFormat.pPattern); - } - } - } + // Resolve formats + maFormatOutput.insertFieldMember(nField, mpColFields[nField], nColumn, rMember, nColPos, nRowPos, sc::FormatResultDirection::COLUMN); // Apply the same number format as in data source. mpDocument->ApplyAttr(nColPos, nRowPos, nTab, SfxUInt32Item(ATTR_VALUE_FORMAT, mpColFields[nField].mnSrcNumFmt)); @@ -1123,12 +1087,10 @@ void ScDPOutput::outputRowHeader(SCTAB nTab, ScDPOutputImpl& rOutputImpl) const sheet::MemberResult* pMemberArray = rMemberSequence.getConstArray(); sal_Int32 nThisRowCount = rMemberSequence.getLength(); OSL_ENSURE(nThisRowCount == mnRowCount, "count mismatch"); //TODO: ??? - tools::Long nRowIndex = -1; for (sal_Int32 nRow = 0; nRow < nThisRowCount; nRow++) { - if (!(pMemberArray[nRow].Flags & sheet::MemberResultFlags::CONTINUE)) - nRowIndex++; - const sheet::MemberResult& rData = pMemberArray[nRow]; + sheet::MemberResult const& rMember = rMemberSequence[nRow]; + const sheet::MemberResult& rData = rMember; const bool bHasMember = rData.Flags & sheet::MemberResultFlags::HASMEMBER; const bool bSubtotal = rData.Flags & sheet::MemberResultFlags::SUBTOTAL; SCROW nRowPos = mnDataStartRow + SCROW(nRow); //TODO: check for overflow @@ -1181,21 +1143,8 @@ void ScDPOutput::outputRowHeader(SCTAB nTab, ScDPOutputImpl& rOutputImpl) rOutputImpl.AddRow(nRowPos); } - // Apply format - if (mpFormats) - { - auto& rRowField = mpRowFields[nField]; - tools::Long nDimension = -2; - if (!rRowField.mbDataLayout) - nDimension = rRowField.mnDim; - for (auto& aFormat : mpFormats->getVector()) - { - if (aFormat.nField == nDimension && aFormat.nDataIndex == nRowIndex) - { - mpDocument->ApplyPattern(nColPos, nRowPos, nTab, *aFormat.pPattern); - } - } - } + // Resolve formats + maFormatOutput.insertFieldMember(nField, mpRowFields[nField], nRow, rMember, nColPos, nRowPos, sc::FormatResultDirection::ROW); // Apply the same number format as in data source. mpDocument->ApplyAttr(nColPos, nRowPos, nTab, SfxUInt32Item(ATTR_VALUE_FORMAT, mpRowFields[nField].mnSrcNumFmt)); @@ -1230,6 +1179,8 @@ void ScDPOutput::outputDataResults(SCTAB nTab) DataCell(nColPos, nRowPos, nTab, pColAry[nCol]); } } + + maFormatOutput.apply(*mpDocument); } void ScDPOutput::Output() @@ -1237,12 +1188,15 @@ void ScDPOutput::Output() SCTAB nTab = maStartPos.Tab(); // calculate output positions and sizes - CalcSizes(); if (mbSizeOverflow || mbResultsError) // does output area exceed sheet limits? return; // nothing + // Prepare format output + bool bColumnFieldIsDataOnly = mnColCount == 1 && mnRowCount > 0 && mpColFields.empty(); + maFormatOutput.prepare(nTab, mpColFields, mpRowFields, bColumnFieldIsDataOnly); + // clear whole (new) output area // when modifying table, clear old area ! //TODO: include InsertDeleteFlags::OBJECTS ??? @@ -1275,13 +1229,16 @@ void ScDPOutput::Output() outputRowHeader(nTab, aOutputImpl); - if (mnColCount == 1 && mnRowCount > 0 && mpColFields.empty()) + if (bColumnFieldIsDataOnly) { // the table contains exactly one data field and no column fields. // Display data description at top right corner. ScSetStringParam aParam; aParam.setTextInput(); - mpDocument->SetString(mnDataStartCol, mnDataStartRow - 1, nTab, maDataDescription, &aParam); + SCCOL nCol = mnDataStartCol; + SCCOL nRow = mnDataStartRow - 1; + mpDocument->SetString(nCol, nRow, nTab, maDataDescription, &aParam); + maFormatOutput.insertEmptyDataColumn(nCol, nRow); } outputDataResults(nTab); diff --git a/sc/source/filter/oox/PivotTableFormat.cxx b/sc/source/filter/oox/PivotTableFormat.cxx index 436b76af1bdf..9b16087400d2 100644 --- a/sc/source/filter/oox/PivotTableFormat.cxx +++ b/sc/source/filter/oox/PivotTableFormat.cxx @@ -88,17 +88,24 @@ void PivotTableFormat::finalizeImport() aFormats = pSaveData->getFormats(); // Resolve references - TODO - for (auto const& pReference : maReferences) + + sc::PivotTableFormat aFormat; + if (mbDataOnly) + aFormat.eType = sc::FormatType::Data; + else if (mbLabelOnly) + aFormat.eType = sc::FormatType::Label; + + aFormat.pPattern = pPattern; + for (auto& rReference : maReferences) { - if (pReference->mnField && pReference->mbSelected) + if (rReference->mnField) { - auto nField = *pReference->mnField; - for (auto index : pReference->maFieldItemsIndices) - { - aFormats.add(nField, index, pPattern); - } + aFormat.aSelections.push_back( + sc::Selection{ .nField = sal_Int32(*rReference->mnField), + .nDataIndex = rReference->maFieldItemsIndices[0] }); } } + aFormats.add(aFormat); pSaveData->setFormats(aFormats); }