sc/source/core/tool/interpr2.cxx     |   14 +++++++
 sc/source/filter/excel/xecontent.cxx |   63 ++++++++++++++++++++---------------
 2 files changed, 49 insertions(+), 28 deletions(-)

New commits:
commit f8bbe783e112805bfa51e7f8bd3c0e3e54840280
Author:     Karthik Godha <[email protected]>
AuthorDate: Fri Jan 23 18:25:22 2026 +0530
Commit:     Karthik Godha <[email protected]>
CommitDate: Thu Feb 26 17:22:57 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]>
    (cherry picked from commit 97c290624f6e0d992ea5a075f316405dcfca8d38)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/199427
    Tested-by: Jenkins
    Reviewed-by: Karthik Godha <[email protected]>
    Signed-off-by: Xisco Fauli <[email protected]>
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/199664

diff --git a/sc/source/filter/excel/xecontent.cxx 
b/sc/source/filter/excel/xecontent.cxx
index 9de0d67f76f5..beb1b95c871d 100644
--- a/sc/source/filter/excel/xecontent.cxx
+++ b/sc/source/filter/excel/xecontent.cxx
@@ -1832,34 +1832,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
     {
@@ -1932,18 +1918,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 );
 }
 
commit 4685ff1b62a56737323288d8a240011ee4c7786f
Author:     Karthik Godha <[email protected]>
AuthorDate: Wed Jan 28 15:09:52 2026 +0530
Commit:     Karthik Godha <[email protected]>
CommitDate: Thu Feb 26 17:22:47 2026 +0100

    sc: Accept larger values in TRUNC function
    
    If the second argument in TRUNC function is greater than int16 then
    the function returns an error. Accept larger values for 2nd argument to
    make it interoperable with Excel.
    
    bug-document: forum-mso-de-11803
    
    Change-Id: I9de5c1a2ed71831d4b1c0cf16ea0902c4e1de628
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/198279
    Reviewed-by: Michael Stahl <[email protected]>
    Tested-by: Jenkins CollaboraOffice <[email protected]>
    (cherry picked from commit 24d79a75d4e9e419e0d66d22ddaff6353fd83f80)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/199429
    Tested-by: Jenkins
    Reviewed-by: Karthik Godha <[email protected]>
    Signed-off-by: Xisco Fauli <[email protected]>
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/199663

diff --git a/sc/source/core/tool/interpr2.cxx b/sc/source/core/tool/interpr2.cxx
index d12b5c4dbb54..ddef32baa82e 100644
--- a/sc/source/core/tool/interpr2.cxx
+++ b/sc/source/core/tool/interpr2.cxx
@@ -970,7 +970,19 @@ void ScInterpreter::RoundNumber( rtl_math_RoundingMode 
eMode )
         fVal = ::rtl::math::round( GetDouble(), 0, eMode );
     else
     {
-        const sal_Int16 nDec = GetInt16();
+        double fDec = GetDouble();
+        if (fDec > SAL_MAX_INT16)
+            fDec = SAL_MAX_INT16;
+        else if (fDec < SAL_MIN_INT16)
+            fDec = SAL_MIN_INT16;
+        else
+        {
+            if (fDec < 0.0)
+                fDec = rtl::math::approxCeil(fDec);
+            else
+                fDec = rtl::math::approxFloor(fDec);
+        }
+        const sal_Int16 nDec = static_cast<sal_Int16>(fDec);
         const double fX = GetDouble();
         if (nGlobalError == FormulaError::NONE)
         {

Reply via email to