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