sc/source/filter/excel/excform.cxx  |   15 ++++++++++-----
 sc/source/filter/excel/excform8.cxx |   13 +++++++++----
 sc/source/filter/inc/xiname.hxx     |    1 +
 3 files changed, 20 insertions(+), 9 deletions(-)

New commits:
commit 7df970c003652669626f6d548059e4fca4a09b0c
Author:     Karthik Godha <[email protected]>
AuthorDate: Sun Jan 18 21:57:42 2026 +0530
Commit:     Balazs Varga <[email protected]>
CommitDate: Thu Jan 22 18:17:21 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]>

diff --git a/sc/source/filter/excel/excform.cxx 
b/sc/source/filter/excel/excform.cxx
index e9e59b5fe6da..fb280752ec85 100644
--- a/sc/source/filter/excel/excform.cxx
+++ b/sc/source/filter/excel/excform.cxx
@@ -526,10 +526,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:
@@ -1547,10 +1552,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 48f4d0c3ad97..68eaf5710a23 100644
--- a/sc/source/filter/excel/excform8.cxx
+++ b/sc/source/filter/excel/excform8.cxx
@@ -480,11 +480,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;
             }
@@ -666,8 +669,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