summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sc/inc/dbdata.hxx10
-rw-r--r--sc/source/core/tool/dbdata.cxx17
-rw-r--r--sc/source/filter/excel/xedbdata.cxx5
-rw-r--r--sc/source/filter/inc/tablecolumnsbuffer.hxx4
-rw-r--r--sc/source/filter/oox/tablecolumnsbuffer.cxx11
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;