diff options
author | Miklos Vajna <vmiklos@collabora.com> | 2021-07-05 12:29:18 +0200 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.com> | 2021-07-05 14:04:11 +0200 |
commit | db1c8df98a23d687d6806f371bdd416dd1b84589 (patch) | |
tree | d99aaab6f7bd965c16f47fca2577c5bf4a92b99c /sc/source | |
parent | bec391133da18e1c7c0e7f3d562bceeb6f93b497 (diff) |
XLSX import: fix handling of named ranges referring to PathMissing sheets
In case xl/externalLinks/externalLink1.xml refers to a sheet where type
is PathMissing, then both <sheetName> and <sheetData> gets ignored on
import. Make sure to also ignore named ranges referring to such external
documents.
The resulting named range was just a string anyway, and exporting this
back to XLSX results in Excel marking the whole file as corrupted.
Change-Id: Ifde07b5e59fba371f1f8ab3e82861c6997c6dbf0
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/118401
Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
Tested-by: Jenkins
Diffstat (limited to 'sc/source')
-rw-r--r-- | sc/source/filter/inc/defnamesbuffer.hxx | 1 | ||||
-rw-r--r-- | sc/source/filter/oox/defnamesbuffer.cxx | 22 |
2 files changed, 23 insertions, 0 deletions
diff --git a/sc/source/filter/inc/defnamesbuffer.hxx b/sc/source/filter/inc/defnamesbuffer.hxx index c6a553a999b6..ade123682711 100644 --- a/sc/source/filter/inc/defnamesbuffer.hxx +++ b/sc/source/filter/inc/defnamesbuffer.hxx @@ -118,6 +118,7 @@ public: sal_Int32 getTokenIndex() const { return mnTokenIndex; } /** Tries to resolve the defined name to an absolute cell range. */ bool getAbsoluteRange( ScRange& orRange ) const; + bool isValid(const css::uno::Sequence<css::sheet::ExternalLinkInfo>& rExternalLinks) const; private: typedef ::std::unique_ptr< StreamDataSequence > StreamDataSeqPtr; diff --git a/sc/source/filter/oox/defnamesbuffer.cxx b/sc/source/filter/oox/defnamesbuffer.cxx index 9eebaf1633a7..72f28cd4edd3 100644 --- a/sc/source/filter/oox/defnamesbuffer.cxx +++ b/sc/source/filter/oox/defnamesbuffer.cxx @@ -239,6 +239,23 @@ void DefinedName::createNameObject( sal_Int32 nIndex ) mnTokenIndex = nIndex; } +bool DefinedName::isValid( + const css::uno::Sequence<css::sheet::ExternalLinkInfo>& rExternalLinks) const +{ + ScRange aRange; + OUString aExternDocName; + OUString aStartTabName; + OUString aEndTabName; + ScRefFlags nFlags = ScRefFlags::VALID | ScRefFlags::TAB_VALID; + aRange.Parse_XL_Header(maModel.maFormula.getStr(), getScDocument(), aExternDocName, + aStartTabName, aEndTabName, nFlags, /*bOnlyAcceptSingle=*/false, + &rExternalLinks); + // aExternDocName is something like 'file:///path/to/my.xlsx' in the valid case, and it's an int + // when it's invalid. + bool bInvalidExternalRef = aExternDocName.toInt32() > 0; + return !bInvalidExternalRef; +} + std::unique_ptr<ScTokenArray> DefinedName::getScTokens( const css::uno::Sequence<css::sheet::ExternalLinkInfo>& rExternalLinks ) { @@ -366,6 +383,11 @@ void DefinedNamesBuffer::finalizeImport() int index = 0; for( DefinedNameRef& xDefName : maDefNames ) { + if (!xDefName->isValid(getExternalLinks().getLinkInfos())) + { + continue; + } + xDefName->createNameObject( ++index ); // map by sheet index and original model name maModelNameMap[ SheetNameKey( xDefName->getLocalCalcSheet(), xDefName->getUpcaseModelName() ) ] = xDefName; |