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