sc/source/filter/excel/xetable.cxx |   42 +++++++++++++------------------------
 1 file changed, 15 insertions(+), 27 deletions(-)

New commits:
commit 108f4aa94b98ca6deffdc169068c175605d5ba67
Author:     Karthik Godha <[email protected]>
AuthorDate: Wed Feb 11 16:30:35 2026 +0530
Commit:     Michael Stahl <[email protected]>
CommitDate: Wed Feb 11 16:59:10 2026 +0100

    XLSX: Completely discard formulas containing macros
    
    Change-Id: I8f2b034d83c14cf62f74ee3be1ed23663d5dfdad
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/199153
    Tested-by: Jenkins CollaboraOffice <[email protected]>
    Reviewed-by: Michael Stahl <[email protected]>

diff --git a/sc/source/filter/excel/xetable.cxx 
b/sc/source/filter/excel/xetable.cxx
index 5702f97be9f6..388939b73340 100644
--- a/sc/source/filter/excel/xetable.cxx
+++ b/sc/source/filter/excel/xetable.cxx
@@ -1016,7 +1016,8 @@ void XclExpFormulaCell::SaveXml( XclExpXmlStream& rStrm )
     if (bWriteFormula)
     {
         ScTokenArray aTokenArray(*mrScFmlaCell.GetCode());
-        // If XLSX export then remove macro tokens from the array
+        bool bValid = true;
+        // Discard formulas containing macros in XLSX export.
         if (!rStrm.IsExportVBA())
         {
             formula::FormulaTokenArrayPlainIterator aIter(aTokenArray);
@@ -1025,38 +1026,25 @@ void XclExpFormulaCell::SaveXml( XclExpXmlStream& rStrm 
)
             {
                 if (t->GetOpCode() == ocMacro)
                 {
-                    sal_uInt16 nStart = aIter.GetIndex() - 1;
-                    formula::FormulaToken* pNext = aIter.PeekNext();
-                    if (pNext && pNext->GetOpCode() == ocOpen)
-                    {
-                        sal_uInt16 nParenthesis = 0;
-                        do
-                        {
-                            if (pNext->GetOpCode() == ocOpen)
-                                nParenthesis++;
-                            else if (pNext->GetOpCode() == ocClose)
-                                nParenthesis--;
-
-                            aIter.Next();
-                            pNext = aIter.PeekNext();
-                        } while (nParenthesis > 0 && pNext);
-                    }
-                    aTokenArray.RemoveToken(nStart, aIter.GetIndex() - nStart);
-                    aIter.AfterRemoveToken(nStart, aIter.GetIndex() - nStart);
+                    bValid = false;
+                    break;
                 }
                 t = aIter.Next();
             }
         }
-        if (!bTagStarted)
+        if (bValid)
         {
-            rWorksheet->startElement( XML_f,
-                    XML_aca, ToPsz( (mxTokArr && mxTokArr->IsVolatile()) ||
-                        (mxAddRec && mxAddRec->IsVolatile()) ) );
+            if (!bTagStarted)
+            {
+                rWorksheet->startElement(XML_f, XML_aca,
+                                         ToPsz((mxTokArr && 
mxTokArr->IsVolatile())
+                                               || (mxAddRec && 
mxAddRec->IsVolatile())));
+            }
+            rWorksheet->writeEscaped(XclXmlUtils::ToOUString(
+                rStrm.GetRoot().GetCompileFormulaContext(), mrScFmlaCell.aPos, 
&aTokenArray,
+                mrScFmlaCell.GetErrCode()));
+            rWorksheet->endElement(XML_f);
         }
-        
rWorksheet->writeEscaped(XclXmlUtils::ToOUString(rStrm.GetRoot().GetCompileFormulaContext(),
-                                                         mrScFmlaCell.aPos, 
&aTokenArray,
-                                                         
mrScFmlaCell.GetErrCode()));
-        rWorksheet->endElement( XML_f );
     }
 
     if( strcmp( sType, "inlineStr" ) == 0 )

Reply via email to