diff options
author | offtkp <parisoplop@gmail.com> | 2022-11-17 16:41:42 +0200 |
---|---|---|
committer | Tomaž Vajngerl <quikee@gmail.com> | 2022-11-30 14:24:10 +0100 |
commit | 933e045422957e15cad47ef925d4f9a852c826b1 (patch) | |
tree | 1102557670f6c4d578739d6c4b8ab1fc8a2a7ef6 | |
parent | e788317bb58f4e4ad3bf57ee7b0e995cb4407ede (diff) |
xlsx: Import table column attribute XML_totalsRowFunction
Import table column attribute totalsRowFunction and also export it,
which fixes a warning when roundtripped on a different office suite.
Change-Id: Icc76fc310aef3bd51bcefebece57f962a56b7cca
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/142843
Tested-by: Jenkins
Reviewed-by: Tomaž Vajngerl <quikee@gmail.com>
-rw-r--r-- | sc/inc/dbdata.hxx | 10 | ||||
-rw-r--r-- | sc/source/core/tool/dbdata.cxx | 17 | ||||
-rw-r--r-- | sc/source/filter/excel/xedbdata.cxx | 5 | ||||
-rw-r--r-- | sc/source/filter/inc/tablecolumnsbuffer.hxx | 4 | ||||
-rw-r--r-- | sc/source/filter/oox/tablecolumnsbuffer.cxx | 11 |
5 files changed, 40 insertions, 7 deletions
diff --git a/sc/inc/dbdata.hxx b/sc/inc/dbdata.hxx index 0e8d53830e53..482c55bc6aa4 100644 --- a/sc/inc/dbdata.hxx +++ b/sc/inc/dbdata.hxx @@ -43,6 +43,11 @@ enum class ScDBDataPortion AREA ///< entire area }; +struct TableColumnAttributes +{ + std::optional<OUString> maTotalsFunction = std::nullopt; +}; + /** Container base class to provide selected access for ScDBData. */ class ScDBDataContainerBase { @@ -93,6 +98,7 @@ private: bool bModified; ///< is set/cleared for/by(?) UpdateReference ::std::vector< OUString > maTableColumnNames; ///< names of table columns + ::std::vector< TableColumnAttributes > maTableColumnAttributes; ///< attributes of table columns bool mbTableColumnNamesDirty; SCSIZE nFilteredRowCount; @@ -147,6 +153,8 @@ public: void EndTableColumnNamesListener(); SC_DLLPUBLIC void SetTableColumnNames( ::std::vector< OUString >&& rNames ); SC_DLLPUBLIC const ::std::vector< OUString >& GetTableColumnNames() const { return maTableColumnNames; } + SC_DLLPUBLIC void SetTableColumnAttributes( ::std::vector< TableColumnAttributes >&& rAttributes ); + SC_DLLPUBLIC const ::std::vector< TableColumnAttributes >& GetTableColumnAttributes() const { return maTableColumnAttributes; } bool AreTableColumnNamesDirty() const { return mbTableColumnNamesDirty; } /** Refresh/update the column names with the header row's cell contents. */ @@ -218,7 +226,7 @@ public: private: - void AdjustTableColumnNames( UpdateRefMode eUpdateRefMode, SCCOL nDx, SCCOL nCol1, + void AdjustTableColumnAttributes( UpdateRefMode eUpdateRefMode, SCCOL nDx, SCCOL nCol1, SCCOL nOldCol1, SCCOL nOldCol2, SCCOL nNewCol1, SCCOL nNewCol2 ); void InvalidateTableColumnNames( bool bSwapToEmptyNames ); }; diff --git a/sc/source/core/tool/dbdata.cxx b/sc/source/core/tool/dbdata.cxx index cf518d0e2890..dc10d6a0503e 100644 --- a/sc/source/core/tool/dbdata.cxx +++ b/sc/source/core/tool/dbdata.cxx @@ -609,7 +609,7 @@ bool ScDBData::UpdateReference(const ScDocument* pDoc, UpdateRefMode eUpdateRefM if (bDoUpdate && eRet != UR_INVALID) { // MoveTo() invalidates column names via SetArea(); adjust, remember and set new. - AdjustTableColumnNames( eUpdateRefMode, nDx, nCol1, nOldCol1, nOldCol2, theCol1, theCol2); + AdjustTableColumnAttributes( eUpdateRefMode, nDx, nCol1, nOldCol1, nOldCol2, theCol1, theCol2); ::std::vector<OUString> aNames( maTableColumnNames); bool bTableColumnNamesDirty = mbTableColumnNamesDirty; // tdf#48025, tdf#141946: update the column index of the filter criteria, @@ -686,7 +686,12 @@ void ScDBData::SetTableColumnNames( ::std::vector< OUString >&& rNames ) mbTableColumnNamesDirty = false; } -void ScDBData::AdjustTableColumnNames( UpdateRefMode eUpdateRefMode, SCCOL nDx, SCCOL nCol1, +void ScDBData::SetTableColumnAttributes( ::std::vector< TableColumnAttributes >&& rAttributes ) +{ + maTableColumnAttributes = std::move(rAttributes); +} + +void ScDBData::AdjustTableColumnAttributes( UpdateRefMode eUpdateRefMode, SCCOL nDx, SCCOL nCol1, SCCOL nOldCol1, SCCOL nOldCol2, SCCOL nNewCol1, SCCOL nNewCol2 ) { if (maTableColumnNames.empty()) @@ -698,6 +703,7 @@ void ScDBData::AdjustTableColumnNames( UpdateRefMode eUpdateRefMode, SCCOL nDx, return; // not moved or entirely moved, nothing to do ::std::vector<OUString> aNewNames; + ::std::vector<TableColumnAttributes> aNewAttributes; if (eUpdateRefMode == URM_INSDEL) { if (nDx > 0) @@ -714,22 +720,27 @@ void ScDBData::AdjustTableColumnNames( UpdateRefMode eUpdateRefMode, SCCOL nDx, if (nDx > 0) n += nDx; aNewNames.resize(n); + aNewAttributes.resize(n); + maTableColumnAttributes.resize(n); // Copy head. for (size_t i = 0; i < nHead; ++i) { aNewNames[i] = maTableColumnNames[i]; + aNewAttributes[i] = maTableColumnAttributes[i]; } // Copy tail, inserted middle range, if any, stays empty. for (size_t i = n - nTail, j = maTableColumnNames.size() - nTail; i < n; ++i, ++j) { aNewNames[i] = maTableColumnNames[j]; + aNewAttributes[i] = maTableColumnAttributes[j]; } } } // else empty aNewNames invalidates names/offsets SAL_WARN_IF( !maTableColumnNames.empty() && aNewNames.empty(), - "sc.core", "ScDBData::AdjustTableColumnNames - invalidating column names/offsets"); + "sc.core", "ScDBData::AdjustTableColumnAttributes - invalidating column attributes/offsets"); aNewNames.swap( maTableColumnNames); + aNewAttributes.swap(maTableColumnAttributes); if (maTableColumnNames.empty()) mbTableColumnNamesDirty = true; if (mbTableColumnNamesDirty) diff --git a/sc/source/filter/excel/xedbdata.cxx b/sc/source/filter/excel/xedbdata.cxx index 350f6f70e0d1..5bea87e72b96 100644 --- a/sc/source/filter/excel/xedbdata.cxx +++ b/sc/source/filter/excel/xedbdata.cxx @@ -221,6 +221,7 @@ void XclExpTables::SaveTableXml( XclExpXmlStream& rStrm, const Entry& rEntry ) } const std::vector< OUString >& rColNames = rData.GetTableColumnNames(); + const std::vector< TableColumnAttributes >& rColAttributes = rData.GetTableColumnAttributes(); if (!rColNames.empty()) { pTableStrm->startElement(XML_tableColumns, @@ -236,7 +237,8 @@ void XclExpTables::SaveTableXml( XclExpXmlStream& rStrm, const Entry& rEntry ) pTableStrm->singleElement( XML_tableColumn, XML_id, OString::number(i+1), - XML_name, rColNames[i].toUtf8() + XML_name, rColNames[i].toUtf8(), + XML_totalsRowFunction, (i < rColAttributes.size() ? rColAttributes[i].maTotalsFunction : std::nullopt) // OOXTODO: XML_dataCellStyle, ..., // OOXTODO: XML_dataDxfId, ..., // OOXTODO: XML_headerRowCellStyle, ..., @@ -244,7 +246,6 @@ void XclExpTables::SaveTableXml( XclExpXmlStream& rStrm, const Entry& rEntry ) // OOXTODO: XML_queryTableFieldId, ..., // OOXTODO: XML_totalsRowCellStyle, ..., // OOXTODO: XML_totalsRowDxfId, ..., - // OOXTODO: XML_totalsRowFunction, ..., // OOXTODO: XML_totalsRowLabel, ..., // OOXTODO: XML_uniqueName, ... ); diff --git a/sc/source/filter/inc/tablecolumnsbuffer.hxx b/sc/source/filter/inc/tablecolumnsbuffer.hxx index e1e340cbeb03..f54c2eb5533e 100644 --- a/sc/source/filter/inc/tablecolumnsbuffer.hxx +++ b/sc/source/filter/inc/tablecolumnsbuffer.hxx @@ -20,6 +20,7 @@ #pragma once #include <oox/helper/refvector.hxx> +#include <dbdata.hxx> #include "workbookhelper.hxx" namespace oox { class AttributeList; } @@ -41,11 +42,14 @@ public: void importTableColumn( SequenceInputStream& rStrm ); /** Gets the name of this column. */ const OUString& getName() const; + /** Gets the attributes of this column. */ + const TableColumnAttributes& getColumnAttributes() const; private: OUString maName; sal_Int32 mnId; sal_Int32 mnDataDxfId; + TableColumnAttributes maColumnAttributes; }; class TableColumns : public WorkbookHelper diff --git a/sc/source/filter/oox/tablecolumnsbuffer.cxx b/sc/source/filter/oox/tablecolumnsbuffer.cxx index 4a4f2997c550..4baa7f1bde8a 100644 --- a/sc/source/filter/oox/tablecolumnsbuffer.cxx +++ b/sc/source/filter/oox/tablecolumnsbuffer.cxx @@ -22,7 +22,6 @@ #include <sal/log.hxx> #include <oox/helper/attributelist.hxx> #include <oox/token/tokens.hxx> -#include <dbdata.hxx> namespace oox::xls { @@ -38,6 +37,8 @@ void TableColumn::importTableColumn( const AttributeList& rAttribs ) mnId = rAttribs.getInteger( XML_id, -1 ); maName = rAttribs.getString( XML_name, OUString() ); mnDataDxfId = rAttribs.getInteger( XML_dataDxfId, -1 ); + if ( rAttribs.hasAttribute( XML_totalsRowFunction ) ) + maColumnAttributes.maTotalsFunction = rAttribs.getStringDefaulted( XML_totalsRowFunction ); } void TableColumn::importTableColumn( SequenceInputStream& /*rStrm*/ ) @@ -51,6 +52,11 @@ const OUString& TableColumn::getName() const return maName; } +const TableColumnAttributes& TableColumn::getColumnAttributes() const +{ + return maColumnAttributes; +} + TableColumns::TableColumns( const WorkbookHelper& rHelper ) : WorkbookHelper( rHelper ), mnCount(0) @@ -83,13 +89,16 @@ bool TableColumns::finalizeImport( ScDBData* pDBData ) { /* TODO: use svl::SharedString for names */ ::std::vector< OUString > aNames( maTableColumnVector.size()); + ::std::vector< TableColumnAttributes > aAttributesVector( maTableColumnVector.size() ); size_t i = 0; for (const auto& rxTableColumn : maTableColumnVector) { aNames[i] = rxTableColumn->getName(); + aAttributesVector[i] = rxTableColumn->getColumnAttributes(); ++i; } pDBData->SetTableColumnNames( std::move(aNames) ); + pDBData->SetTableColumnAttributes( std::move(aAttributesVector) ); return true; } return false; |