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