sc/source/filter/excel/xecontent.cxx |   63 ++++++++++++++++++++---------------
 1 file changed, 36 insertions(+), 27 deletions(-)

New commits:
commit 97c290624f6e0d992ea5a075f316405dcfca8d38
Author:     Karthik Godha <[email protected]>
AuthorDate: Fri Jan 23 18:25:22 2026 +0530
Commit:     Michael Stahl <[email protected]>
CommitDate: Tue Jan 27 15:04:33 2026 +0100

    tdf#170452: Export external refs of Data Validation
    
    External references used in data validation are not exported. To export
    External references they should be registered with XclExpLinkManager.
    
    Add explicit function call to XclExpFormulaCompiler::CreateFormula,
    this will eventually call XclExpLinkManager::FindExtSheet, which is used
    to register external refs.
    
    bug-document: forum-mso-de-39647.xls
    
    Change-Id: I0f010f0b5e990ba098361996598d7363647b05ba
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197954
    Reviewed-by: Michael Stahl <[email protected]>
    Tested-by: Jenkins CollaboraOffice <[email protected]>

diff --git a/sc/source/filter/excel/xecontent.cxx 
b/sc/source/filter/excel/xecontent.cxx
index 4c903738a441..f4d7087cba49 100644
--- a/sc/source/filter/excel/xecontent.cxx
+++ b/sc/source/filter/excel/xecontent.cxx
@@ -1829,34 +1829,20 @@ XclExpDV::XclExpDV( const XclExpRoot& rRoot, sal_uInt32 
nScHandle ) :
                         2) List is taken from A1    -> formula is =A1 -> 
writes tRefNR token
                         Formula compiler supports this by offering two 
different functions
                         CreateDataValFormula() and CreateListValFormula(). */
-                    if(GetOutput() == EXC_OUTPUT_BINARY)
-                        mxTokArr1 = rFmlaComp.CreateFormula( 
EXC_FMLATYPE_LISTVAL, *xScTokArr );
-                    else
-                        msFormula1 = XclXmlUtils::ToOUString( 
GetCompileFormulaContext(), pValData->GetSrcPos(),
-                            xScTokArr.get());
+                    mxTokArr1 = rFmlaComp.CreateFormula(EXC_FMLATYPE_LISTVAL, 
*xScTokArr);
                 }
             }
             else
             {
                 // no list validation -> convert the formula
-                if(GetOutput() == EXC_OUTPUT_BINARY)
-                    mxTokArr1 = rFmlaComp.CreateFormula( EXC_FMLATYPE_DATAVAL, 
*xScTokArr );
-                else
-                    msFormula1 = XclXmlUtils::ToOUString( 
GetCompileFormulaContext(), pValData->GetSrcPos(),
-                            xScTokArr.get());
+                mxTokArr1 = rFmlaComp.CreateFormula(EXC_FMLATYPE_DATAVAL, 
*xScTokArr);
             }
         }
 
         // second formula
         xScTokArr = pValData->CreateFlatCopiedTokenArray( 1 );
         if (xScTokArr)
-        {
-            if(GetOutput() == EXC_OUTPUT_BINARY)
-                mxTokArr2 = rFmlaComp.CreateFormula( EXC_FMLATYPE_DATAVAL, 
*xScTokArr );
-            else
-                msFormula2 = XclXmlUtils::ToOUString( 
GetCompileFormulaContext(), pValData->GetSrcPos(),
-                        xScTokArr.get());
-        }
+            mxTokArr2 = rFmlaComp.CreateFormula(EXC_FMLATYPE_DATAVAL, 
*xScTokArr);
     }
     else
     {
@@ -1929,18 +1915,41 @@ void XclExpDV::SaveXml( XclExpXmlStream& rStrm )
         rWorksheet->endElement(FSNS(XML_mc, XML_Fallback));
         rWorksheet->endElement(FSNS(XML_mc, XML_AlternateContent));
     }
-    if (msList.isEmpty() && !msFormula1.isEmpty())
-    {
-        rWorksheet->startElement(XML_formula1);
-        rWorksheet->writeEscaped( msFormula1 );
-        rWorksheet->endElement( XML_formula1 );
-    }
-    if( !msFormula2.isEmpty() )
+
+    if (const ScValidationData* pValData = 
GetDoc().GetValidationEntry(mnScHandle))
     {
-        rWorksheet->startElement(XML_formula2);
-        rWorksheet->writeEscaped( msFormula2 );
-        rWorksheet->endElement( XML_formula2 );
+        if (msList.isEmpty())
+        {
+            if (msFormula1.isEmpty())
+            {
+                if (const std::unique_ptr<ScTokenArray> xScTokArr
+                    = pValData->CreateFlatCopiedTokenArray(0))
+                {
+                    msFormula1 = 
XclXmlUtils::ToOUString(GetCompileFormulaContext(),
+                                                         
pValData->GetSrcPos(), xScTokArr.get());
+                }
+            }
+
+            if (!msFormula1.isEmpty())
+            {
+                rWorksheet->startElement(XML_formula1);
+                rWorksheet->writeEscaped(msFormula1);
+                rWorksheet->endElement(XML_formula1);
+            }
+        }
+        if (const std::unique_ptr<ScTokenArray> xScTokArr = 
pValData->CreateFlatCopiedTokenArray(1))
+        {
+            msFormula2 = XclXmlUtils::ToOUString(GetCompileFormulaContext(), 
pValData->GetSrcPos(),
+                                                 xScTokArr.get());
+            if (!msFormula2.isEmpty())
+            {
+                rWorksheet->startElement(XML_formula2);
+                rWorksheet->writeEscaped(msFormula2);
+                rWorksheet->endElement(XML_formula2);
+            }
+        }
     }
+
     rWorksheet->endElement( XML_dataValidation );
 }
 

Reply via email to