sc/inc/pivot/PivotTableFormats.hxx
| 2
sc/qa/unit/PivotTableFormatsImportExport.cxx
| 15 +
sc/qa/unit/data/xlsx/pivot-table/PivotTableCellFormatsTest_9_MultipleSelections.xlsx
|binary
sc/source/core/data/PivotTableFormatOutput.cxx
| 82 +++++-----
sc/source/filter/excel/xepivotxml.cxx
| 6
sc/source/filter/oox/PivotTableFormat.cxx
| 2
6 files changed, 69 insertions(+), 38 deletions(-)
New commits:
commit ded4d570fde21e55091c9c8c364114e67aa0cdcf
Author: Tomaž Vajngerl <[email protected]>
AuthorDate: Tue Apr 16 00:39:20 2024 +0900
Commit: Tomaž Vajngerl <[email protected]>
CommitDate: Tue Apr 16 08:31:38 2024 +0200
pivot: suppprt multiple cell format reference indices
This adds support for multiple cell format reference indices, so
the same cell format is applied to multiple cells (defined by
indices) so that each doesn't need to be defined by its own
reference (as they are all the same anyway and only differ by
single index).
The solution is to create multiple format outputs for one format
entry - each for a selection index, but have other data still the
same. This is a bit tricky as previously it was one format output
for one format entry, which is not the case anymore.
Change-Id: I074ac03e7d81e26562a6a6cc395b11cfed16766d
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/166131
Tested-by: Jenkins
Reviewed-by: Tomaž Vajngerl <[email protected]>
diff --git a/sc/inc/pivot/PivotTableFormats.hxx
b/sc/inc/pivot/PivotTableFormats.hxx
index 8c8ebcadffbd..d569c6167e1f 100644
--- a/sc/inc/pivot/PivotTableFormats.hxx
+++ b/sc/inc/pivot/PivotTableFormats.hxx
@@ -29,7 +29,7 @@ struct Selection
{
bool bSelected = false;
sal_Int32 nField = 0;
- sal_uInt32 nDataIndex = 0;
+ std::vector<sal_uInt32> nIndices;
};
/** Holds cell pattern attributes and a selection information to which cells
in the pivot table
diff --git a/sc/qa/unit/PivotTableFormatsImportExport.cxx
b/sc/qa/unit/PivotTableFormatsImportExport.cxx
index 1c20cdc3b5ac..40db2afb2292 100644
--- a/sc/qa/unit/PivotTableFormatsImportExport.cxx
+++ b/sc/qa/unit/PivotTableFormatsImportExport.cxx
@@ -295,6 +295,21 @@ CPPUNIT_TEST_FIXTURE(ScPivotTableFormatsImportExport,
assertDocument(*getScDoc());
}
+CPPUNIT_TEST_FIXTURE(ScPivotTableFormatsImportExport,
+ PivotTableCellFormatsTest_9_MultipleSelections)
+{
+ auto assertDocument = [](ScDocument& rDoc) {
+ CPPUNIT_ASSERT_EQUAL(COL_YELLOW, getBackgroundColor(rDoc, u"I6"_ustr));
+ CPPUNIT_ASSERT_EQUAL(COL_YELLOW, getBackgroundColor(rDoc, u"I7"_ustr));
+ CPPUNIT_ASSERT_EQUAL(COL_YELLOW, getBackgroundColor(rDoc, u"I8"_ustr));
+ };
+
+
createScDoc("xlsx/pivot-table/PivotTableCellFormatsTest_9_MultipleSelections.xlsx");
+ assertDocument(*getScDoc());
+ saveAndReload("Calc Office Open XML");
+ assertDocument(*getScDoc());
+}
+
CPPUNIT_PLUGIN_IMPLEMENT();
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git
a/sc/qa/unit/data/xlsx/pivot-table/PivotTableCellFormatsTest_9_MultipleSelections.xlsx
b/sc/qa/unit/data/xlsx/pivot-table/PivotTableCellFormatsTest_9_MultipleSelections.xlsx
new file mode 100644
index 000000000000..6d317d2e45c0
Binary files /dev/null and
b/sc/qa/unit/data/xlsx/pivot-table/PivotTableCellFormatsTest_9_MultipleSelections.xlsx
differ
diff --git a/sc/source/core/data/PivotTableFormatOutput.cxx
b/sc/source/core/data/PivotTableFormatOutput.cxx
index 9f6dcf2355b7..fbef219b513b 100644
--- a/sc/source/core/data/PivotTableFormatOutput.cxx
+++ b/sc/source/core/data/PivotTableFormatOutput.cxx
@@ -84,7 +84,7 @@ void initLines(std::vector<LineData>& rLines,
std::vector<ScDPOutLevelData> cons
}
}
-void initFormatOutputField(std::vector<FormatOutputField>& rOutputFields,
+void initFormatOutputField(size_t nSelectionIndex,
std::vector<FormatOutputField>& rOutputFields,
std::vector<ScDPOutLevelData> const& rFields,
PivotTableFormat const& rFormat, NameResolver&
rNameResolver)
{
@@ -99,19 +99,18 @@ void initFormatOutputField(std::vector<FormatOutputField>&
rOutputFields,
{
if (rSelection.nField == rOutputField.nDimension)
{
+ if (rSelection.nIndices.size() > 1)
+ rOutputField.nIndex = rSelection.nIndices[nSelectionIndex];
+ else
+ rOutputField.nIndex = rSelection.nIndices[0];
+
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;
- }
+ = rNameResolver.getNameForIndex(rOutputField.nIndex,
rSelection.nField);
+
+ rOutputField.bSet = true;
}
}
}
@@ -152,41 +151,56 @@ void FormatOutput::prepare(SCTAB nTab,
std::vector<ScDPOutLevelData> const& rCol
// Initialize format output entries (FormatOutputEntry) and set the data
already available from output fields
// (rColumnFields and rRowFields) and the pivot table format list
(PivotTableFormat).
- maFormatOutputEntries.resize(mpFormats->size());
-
- 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;
+ size_t nMaxNumberOfIndices = 1;
+ for (auto const& rSelection : rFormat.aSelections)
+ {
+ if (rSelection.nIndices.size() > 1)
+ nMaxNumberOfIndices = rSelection.nIndices.size();
+ }
- initFormatOutputField(rEntry.aRowOutputFields, rRowFields, rFormat,
aNameResolver);
+ if (nMaxNumberOfIndices == 0)
+ continue;
- // If column fields list is empty, but there is a data field in
columns that is not part of column fields
- if (rColumnFields.size() == 0 && bColumnFieldIsDataOnly)
+ for (size_t nSelectionIndex = 0; nSelectionIndex <
nMaxNumberOfIndices; nSelectionIndex++)
{
- // Initialize column output fields to have 1 data output field
- rEntry.aColumnOutputFields.resize(1);
- FormatOutputField& rOutputField = rEntry.aColumnOutputFields[0];
+ sc::FormatOutputEntry aEntry;
+ aEntry.pPattern = rFormat.pPattern;
+ aEntry.onTab = nTab;
+ aEntry.eType = rFormat.eType;
- for (auto const& rSelection : rFormat.aSelections)
+ initFormatOutputField(nSelectionIndex, aEntry.aRowOutputFields,
rRowFields, rFormat,
+ aNameResolver);
+
+ // If column fields list is empty, but there is a data field in
columns that is not part of column fields
+ if (rColumnFields.size() == 0 && bColumnFieldIsDataOnly)
{
- if (rSelection.nField == -2)
+ // Initialize column output fields to have 1 data output field
+ aEntry.aColumnOutputFields.resize(1);
+ FormatOutputField& rOutputField =
aEntry.aColumnOutputFields[0];
+
+ for (auto const& rSelection : rFormat.aSelections)
{
- rOutputField.aName = "DATA";
- rOutputField.nIndex = rSelection.nDataIndex;
- rOutputField.bSet = true;
+ if (rSelection.nField == -2)
+ {
+ if (rSelection.nIndices.size() > 1)
+ rOutputField.nIndex =
rSelection.nIndices[nSelectionIndex];
+ else
+ rOutputField.nIndex = rSelection.nIndices[0];
+ rOutputField.aName = "DATA";
+ rOutputField.bSet = true;
+ }
}
}
+ else
+ {
+ initFormatOutputField(nSelectionIndex,
aEntry.aColumnOutputFields, rColumnFields,
+ rFormat, aNameResolver);
+ }
+
+ maFormatOutputEntries.push_back(aEntry);
}
- else
- {
- initFormatOutputField(rEntry.aColumnOutputFields, rColumnFields,
rFormat,
- aNameResolver);
- }
- nFormatIndex++;
}
}
diff --git a/sc/source/filter/excel/xepivotxml.cxx
b/sc/source/filter/excel/xepivotxml.cxx
index 81f1c71f30a6..3cb4bcf35b26 100644
--- a/sc/source/filter/excel/xepivotxml.cxx
+++ b/sc/source/filter/excel/xepivotxml.cxx
@@ -1253,8 +1253,10 @@ void
XclExpXmlPivotTables::savePivotTableFormats(XclExpXmlStream& rStream, ScDPO
pPivotStream->startElement(XML_reference,
pRefAttributeList);
}
- pPivotStream->singleElement(XML_x, XML_v,
OString::number(rSelection.nDataIndex));
-
+ for (sal_uInt32 nIndex : rSelection.nIndices)
+ {
+ pPivotStream->singleElement(XML_x, XML_v,
OString::number(nIndex));
+ }
pPivotStream->endElement(XML_reference);
}
pPivotStream->endElement(XML_references);
diff --git a/sc/source/filter/oox/PivotTableFormat.cxx
b/sc/source/filter/oox/PivotTableFormat.cxx
index 870a6c99fad9..59626f89a527 100644
--- a/sc/source/filter/oox/PivotTableFormat.cxx
+++ b/sc/source/filter/oox/PivotTableFormat.cxx
@@ -110,7 +110,7 @@ void PivotTableFormat::finalizeImport()
aFormat.aSelections.push_back(
sc::Selection{ .bSelected = rReference->mbSelected,
.nField = sal_Int32(*rReference->mnField),
- .nDataIndex =
rReference->maFieldItemsIndices[0] });
+ .nIndices = rReference->maFieldItemsIndices });
}
}
aFormats.add(aFormat);