sc/source/filter/excel/excform.cxx | 15 ++++++++++----- sc/source/filter/excel/excform8.cxx | 13 +++++++++---- sc/source/filter/inc/xcl97rec.hxx | 2 ++ sc/source/filter/inc/xiname.hxx | 1 + sc/source/filter/xcl97/xcl97rec.cxx | 19 ++++++++++++++++--- 5 files changed, 38 insertions(+), 12 deletions(-)
New commits: commit 0fcf8f75bb9a979197be7daa1430a288a85edbfe Author: Karthik Godha <[email protected]> AuthorDate: Sun Jan 18 14:23:03 2026 +0530 Commit: Karthik Godha <[email protected]> CommitDate: Thu Feb 26 17:21:05 2026 +0100 sc: XLSX - Skip writing empty scenarios In XLSX export, scenarios must contain at least one valid scenario element. bug-document: forum-fr-42975.xls Change-Id: I543a5637971d71de1d9d55f6e81a23d946495b6e Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197534 Tested-by: Jenkins CollaboraOffice <[email protected]> Reviewed-by: Michael Stahl <[email protected]> (cherry picked from commit 9fd010d8423f01c0a33b40746be6189e4d5034d9) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/199419 Reviewed-by: Karthik Godha <[email protected]> Tested-by: Jenkins Signed-off-by: Xisco Fauli <[email protected]> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/199656 diff --git a/sc/source/filter/inc/xcl97rec.hxx b/sc/source/filter/inc/xcl97rec.hxx index 57210208ddad..27a7b4261af5 100644 --- a/sc/source/filter/inc/xcl97rec.hxx +++ b/sc/source/filter/inc/xcl97rec.hxx @@ -399,6 +399,8 @@ public: virtual std::size_t GetLen() const override; virtual void SaveXml( XclExpXmlStream& rStrm ) override; + + const std::vector<ExcEScenarioCell>& GetCells() { return aCells; } }; class ExcEScenarioManager : public ExcRecord diff --git a/sc/source/filter/xcl97/xcl97rec.cxx b/sc/source/filter/xcl97/xcl97rec.cxx index e8518fc540ff..94a25cd60ad2 100644 --- a/sc/source/filter/xcl97/xcl97rec.cxx +++ b/sc/source/filter/xcl97/xcl97rec.cxx @@ -1656,7 +1656,17 @@ void ExcEScenarioManager::Save( XclExpStream& rStrm ) void ExcEScenarioManager::SaveXml( XclExpXmlStream& rStrm ) { - if( aScenes.empty() ) + bool bValidScenarios = false; + for (ExcEScenario& rScenario : aScenes) + { + if (rScenario.GetCells().size()) + { + bValidScenarios = true; + break; + } + } + + if (!bValidScenarios) return; sax_fastparser::FSHelperPtr& rWorkbook = rStrm.GetCurrentStream(); @@ -1666,8 +1676,11 @@ void ExcEScenarioManager::SaveXml( XclExpXmlStream& rStrm ) // OOXTODO: XML_sqref ); - for( ExcEScenario& rScenario : aScenes ) - rScenario.SaveXml( rStrm ); + for (ExcEScenario& rScenario : aScenes) + { + if (rScenario.GetCells().size()) + rScenario.SaveXml(rStrm); + } rWorkbook->endElement( XML_scenarios ); } commit 88ba1197d83543de7783f531ad705e1352374539 Author: Karthik Godha <[email protected]> AuthorDate: Sun Jan 18 21:57:42 2026 +0530 Commit: Karthik Godha <[email protected]> CommitDate: Thu Feb 26 17:20:50 2026 +0100 tdf#170432: Import unknown functions as externals Instead of importing unknown functions as macros, import them as external functions bug-document: forum-it-15544.xls Change-Id: I2b2cda38596b10f9bd5dcb4496aec9a5c0f40679 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197535 Tested-by: Jenkins CollaboraOffice <[email protected]> Reviewed-by: Balazs Varga <[email protected]> (cherry picked from commit 7df970c003652669626f6d548059e4fca4a09b0c) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/199423 Tested-by: Jenkins Reviewed-by: Karthik Godha <[email protected]> Signed-off-by: Xisco Fauli <[email protected]> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/199655 diff --git a/sc/source/filter/excel/excform.cxx b/sc/source/filter/excel/excform.cxx index 3a7d87c61cf3..2fcf8ec89460 100644 --- a/sc/source/filter/excel/excform.cxx +++ b/sc/source/filter/excel/excform.cxx @@ -524,10 +524,15 @@ ConvErr ExcelToSc::Convert( std::unique_ptr<ScTokenArray>& pResult, XclImpStream "-ExcelToSc::Convert(): A little oblivious?" ); } const XclImpName* pName = GetNameManager().GetName( nUINT16 ); - if(pName && !pName->GetScRangeData()) - aStack << aPool.Store( ocMacro, pName->GetXclName() ); - else - aStack << aPool.StoreName(nUINT16, -1); + if(pName) + { + if (pName->IsMacro()) + aStack << aPool.Store(ocMacro, pName->GetXclName()); + else if (pName->GetScRangeData()) + aStack << aPool.StoreName(nUINT16, -1); + else + aStack << aPool.Store(ocExternal, pName->GetXclName()); + } } break; case 0x44: @@ -1545,10 +1550,10 @@ void ExcelToSc::DoMulArgs( DefTokenId eId, sal_uInt8 nCnt ) aPool << pFuncInfo->meOpCode; else aPool << n; - nCnt--; } else aPool << eId; + nCnt--; } else aPool << eId; diff --git a/sc/source/filter/excel/excform8.cxx b/sc/source/filter/excel/excform8.cxx index 18b2bdd41850..f09bf8557e4b 100644 --- a/sc/source/filter/excel/excform8.cxx +++ b/sc/source/filter/excel/excform8.cxx @@ -478,11 +478,14 @@ ConvErr ExcelToSc8::Convert( std::unique_ptr<ScTokenArray>& rpTokArray, XclImpSt const XclImpName* pName = GetNameManager().GetName( nUINT16 ); if (pName) { - if (pName->IsMacro()) - // user-defined macro name. + if (pName->IsMacro()) // user-defined macro name. aStack << aPool.Store(ocMacro, pName->GetXclName()); + else if (pName->GetScRangeData() + || pName->HasTokens()) // check forward declaration + aStack << aPool.StoreName(nUINT16, + pName->IsGlobal() ? -1 : pName->GetScTab()); else - aStack << aPool.StoreName(nUINT16, pName->IsGlobal() ? -1 : pName->GetScTab()); + aStack << aPool.Store(ocExternal, pName->GetXclName()); } break; } @@ -664,8 +667,10 @@ ConvErr ExcelToSc8::Convert( std::unique_ptr<ScTokenArray>& rpTokArray, XclImpSt { if (pName->GetScRangeData()) aStack << aPool.StoreName( nNameIdx, pName->IsGlobal() ? -1 : pName->GetScTab()); - else + else if (pName->IsMacro()) aStack << aPool.Store(ocMacro, pName->GetXclName()); + else + aStack << aPool.Store(ocExternal, pName->GetXclName()); } } else if( const XclImpExtName* pExtName = rLinkMan.GetExternName( nXtiIndex, nNameIdx ) ) diff --git a/sc/source/filter/inc/xiname.hxx b/sc/source/filter/inc/xiname.hxx index 8d86909c0352..ee06d30d4c63 100644 --- a/sc/source/filter/inc/xiname.hxx +++ b/sc/source/filter/inc/xiname.hxx @@ -56,6 +56,7 @@ public: bool IsVBName() const { return mbVBName; } bool IsMacro() const { return mbMacro; } void ConvertTokens(); + bool HasTokens() const { return mpTokensData != nullptr; } private: void InsertName(const ScTokenArray* pArray);
