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);

Reply via email to