From e04a4d2d2c18134556bb4e001d497ca7d66c6828 Mon Sep 17 00:00:00 2001 From: Eike Rathke Date: Tue, 12 Aug 2014 17:26:29 +0200 Subject: really do not write empty externalReferences element, fdo#45286 follow-up Xti records exist also for internal sheet references in BIFF. It is not enough to check for their presence, at least one EXC_SBTYPE_EXTERN must be present as SUPBOOK. Change-Id: I5553a28412465d83fd965b09908261141c51ea35 --- sc/source/filter/excel/xelink.cxx | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) (limited to 'sc') diff --git a/sc/source/filter/excel/xelink.cxx b/sc/source/filter/excel/xelink.cxx index f4c4224cc776..ec074de98c15 100644 --- a/sc/source/filter/excel/xelink.cxx +++ b/sc/source/filter/excel/xelink.cxx @@ -433,6 +433,9 @@ public: /** Writes all externalBook elements with their child elements to OOXML. */ virtual void SaveXml( XclExpXmlStream& rStrm ) SAL_OVERRIDE; + /** Whether we need to write externalReferences or not. */ + bool HasExternalReferences() const; + struct XclExpSBIndex { sal_uInt16 mnSupbook; /// SUPBOOK index for an Excel sheet. @@ -2086,6 +2089,16 @@ void XclExpSupbookBuffer::SaveXml( XclExpXmlStream& rStrm ) } } +bool XclExpSupbookBuffer::HasExternalReferences() const +{ + for (size_t nPos = 0, nSize = maSupbookList.GetSize(); nPos < nSize; ++nPos) + { + if (maSupbookList.GetRecord( nPos)->GetType() == EXC_SBTYPE_EXTERN) + return true; + } + return false; +} + bool XclExpSupbookBuffer::GetSupbookUrl( XclExpSupbookRef& rxSupbook, sal_uInt16& rnIndex, const OUString& rUrl ) const { @@ -2452,7 +2465,7 @@ void XclExpLinkManagerImpl8::Save( XclExpStream& rStrm ) void XclExpLinkManagerImpl8::SaveXml( XclExpXmlStream& rStrm ) { - if( !maXtiVec.empty() ) + if (maSBBuffer.HasExternalReferences()) { sax_fastparser::FSHelperPtr pWorkbook = rStrm.GetCurrentStream(); pWorkbook->startElement( XML_externalReferences, FSEND); @@ -2461,13 +2474,16 @@ void XclExpLinkManagerImpl8::SaveXml( XclExpXmlStream& rStrm ) maSBBuffer.SaveXml( rStrm ); pWorkbook->endElement( XML_externalReferences); + } - // TODO: equivalent for EXTERNSHEET in OOXML? + // TODO: equivalent for EXTERNSHEET in OOXML? #if 0 + if( !maXtiVec.empty() ) + { for( XclExpXtiVec::const_iterator aIt = maXtiVec.begin(), aEnd = maXtiVec.end(); aIt != aEnd; ++aIt ) aIt->SaveXml( rStrm ); -#endif } +#endif } sal_uInt16 XclExpLinkManagerImpl8::InsertXti( const XclExpXti& rXti ) -- cgit