From f85d860ccbebd99bc128218148e2992c9415f221 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Attila=20Sz=C5=B1cs?= Date: Mon, 30 Nov 2020 15:18:09 +0100 Subject: [PATCH] tdf#87973 XLSX export: fix lost file names in modified links MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Calculate new indexes for external reference files to export it to xlsx. These indexes are calculated only temporary, only for exporting. Much better solution would be to change the indexes permanently, but the original indexes are stored so many places in the code (for example it is stored in cells formula tokens converted to string). So it would be a much bigger refactoring to be able to delete an external reference permanently... even just to reorder the indexes, require to modify a lot of code. Co-authored-by: Tibor Nagy (NISZ) Change-Id: If9254f6e62ec739e2b159a066ada7efdbceb3ad8 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/106895 Tested-by: László Németh Reviewed-by: László Németh --- sc/inc/externalrefmgr.hxx | 10 +++++ .../ods/tdf87973_externalLinkSkipUnuseds.ods | Bin 0 -> 13028 bytes .../unit/data/ods/tdf87973_externalSource.ods | Bin 0 -> 10762 bytes sc/qa/unit/subsequent_export-test.cxx | 42 ++++++++++++++++++ sc/source/core/tool/compiler.cxx | 3 +- sc/source/filter/excel/xelink.cxx | 19 ++++++-- sc/source/filter/excel/xestream.cxx | 3 ++ sc/source/ui/docshell/externalrefmgr.cxx | 25 +++++++++++ 8 files changed, 98 insertions(+), 4 deletions(-) create mode 100644 sc/qa/unit/data/ods/tdf87973_externalLinkSkipUnuseds.ods create mode 100644 sc/qa/unit/data/ods/tdf87973_externalSource.ods diff --git a/sc/inc/externalrefmgr.hxx b/sc/inc/externalrefmgr.hxx index fd07fa0e657a..2669781e9caa 100644 --- a/sc/inc/externalrefmgr.hxx +++ b/sc/inc/externalrefmgr.hxx @@ -597,6 +597,13 @@ public: */ const OUString* getExternalFileName(sal_uInt16 nFileId, bool bForceOriginal = false); + /** + * Reindex external file references to skip unused files, if skipping is enabled. + */ + sal_uInt16 convertFileIdToUsedFileId(sal_uInt16 nFileId); + void setSkipUnusedFileIds(std::vector& pExternFileIds); + void disableSkipUnusedFileIds(); + /** * Get all cached external file names as an array. Array indices of the * returned name array correspond with external file ID's. @@ -845,6 +852,9 @@ private: */ bool mbUserInteractionEnabled:1; + bool mbSkipUnusedFileIds = false; + std::vector maConvertFileIdToUsedFileId; + bool mbDocTimerEnabled:1; AutoTimer maSrcDocTimer; diff --git a/sc/qa/unit/data/ods/tdf87973_externalLinkSkipUnuseds.ods b/sc/qa/unit/data/ods/tdf87973_externalLinkSkipUnuseds.ods new file mode 100644 index 0000000000000000000000000000000000000000..cdaf9d4e7007287b5acf5310f64cb7d8d08ced9e GIT binary patch literal 13028 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 literal 0 HcmV?d00001 diff --git a/sc/qa/unit/data/ods/tdf87973_externalSource.ods b/sc/qa/unit/data/ods/tdf87973_externalSource.ods new file mode 100644 index 0000000000000000000000000000000000000000..59228e390e4dbfa5f9048c1ad4c81822d390d8c2 GIT binary patch literal 10762 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 literal 0 HcmV?d00001 diff --git a/sc/qa/unit/subsequent_export-test.cxx b/sc/qa/unit/subsequent_export-test.cxx index 54918a017797..e46d356d677b 100644 --- a/sc/qa/unit/subsequent_export-test.cxx +++ b/sc/qa/unit/subsequent_export-test.cxx @@ -267,6 +267,7 @@ public: void testTdf137000_handle_upright(); void testTdf126305_DataValidatyErrorAlert(); void testTdf76047_externalLink(); + void testTdf87973_externalLinkSkipUnuseds(); void testTdf129969(); void testTdf84874(); void testTdf136721_paper_size(); @@ -438,6 +439,7 @@ public: CPPUNIT_TEST(testTdf137000_handle_upright); CPPUNIT_TEST(testTdf126305_DataValidatyErrorAlert); CPPUNIT_TEST(testTdf76047_externalLink); + CPPUNIT_TEST(testTdf87973_externalLinkSkipUnuseds); CPPUNIT_TEST(testTdf129969); CPPUNIT_TEST(testTdf84874); CPPUNIT_TEST(testTdf136721_paper_size); @@ -5536,6 +5538,46 @@ void ScExportTest::testTdf76047_externalLink() } } +void ScExportTest::testTdf87973_externalLinkSkipUnuseds() +{ + ScDocShellRef pShell = loadDoc("tdf87973_externalLinkSkipUnuseds.", FORMAT_ODS); + CPPUNIT_ASSERT(pShell.is()); + + // try to load data from external link: tdf132105_external.ods + // that file has to be in the same directory as tdf87973_externalLinkSkipUnuseds.ods + pShell->ReloadAllLinks(); + ScDocument& rDoc = pShell->GetDocument(); + + // change external link to: 87973_externalSource.ods + OUString aFormula, bFormula; + rDoc.GetFormula(3, 1, 0, aFormula); + auto nIdxOfFilename = aFormula.indexOf("tdf132105_external.ods"); + aFormula = aFormula.replaceAt(nIdxOfFilename, 22, "87973_externalSource.ods"); + auto nIdxOfFile = aFormula.indexOf("file"); + + // saveAndReload save the file to a temporary directory + // the link must be changed to point to that directory + utl::TempFile aTempFile; + auto aTempFilename = aTempFile.GetURL(); + auto nIdxOfTmpFile = aTempFilename.lastIndexOf('/'); + aTempFilename = aTempFilename.copy(0, nIdxOfTmpFile + 1); + + aFormula = aFormula.replaceAt(nIdxOfFile, nIdxOfFilename - nIdxOfFile, aTempFilename); + rDoc.SetFormula(ScAddress(3, 1, 0), aFormula, formula::FormulaGrammar::GRAM_NATIVE_UI); + + // save and load back + ScDocShellRef pDocSh = saveAndReload(&(*pShell), FORMAT_XLSX); + CPPUNIT_ASSERT(pDocSh.is()); + + // check if the the new filename is present in the link (and not replaced by '[2]') + ScDocument& rDoc2 = pDocSh->GetDocument(); + rDoc2.GetFormula(3, 1, 0, bFormula); + CPPUNIT_ASSERT(bFormula.indexOf("tdf132105_external.ods") < 0); + CPPUNIT_ASSERT(bFormula.indexOf("87973_externalSource.ods") > 0); + + pDocSh->DoClose(); +} + void ScExportTest::testTdf129969() { ScDocShellRef xShell = loadDoc("external_hyperlink.", FORMAT_ODS); diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx index c35f809197c2..6fcee51fa4ae 100644 --- a/sc/source/core/tool/compiler.cxx +++ b/sc/source/core/tool/compiler.cxx @@ -5076,6 +5076,7 @@ void ScCompiler::CreateStringFromExternal( OUStringBuffer& rBuffer, const Formul const FormulaToken* t = pTokenP; sal_uInt16 nFileId = t->GetIndex(); ScExternalRefManager* pRefMgr = rDoc.GetExternalRefManager(); + sal_uInt16 nUsedFileId = pRefMgr->convertFileIdToUsedFileId(nFileId); const OUString* pFileName = pRefMgr->getExternalFileName(nFileId); if (!pFileName) return; @@ -5101,7 +5102,7 @@ void ScCompiler::CreateStringFromExternal( OUStringBuffer& rBuffer, const Formul *pFileName << "' '" << t->GetString().getString() << "'"); pConv->makeExternalRefStr( - rDoc.GetSheetLimits(), rBuffer, GetPos(), nFileId, *pFileName, aTabNames, t->GetString().getString(), + rDoc.GetSheetLimits(), rBuffer, GetPos(), nUsedFileId, *pFileName, aTabNames, t->GetString().getString(), *t->GetDoubleRef()); } break; diff --git a/sc/source/filter/excel/xelink.cxx b/sc/source/filter/excel/xelink.cxx index d8b3a954f278..0522b042c67b 100644 --- a/sc/source/filter/excel/xelink.cxx +++ b/sc/source/filter/excel/xelink.cxx @@ -2077,6 +2077,19 @@ void XclExpSupbookBuffer::Save( XclExpStream& rStrm ) void XclExpSupbookBuffer::SaveXml( XclExpXmlStream& rStrm ) { + // Unused external references are not saved, only kept in memory + // saveds must be indexed from 1, so indexes must be reordered + ScExternalRefManager* pRefMgr = GetDoc().GetExternalRefManager(); + vector aExternFileIds; + for (size_t nPos = 0, nSize = maSupbookList.GetSize(); nPos < nSize; ++nPos) + { + XclExpSupbookRef xRef(maSupbookList.GetRecord(nPos)); + if (xRef->GetType() == XclSupbookType::Extern) + aExternFileIds.push_back(xRef->GetFileId() - 1); + } + if (aExternFileIds.size() > 0) + pRefMgr->setSkipUnusedFileIds(aExternFileIds); + ::std::map< sal_uInt16, OUString > aMap; for (size_t nPos = 0, nSize = maSupbookList.GetSize(); nPos < nSize; ++nPos) { @@ -2085,6 +2098,7 @@ void XclExpSupbookBuffer::SaveXml( XclExpXmlStream& rStrm ) continue; // handle only external reference (for now?) sal_uInt16 nId = xRef->GetFileId(); + sal_uInt16 nUsedId = pRefMgr->convertFileIdToUsedFileId(nId - 1) + 1; const OUString& rUrl = xRef->GetUrl(); ::std::pair< ::std::map< sal_uInt16, OUString >::iterator, bool > aInsert( aMap.insert( ::std::make_pair( nId, rUrl))); @@ -2095,11 +2109,10 @@ void XclExpSupbookBuffer::SaveXml( XclExpXmlStream& rStrm ) (rUrl == (*aInsert.first).second ? " multiple Supbook not supported" : "")); continue; } - OUString sId; sax_fastparser::FSHelperPtr pExternalLink = rStrm.CreateOutputStream( - XclXmlUtils::GetStreamName( "xl/", "externalLinks/externalLink", nId), - XclXmlUtils::GetStreamName( nullptr, "externalLinks/externalLink", nId), + XclXmlUtils::GetStreamName( "xl/", "externalLinks/externalLink", nUsedId), + XclXmlUtils::GetStreamName( nullptr, "externalLinks/externalLink", nUsedId), rStrm.GetCurrentStream()->getOutputStream(), "application/vnd.openxmlformats-officedocument.spreadsheetml.externalLink+xml", CREATE_OFFICEDOC_RELATION_TYPE("externalLink"), diff --git a/sc/source/filter/excel/xestream.cxx b/sc/source/filter/excel/xestream.cxx index b0ea61b1fc36..c0a2646461bf 100644 --- a/sc/source/filter/excel/xestream.cxx +++ b/sc/source/filter/excel/xestream.cxx @@ -66,6 +66,8 @@ #include #include +#include + #define DEBUG_XL_ENCRYPTION 0 using ::com::sun::star::uno::XInterface; @@ -1103,6 +1105,7 @@ bool XclExpXmlStream::exportDocument() if (xStatusIndicator.is()) xStatusIndicator->setValue(40); aDocRoot.WriteXml( *this ); + rDoc.GetExternalRefManager()->disableSkipUnusedFileIds(); } PopStream(); diff --git a/sc/source/ui/docshell/externalrefmgr.cxx b/sc/source/ui/docshell/externalrefmgr.cxx index 3243bfb6f6ed..6f032cafe090 100644 --- a/sc/source/ui/docshell/externalrefmgr.cxx +++ b/sc/source/ui/docshell/externalrefmgr.cxx @@ -2740,6 +2740,31 @@ const OUString* ScExternalRefManager::getExternalFileName(sal_uInt16 nFileId, bo return &maSrcFiles[nFileId].maFileName; } +sal_uInt16 ScExternalRefManager::convertFileIdToUsedFileId(sal_uInt16 nFileId) +{ + if (!mbSkipUnusedFileIds) + return nFileId; + else + return maConvertFileIdToUsedFileId[nFileId]; +} + +void ScExternalRefManager::setSkipUnusedFileIds(std::vector& rExternFileIds) +{ + mbSkipUnusedFileIds = true; + maConvertFileIdToUsedFileId.resize(maRefCells.size()); + std::fill(maConvertFileIdToUsedFileId.begin(), maConvertFileIdToUsedFileId.end(), 0); + int nUsedCount = 0; + for (auto nEntry : rExternFileIds) + { + maConvertFileIdToUsedFileId[nEntry] = nUsedCount++; + } +} + +void ScExternalRefManager::disableSkipUnusedFileIds() +{ + mbSkipUnusedFileIds = false; +} + std::vector ScExternalRefManager::getAllCachedExternalFileNames() const { std::vector aNames;