sc/source/filter/excel/xetable.cxx | 31 ++++++++++++++++--------------- sc/source/filter/inc/xetable.hxx | 2 +- 2 files changed, 17 insertions(+), 16 deletions(-)
New commits: commit 02b610b53d697a2d5e15674fc79ceee5b7c75207 Author: Kohei Yoshida <kohei.yosh...@gmail.com> Date: Fri Jul 26 10:31:50 2013 -0400 Fix exporting of array formulas to xls. Change-Id: I366f5ef21353d64561d82b025c7919a1dbdb3422 diff --git a/sc/source/filter/excel/xetable.cxx b/sc/source/filter/excel/xetable.cxx index 8694a49..9ef8202 100644 --- a/sc/source/filter/excel/xetable.cxx +++ b/sc/source/filter/excel/xetable.cxx @@ -148,23 +148,24 @@ XclExpArrayRef XclExpArrayBuffer::CreateArray( const ScTokenArray& rScTokArr, co return rxRec; } -XclExpArrayRef XclExpArrayBuffer::FindArray( const ScTokenArray& rScTokArr ) const +XclExpArrayRef XclExpArrayBuffer::FindArray( const ScTokenArray& rScTokArr, const ScAddress& rBasePos ) const { XclExpArrayRef xRec; // try to extract a matrix reference token - if( rScTokArr.GetLen() == 1 ) - { - const formula::FormulaToken* pToken = rScTokArr.GetArray()[ 0 ]; - if( pToken && (pToken->GetOpCode() == ocMatRef) ) - { - const ScSingleRefData& rRef = static_cast<const ScToken*>(pToken)->GetSingleRef(); - ScAddress aBasePos( rRef.nCol, rRef.nRow, GetCurrScTab() ); - XclExpArrayMap::const_iterator aIt = maRecMap.find( aBasePos ); - if( aIt != maRecMap.end() ) - xRec = aIt->second; - } - } - return xRec; + if (rScTokArr.GetLen() != 1) + // Must consist of a single reference token. + return xRec; + + const formula::FormulaToken* pToken = rScTokArr.GetArray()[0]; + if (!pToken || pToken->GetOpCode() != ocMatRef) + // not a matrix reference token. + return xRec; + + const ScSingleRefData& rRef = static_cast<const ScToken*>(pToken)->GetSingleRef(); + ScAddress aAbsPos = rRef.toAbs(rBasePos); + XclExpArrayMap::const_iterator it = maRecMap.find(aAbsPos); + + return (it == maRecMap.end()) ? xRec : xRec = it->second; } // Shared formulas ============================================================ @@ -840,7 +841,7 @@ XclExpFormulaCell::XclExpFormulaCell( case MM_REFERENCE: { // other formula cell covered by a matrix - find the ARRAY record - mxAddRec = rArrayBfr.FindArray( rScTokArr ); + mxAddRec = rArrayBfr.FindArray(rScTokArr, aScPos); // should always be found, if Calc document is not broken OSL_ENSURE( mxAddRec, "XclExpFormulaCell::XclExpFormulaCell - no matrix found" ); } diff --git a/sc/source/filter/inc/xetable.hxx b/sc/source/filter/inc/xetable.hxx index 655d6ea..533d2ec 100644 --- a/sc/source/filter/inc/xetable.hxx +++ b/sc/source/filter/inc/xetable.hxx @@ -135,7 +135,7 @@ public: /** Inserts a new ARRAY record into the buffer and returns it. */ XclExpArrayRef CreateArray( const ScTokenArray& rScTokArr, const ScRange& rScRange ); /** Tries to find an ARRAY record that corresponds to an ocMatRef token. */ - XclExpArrayRef FindArray( const ScTokenArray& rScTokArr ) const; + XclExpArrayRef FindArray( const ScTokenArray& rScTokArr, const ScAddress& rBasePos ) const; private: typedef ::std::map< ScAddress, XclExpArrayRef > XclExpArrayMap; _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits