From 66081b8f7100a0df183bf3b9572adcb2e7cec2c0 Mon Sep 17 00:00:00 2001 From: Karthik Godha Date: Tue, 31 Mar 2026 17:55:58 +0530 Subject: [PATCH] XLSX: Importing tables with power query connections If a table type is "queryTable", Excel might remove table data from the sheet based on `removeDataOnSave` attribute. In those cases, when we export the table to XLSX, we write empty column headers, which Excel doesn't accept. bug-doc: forum-es-7685.xlsx Change-Id: Ia05dda91c0806271e1846e1512328950a048ff28 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/203050 Reviewed-by: Michael Stahl Tested-by: Jenkins CollaboraOffice (cherry picked from commit fa2cbdb84ad571379c183f76e66c12920e787f4d) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/204433 Tested-by: Jenkins Reviewed-by: Xisco Fauli --- sc/qa/unit/data/xlsx/TableEmptyHeaders.xlsx | Bin 0 -> 21937 bytes sc/qa/unit/subsequent_export_test5.cxx | 12 +++++++++ sc/source/filter/inc/tablecolumnsbuffer.hxx | 4 +-- sc/source/filter/oox/tablebuffer.cxx | 3 ++- sc/source/filter/oox/tablecolumnsbuffer.cxx | 28 +++++++++++++++++--- 5 files changed, 41 insertions(+), 6 deletions(-) create mode 100644 sc/qa/unit/data/xlsx/TableEmptyHeaders.xlsx diff --git a/sc/qa/unit/data/xlsx/TableEmptyHeaders.xlsx b/sc/qa/unit/data/xlsx/TableEmptyHeaders.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..a21b0de4972cbc2303e7fe2e1b92c5151717686f GIT binary patch literal 21937 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 a!GjfAh_C_+2hbKtA%^|Hja_#FKs*2u#K;f; literal 0 HcmV?d00001 diff --git a/sc/qa/unit/subsequent_export_test5.cxx b/sc/qa/unit/subsequent_export_test5.cxx index 6250257f4b08..e3c8ede74b1c 100644 --- a/sc/qa/unit/subsequent_export_test5.cxx +++ b/sc/qa/unit/subsequent_export_test5.cxx @@ -87,6 +87,18 @@ CPPUNIT_TEST_FIXTURE(ScExportTest5, testInvalidNamedRange) CPPUNIT_ASSERT(!xNamedRanges->hasByName(u"myname"_ustr)); } +CPPUNIT_TEST_FIXTURE(ScExportTest5, testQueryTableHeaders) +{ + createScDoc("xlsx/TableEmptyHeaders.xlsx"); + save(TestFilter::XLSX); + + xmlDocUniquePtr pTable = parseExport(u"xl/tables/table1.xml"_ustr); + CPPUNIT_ASSERT(pTable); + + assertXPath(pTable, "/x:table/x:tableColumns/x:tableColumn[1]", "name", u"Column1"); + assertXPath(pTable, "/x:table/x:tableColumns/x:tableColumn[2]", "name", u"Column2"); +} + CPPUNIT_TEST_FIXTURE(ScExportTest5, testExternalDefinedNameXLSX) { createScDoc("xlsx/tdf144397.xlsx"); diff --git a/sc/source/filter/inc/tablecolumnsbuffer.hxx b/sc/source/filter/inc/tablecolumnsbuffer.hxx index 8abc3915afb6..4c8cbd2b86ce 100644 --- a/sc/source/filter/inc/tablecolumnsbuffer.hxx +++ b/sc/source/filter/inc/tablecolumnsbuffer.hxx @@ -81,7 +81,7 @@ public: TableColumn& createTableColumn(); /** Applies the columns to the passed database range. */ - bool finalizeImport( ScDBData* pDBData ); + bool finalizeImport( ScDBData* pDBData, bool bQueryTable ); private: typedef RefVector< TableColumn > TableColumnVector; @@ -99,7 +99,7 @@ public: TableColumns& createTableColumns(); /** Applies the table columns to the passed database range. */ - void finalizeImport( ScDBData* pDBData ); + void finalizeImport( ScDBData* pDBData, bool bQueryTable ); private: /** Returns the table columns object used. */ diff --git a/sc/source/filter/oox/tablebuffer.cxx b/sc/source/filter/oox/tablebuffer.cxx index cdbdf1da7fa1..c1c55a89c020 100644 --- a/sc/source/filter/oox/tablebuffer.cxx +++ b/sc/source/filter/oox/tablebuffer.cxx @@ -200,7 +200,8 @@ void Table::applyAutoFilters() void Table::applyTableColumns() { - maTableColumns.finalizeImport( findDatabaseRangeByIndex( mnTokenIndex )); + maTableColumns.finalizeImport(findDatabaseRangeByIndex(mnTokenIndex), + maModel.mnType == XML_queryTable); } TableBuffer::TableBuffer( const WorkbookHelper& rHelper ) : diff --git a/sc/source/filter/oox/tablecolumnsbuffer.cxx b/sc/source/filter/oox/tablecolumnsbuffer.cxx index c93f49e2b171..5759f8db16c9 100644 --- a/sc/source/filter/oox/tablecolumnsbuffer.cxx +++ b/sc/source/filter/oox/tablecolumnsbuffer.cxx @@ -24,6 +24,7 @@ #include #include #include +#include #include XmlColumnPrModel::XmlColumnPrModel() : @@ -136,7 +137,7 @@ TableColumn& TableColumns::createTableColumn() #pragma GCC diagnostic pop #endif -bool TableColumns::finalizeImport( ScDBData* pDBData ) +bool TableColumns::finalizeImport( ScDBData* pDBData, bool bQueryTable ) { SAL_WARN_IF( static_cast(mnCount) != maTableColumnVector.size(), "sc.filter", "TableColumns::finalizeImport - count attribute doesn't match number of tableColumn elements"); @@ -167,6 +168,27 @@ bool TableColumns::finalizeImport( ScDBData* pDBData ) } pDBData->SetTableColumnNames( std::move(aNames) ); + // If table type is "queryTable" and `removeDataOnSave` attribute is set to true, + // Excel removes table data from sheet including headers + // We don't support Power Query connections, fill table headers in the sheet with table data. + if (bQueryTable && pDBData->HasHeader()) + { + ScRange aRange; + pDBData->GetArea(aRange); + ScDocument& rDoc = getScDocument(); + const std::vector& rNames = pDBData->GetTableColumnNames(); + SCCOL nStartCol = aRange.aStart.Col(); + SCROW nRow = aRange.aStart.Row(); + SCTAB nTab = aRange.aStart.Tab(); + for (size_t j = 0; j < rNames.size(); ++j) + { + SCCOL nCol = nStartCol + static_cast(j); + OUString sHeader = rNames[j]; + if (!sHeader.isEmpty() && rDoc.GetString(nCol, nRow, nTab).isEmpty()) + rDoc.SetString(nCol, nRow, nTab, sHeader); + } + } + // Import subtotal parameters for columns if (hasAnySetValue) { @@ -194,11 +216,11 @@ TableColumns& TableColumnsBuffer::createTableColumns() return *xTableColumns; } -void TableColumnsBuffer::finalizeImport( ScDBData* pDBData ) +void TableColumnsBuffer::finalizeImport( ScDBData* pDBData, bool bQueryTable ) { TableColumns* pTableColumns = getActiveTableColumns(); if ( pTableColumns ) - pTableColumns->finalizeImport( pDBData ); + pTableColumns->finalizeImport( pDBData, bQueryTable ); } TableColumns* TableColumnsBuffer::getActiveTableColumns()