sc/source/filter/inc/sheetdatabuffer.hxx | 2 sc/source/filter/oox/sheetdatabuffer.cxx | 70 +++++++++++++------------------ 2 files changed, 32 insertions(+), 40 deletions(-)
New commits: commit 7c73c4605bb75b288e186b5de0ca12da1724353e Author: Jochen Nitschke <j.nitschke+loger...@ok.de> Date: Fri Jan 13 09:38:33 2017 +0100 tdf#48140 replace ApiCellRangeList in xlsx import (3) Change-Id: I9cb4b14c0b4642c6e630c449dc979521ba0f8ee6 Reviewed-on: https://gerrit.libreoffice.org/33093 Reviewed-by: Jochen Nitschke <j.nitschke+loger...@ok.de> Tested-by: Jochen Nitschke <j.nitschke+loger...@ok.de> diff --git a/sc/source/filter/inc/sheetdatabuffer.hxx b/sc/source/filter/inc/sheetdatabuffer.hxx index 40d9b15..86590bb 100644 --- a/sc/source/filter/inc/sheetdatabuffer.hxx +++ b/sc/source/filter/inc/sheetdatabuffer.hxx @@ -189,7 +189,7 @@ private: }; typedef ::std::pair< sal_Int32, sal_Int32 > XfIdNumFmtKey; - typedef ::std::map< XfIdNumFmtKey, ApiCellRangeList > XfIdRangeListMap; + typedef ::std::map< XfIdNumFmtKey, ScRangeList > XfIdRangeListMap; typedef ::std::pair< sal_Int32, sal_Int32 > RowRange; struct RowRangeStyle diff --git a/sc/source/filter/oox/sheetdatabuffer.cxx b/sc/source/filter/oox/sheetdatabuffer.cxx index 239a542..bc20b4f 100644 --- a/sc/source/filter/oox/sheetdatabuffer.cxx +++ b/sc/source/filter/oox/sheetdatabuffer.cxx @@ -59,7 +59,6 @@ namespace xls { using namespace ::com::sun::star::lang; using namespace ::com::sun::star::sheet; -using namespace ::com::sun::star::table; using namespace ::com::sun::star::text; using namespace ::com::sun::star::uno; using namespace ::com::sun::star::util; @@ -325,12 +324,12 @@ void SheetDataBuffer::setMergedRange( const ScRange& rRange ) typedef std::pair<sal_Int32, sal_Int32> FormatKeyPair; -void addIfNotInMyMap( StylesBuffer& rStyles, std::map< FormatKeyPair, ApiCellRangeList >& rMap, sal_Int32 nXfId, sal_Int32 nFormatId, const ApiCellRangeList& rRangeList ) +void addIfNotInMyMap( StylesBuffer& rStyles, std::map< FormatKeyPair, ScRangeList >& rMap, sal_Int32 nXfId, sal_Int32 nFormatId, const ScRangeList& rRangeList ) { Xf* pXf1 = rStyles.getCellXf( nXfId ).get(); if ( pXf1 ) { - for ( std::map< FormatKeyPair, ApiCellRangeList >::iterator it = rMap.begin(), it_end = rMap.end(); it != it_end; ++it ) + for ( std::map< FormatKeyPair, ScRangeList >::iterator it = rMap.begin(), it_end = rMap.end(); it != it_end; ++it ) { if ( it->first.second == nFormatId ) { @@ -339,8 +338,8 @@ void addIfNotInMyMap( StylesBuffer& rStyles, std::map< FormatKeyPair, ApiCellRan { // add ranges from the rangelist to the existing rangelist for the // matching style ( should we check if they overlap ? ) - for ( ::std::vector< CellRangeAddress >::const_iterator iter = rRangeList.begin(), iter_end = rRangeList.end(); iter != iter_end; ++iter ) - it->second.push_back( *iter ); + for (size_t i = 0, nSize = rRangeList.size(); i < nSize; ++i) + it->second.Append(*rRangeList[i]); return; } } @@ -417,24 +416,21 @@ void SheetDataBuffer::finalizeImport() // write default formatting of remaining row range maXfIdRowRangeList[ maXfIdRowRange.mnXfId ].push_back( maXfIdRowRange.maRowRange ); - std::map< FormatKeyPair, ApiCellRangeList > rangeStyleListMap; + std::map< FormatKeyPair, ScRangeList > rangeStyleListMap; for( XfIdRangeListMap::const_iterator aIt = maXfIdRangeLists.begin(), aEnd = maXfIdRangeLists.end(); aIt != aEnd; ++aIt ) { addIfNotInMyMap( getStyles(), rangeStyleListMap, aIt->first.first, aIt->first.second, aIt->second ); } // gather all ranges that have the same style and apply them in bulk - for ( std::map< FormatKeyPair, ApiCellRangeList >::iterator it = rangeStyleListMap.begin(), it_end = rangeStyleListMap.end(); it != it_end; ++it ) + for ( std::map< FormatKeyPair, ScRangeList >::iterator it = rangeStyleListMap.begin(), it_end = rangeStyleListMap.end(); it != it_end; ++it ) { - const ApiCellRangeList& rRanges( it->second ); - for ( ::std::vector< CellRangeAddress >::const_iterator it_range = rRanges.begin(), it_rangeend = rRanges.end(); it_range!=it_rangeend; ++it_range ) - addColXfStyle( it->first.first, it->first.second, - ScRange( (*it_range).StartColumn, (*it_range).StartRow, (*it_range).Sheet, - (*it_range).EndColumn, (*it_range).EndRow, (*it_range).Sheet )); + const ScRangeList& rRanges( it->second ); + for (size_t i = 0, nSize = rRanges.size(); i < nSize; ++i) + addColXfStyle( it->first.first, it->first.second, *rRanges[i]); } for ( std::map< sal_Int32, std::vector< ValueRange > >::iterator it = maXfIdRowRangeList.begin(), it_end = maXfIdRowRangeList.end(); it != it_end; ++it ) { - ApiCellRangeList rangeList; AddressConverter& rAddrConv = getAddressConverter(); // get all row ranges for id for ( std::vector< ValueRange >::iterator rangeIter = it->second.begin(), rangeIter_end = it->second.end(); rangeIter != rangeIter_end; ++rangeIter ) @@ -651,50 +647,46 @@ void SheetDataBuffer::setCellFormat( const CellModel& rModel ) { if( rModel.mnXfId >= 0 ) { - ::std::vector< CellRangeAddress >::reverse_iterator aIt = maXfIdRangeLists[ XfIdNumFmtKey( rModel.mnXfId, -1 ) ].rbegin(); - ::std::vector< CellRangeAddress >::reverse_iterator aItEnd = maXfIdRangeLists[ XfIdNumFmtKey( rModel.mnXfId, -1 ) ].rend(); + ScRangeList& rRangeList = maXfIdRangeLists[ XfIdNumFmtKey( rModel.mnXfId, -1 ) ]; + ScRange* pLastRange = rRangeList.empty() ? nullptr : rRangeList.back(); /* The xlsx sheet data contains row wise information. * It is sufficient to check if the row range size is one */ - if( aIt != aItEnd && - aIt->Sheet == rModel.maCellAddr.Tab() && - aIt->StartRow == aIt->EndRow && - aIt->StartRow == rModel.maCellAddr.Row() && - (aIt->EndColumn+1) == rModel.maCellAddr.Col() ) + if (!rRangeList.empty() && + pLastRange->aStart.Tab() == rModel.maCellAddr.Tab() && + pLastRange->aStart.Row() == pLastRange->aEnd.Row() && + pLastRange->aStart.Row() == rModel.maCellAddr.Row() && + pLastRange->aEnd.Col() + 1 == rModel.maCellAddr.Col()) { - aIt->EndColumn++; // Expand Column + pLastRange->aEnd.IncCol(); // Expand Column } else { - maXfIdRangeLists[ XfIdNumFmtKey (rModel.mnXfId, -1 ) ].push_back( - CellRangeAddress( rModel.maCellAddr.Tab(), rModel.maCellAddr.Col(), rModel.maCellAddr.Row(), - rModel.maCellAddr.Col(), rModel.maCellAddr.Row() ) ); + maXfIdRangeLists[ XfIdNumFmtKey (rModel.mnXfId, -1 ) ].Append(ScRange(rModel.maCellAddr, rModel.maCellAddr)); + pLastRange = rRangeList.back(); } - aIt = maXfIdRangeLists[ XfIdNumFmtKey( rModel.mnXfId, -1 ) ].rbegin(); - aItEnd = maXfIdRangeLists[ XfIdNumFmtKey( rModel.mnXfId, -1 ) ].rend(); - ::std::vector< CellRangeAddress >::reverse_iterator aItM = aIt+1; - while( aItM != aItEnd ) + if (rRangeList.size() > 1) { - if( aIt->Sheet == aItM->Sheet ) + for (size_t i = rRangeList.size() - 1; i != 0; --i) { + ScRange* pMergeRange = rRangeList[i - 1]; + if (pLastRange->aStart.Tab() != pMergeRange->aStart.Tab()) + break; + /* Try to merge this with the previous range */ - if( aIt->StartRow == (aItM->EndRow + 1) && - aIt->StartColumn == aItM->StartColumn && - aIt->EndColumn == aItM->EndColumn) + if (pLastRange->aStart.Row() == (pMergeRange->aStart.Row() + 1) && + pLastRange->aStart.Col() == pMergeRange->aStart.Col() && + pLastRange->aEnd.Col() == pMergeRange->aEnd.Col()) { - aItM->EndRow = aIt->EndRow; - maXfIdRangeLists[ XfIdNumFmtKey( rModel.mnXfId, -1 ) ].pop_back(); + pMergeRange->aEnd.SetRow(pLastRange->aEnd.Row()); + rRangeList.Remove(rRangeList.size() - 1); break; } - else if( aIt->StartRow > aItM->EndRow + 1 ) + else if (pLastRange->aStart.Row() > (pMergeRange->aEnd.Row() + 1)) break; // Un-necessary to check with any other rows } - else - break; - ++aItM; } - // update merged ranges for 'center across selection' and 'fill' if( const Xf* pXf = getStyles().getCellXf( rModel.mnXfId ).get() ) { _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits