From c1e2e37938a5034b308313e178da0663e9fce665 Mon Sep 17 00:00:00 2001 From: Justin Luth Date: Wed, 9 May 2018 08:38:36 +0300 Subject: [PATCH] tdf#113991 XLS export: emulate relative GLOBAL named ranges Most of the work to emulate was done in a prior patch, which was sufficient for XLSX. These changes make it work for XLS also. Change-Id: Idc9938705445cc37689d6b0fe4354844e1bc3ac1 --- .../data/ods/tdf113991_relativeNamedRanges.ods | Bin 9069 -> 9885 bytes sc/qa/unit/subsequent_export-test.cxx | 5 ++ sc/source/filter/excel/xeformula.cxx | 2 +- sc/source/filter/excel/xename.cxx | 68 +++++++++++---------- sc/source/filter/inc/xename.hxx | 2 +- 5 files changed, 42 insertions(+), 35 deletions(-) diff --git a/sc/qa/unit/data/ods/tdf113991_relativeNamedRanges.ods b/sc/qa/unit/data/ods/tdf113991_relativeNamedRanges.ods index c039a40917d84d8b763859d1ed9bf97f1ed4cbff..8764e5b32b7b569602b25a6cfe09582940a183db 100644 GIT binary patch delta 7951 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 diff --git a/sc/qa/unit/subsequent_export-test.cxx b/sc/qa/unit/subsequent_export-test.cxx index 8449197..d393b46 100644 --- a/sc/qa/unit/subsequent_export-test.cxx +++ b/sc/qa/unit/subsequent_export-test.cxx @@ -3364,6 +3364,11 @@ void ScExportTest::testRelativeNamedExpressionsXLS() ScAddress aPos(5,5,1); CPPUNIT_ASSERT_EQUAL(18.0, rDoc.GetValue(aPos)); ASSERT_FORMULA_EQUAL(rDoc, aPos, "SUM(test_conflict)", nullptr); + + // Sheet2:H6 + aPos = ScAddress(7,5,1); + CPPUNIT_ASSERT_EQUAL(75.0, rDoc.GetValue(aPos)); + ASSERT_FORMULA_EQUAL(rDoc, aPos, "SUM(A6:F6)", nullptr); xDocSh2->DoClose(); } diff --git a/sc/source/filter/excel/xeformula.cxx b/sc/source/filter/excel/xeformula.cxx index 3cd1bd9..dc3297c 100644 --- a/sc/source/filter/excel/xeformula.cxx +++ b/sc/source/filter/excel/xeformula.cxx @@ -2089,7 +2089,7 @@ void XclExpFmlaCompImpl::ProcessDefinedName( const XclExpScToken& rTokData ) SCTAB nTab = (nSheet < 0 ? SCTAB_GLOBAL : nSheet); XclExpNameManager& rNameMgr = GetNameManager(); - sal_uInt16 nNameIdx = rNameMgr.InsertName(nTab, rTokData.mpScToken->GetIndex()); + sal_uInt16 nNameIdx = rNameMgr.InsertName(nTab, rTokData.mpScToken->GetIndex(), GetCurrScTab()); if( nNameIdx != 0 ) { // global names always with tName token, local names dependent on config diff --git a/sc/source/filter/excel/xename.cxx b/sc/source/filter/excel/xename.cxx index d548a6b..2c02afb 100644 --- a/sc/source/filter/excel/xename.cxx +++ b/sc/source/filter/excel/xename.cxx @@ -115,7 +115,7 @@ public: void Initialize(); /** Inserts the Calc name with the passed index and returns the Excel NAME index. */ - sal_uInt16 InsertName( SCTAB nTab, sal_uInt16 nScNameIdx ); + sal_uInt16 InsertName( SCTAB nTab, sal_uInt16 nScNameIdx, SCTAB nCurrTab ); /** Inserts a new built-in defined name. */ sal_uInt16 InsertBuiltInName( sal_Unicode cBuiltIn, const XclTokenArrayRef& xTokArr, SCTAB nScTab, const ScRangeList& aRangeList ); @@ -335,6 +335,34 @@ void XclExpName::WriteBody( XclExpStream& rStrm ) mxTokArr->WriteArray( rStrm ); // token array without size } +/** Returns true if defined name was not 3D. Fixes local defined names, but only reports for SCTAB_GLOBAL. */ +bool lcl_Ensure3DNamedRange( SCTAB nTab, const ScTokenArray* pScTokArr ) +{ + bool bFixRequired = false; + if ( !pScTokArr ) + return bFixRequired; + + formula::FormulaToken* pTok = pScTokArr->FirstToken(); + if ( pTok && pTok->GetType() == formula::svDoubleRef ) + { + ScComplexRefData* pRef = pTok->GetDoubleRef(); + if ( pRef && ( !pRef->Ref1.IsFlag3D() || !pRef->Ref2.IsFlag3D() ) ) + { + bFixRequired = true; + if ( nTab != SCTAB_GLOBAL ) + { + pRef->Ref1.SetFlag3D( true ); //XLSX fix + pRef->Ref2.SetFlag3D( true ); + if ( pRef->Ref1.IsTabRel() ) + pRef->Ref1.SetAbsTab( nTab + pRef->Ref1.Tab() ); //XLS fix + if ( pRef->Ref2.IsTabRel() ) + pRef->Ref2.SetAbsTab( nTab + pRef->Ref2.Tab() ); + } + } + } + return bFixRequired; +} + XclExpNameManagerImpl::XclExpNameManagerImpl( const XclExpRoot& rRoot ) : XclExpRoot( rRoot ), mnFirstUserIdx( 0 ) @@ -348,7 +376,7 @@ void XclExpNameManagerImpl::Initialize() CreateUserNames(); } -sal_uInt16 XclExpNameManagerImpl::InsertName( SCTAB nTab, sal_uInt16 nScNameIdx ) +sal_uInt16 XclExpNameManagerImpl::InsertName( SCTAB nTab, sal_uInt16 nScNameIdx, SCTAB nCurrTab ) { sal_uInt16 nNameIdx = 0; const ScRangeData* pData = nullptr; @@ -358,7 +386,9 @@ sal_uInt16 XclExpNameManagerImpl::InsertName( SCTAB nTab, sal_uInt16 nScNameIdx if (pData) { - nNameIdx = FindNamedExp( nTab, pData->GetName() ); + // Ensuring 3D for export: safe to use here without a copy of GetCode() ONLY IF SCTAB_GLOBAL + const bool bEmulatedEntry = (nTab == SCTAB_GLOBAL) && lcl_Ensure3DNamedRange(nTab, pData->GetCode()); + nNameIdx = FindNamedExp( bEmulatedEntry ? nCurrTab : nTab, pData->GetName() ); if (!nNameIdx) nNameIdx = CreateName(nTab, *pData); } @@ -525,34 +555,6 @@ sal_uInt16 XclExpNameManagerImpl::Append( const XclExpNameRef& xName ) return static_cast< sal_uInt16 >( maNameList.GetSize() ); // 1-based } -/** Returns true if defined name was not 3D. Fixes local defined names, but only reports for SCTAB_GLOBAL. */ -bool lcl_Ensure3DNamedRange( SCTAB nTab, const ScTokenArray* pScTokArr ) -{ - bool bFixRequired = false; - if ( !pScTokArr ) - return bFixRequired; - - formula::FormulaToken* pTok = pScTokArr->FirstToken(); - if ( pTok && pTok->GetType() == formula::svDoubleRef ) - { - ScComplexRefData* pRef = pTok->GetDoubleRef(); - if ( pRef && ( !pRef->Ref1.IsFlag3D() || !pRef->Ref2.IsFlag3D() ) ) - { - bFixRequired = true; - if ( nTab != SCTAB_GLOBAL ) - { - pRef->Ref1.SetFlag3D( true ); //XLSX fix - pRef->Ref2.SetFlag3D( true ); - if ( pRef->Ref1.IsTabRel() ) - pRef->Ref1.SetAbsTab( nTab + pRef->Ref1.Tab() ); //XLS fix - if ( pRef->Ref2.IsTabRel() ) - pRef->Ref2.SetAbsTab( nTab + pRef->Ref2.Tab() ); - } - } - } - return bFixRequired; -} - sal_uInt16 XclExpNameManagerImpl::CreateName( SCTAB nTab, const ScRangeData& rRangeData ) { const OUString& rName = rRangeData.GetName(); @@ -730,9 +732,9 @@ void XclExpNameManager::Initialize() mxImpl->Initialize(); } -sal_uInt16 XclExpNameManager::InsertName( SCTAB nTab, sal_uInt16 nScNameIdx ) +sal_uInt16 XclExpNameManager::InsertName( SCTAB nTab, sal_uInt16 nScNameIdx, SCTAB nCurrTab ) { - return mxImpl->InsertName( nTab, nScNameIdx ); + return mxImpl->InsertName( nTab, nScNameIdx, nCurrTab ); } sal_uInt16 XclExpNameManager::InsertBuiltInName( sal_Unicode cBuiltIn, const ScRange& rRange ) diff --git a/sc/source/filter/inc/xename.hxx b/sc/source/filter/inc/xename.hxx index e1a3ba9..a0bb336 100644 --- a/sc/source/filter/inc/xename.hxx +++ b/sc/source/filter/inc/xename.hxx @@ -40,7 +40,7 @@ public: void Initialize(); /** Inserts the Calc name with the passed index and returns the Excel NAME index. */ - sal_uInt16 InsertName( SCTAB nTab, sal_uInt16 nScNameIdx ); + sal_uInt16 InsertName( SCTAB nTab, sal_uInt16 nScNameIdx, SCTAB nCurrTab ); /** Inserts a new built-in defined name, referring to the passed sheet range. */ sal_uInt16 InsertBuiltInName( sal_Unicode cBuiltIn, const ScRange& rRange ); -- 2.7.4