sc/inc/dbdata.hxx                           |   10 +++++++++-
 sc/source/core/tool/dbdata.cxx              |   17 ++++++++++++++---
 sc/source/filter/excel/xedbdata.cxx         |    5 +++--
 sc/source/filter/inc/tablecolumnsbuffer.hxx |    4 ++++
 sc/source/filter/oox/tablecolumnsbuffer.cxx |   11 ++++++++++-
 5 files changed, 40 insertions(+), 7 deletions(-)

New commits:
commit 933e045422957e15cad47ef925d4f9a852c826b1
Author:     offtkp <[email protected]>
AuthorDate: Thu Nov 17 16:41:42 2022 +0200
Commit:     Tomaž Vajngerl <[email protected]>
CommitDate: Wed Nov 30 14:24:10 2022 +0100

    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 <[email protected]>

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;

Reply via email to