tdf#48140 replace ApiCellRangeList in xlsx import (3)

Change-Id: I9cb4b14c0b4642c6e630c449dc979521ba0f8ee6
Reviewed-on: https://gerrit.libreoffice.org/33093
Reviewed-by: Jochen Nitschke <j.nitschke+logerrit@ok.de>
Tested-by: Jochen Nitschke <j.nitschke+logerrit@ok.de>
This commit is contained in:
Jochen Nitschke
2017-01-13 09:38:33 +01:00
parent ff08e8d561
commit 7c73c4605b
2 changed files with 32 additions and 40 deletions

View File

@@ -189,7 +189,7 @@ private:
}; };
typedef ::std::pair< sal_Int32, sal_Int32 > XfIdNumFmtKey; 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; typedef ::std::pair< sal_Int32, sal_Int32 > RowRange;
struct RowRangeStyle struct RowRangeStyle

View File

@@ -59,7 +59,6 @@ namespace xls {
using namespace ::com::sun::star::lang; using namespace ::com::sun::star::lang;
using namespace ::com::sun::star::sheet; using namespace ::com::sun::star::sheet;
using namespace ::com::sun::star::table;
using namespace ::com::sun::star::text; using namespace ::com::sun::star::text;
using namespace ::com::sun::star::uno; using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::util; using namespace ::com::sun::star::util;
@@ -325,12 +324,12 @@ void SheetDataBuffer::setMergedRange( const ScRange& rRange )
typedef std::pair<sal_Int32, sal_Int32> FormatKeyPair; 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(); Xf* pXf1 = rStyles.getCellXf( nXfId ).get();
if ( pXf1 ) 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 ) 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 // add ranges from the rangelist to the existing rangelist for the
// matching style ( should we check if they overlap ? ) // 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 ) for (size_t i = 0, nSize = rRangeList.size(); i < nSize; ++i)
it->second.push_back( *iter ); it->second.Append(*rRangeList[i]);
return; return;
} }
} }
@@ -417,24 +416,21 @@ void SheetDataBuffer::finalizeImport()
// write default formatting of remaining row range // write default formatting of remaining row range
maXfIdRowRangeList[ maXfIdRowRange.mnXfId ].push_back( maXfIdRowRange.maRowRange ); 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 ) for( XfIdRangeListMap::const_iterator aIt = maXfIdRangeLists.begin(), aEnd = maXfIdRangeLists.end(); aIt != aEnd; ++aIt )
{ {
addIfNotInMyMap( getStyles(), rangeStyleListMap, aIt->first.first, aIt->first.second, aIt->second ); addIfNotInMyMap( getStyles(), rangeStyleListMap, aIt->first.first, aIt->first.second, aIt->second );
} }
// gather all ranges that have the same style and apply them in bulk // 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 ); const ScRangeList& rRanges( it->second );
for ( ::std::vector< CellRangeAddress >::const_iterator it_range = rRanges.begin(), it_rangeend = rRanges.end(); it_range!=it_rangeend; ++it_range ) for (size_t i = 0, nSize = rRanges.size(); i < nSize; ++i)
addColXfStyle( it->first.first, it->first.second, addColXfStyle( it->first.first, it->first.second, *rRanges[i]);
ScRange( (*it_range).StartColumn, (*it_range).StartRow, (*it_range).Sheet,
(*it_range).EndColumn, (*it_range).EndRow, (*it_range).Sheet ));
} }
for ( std::map< sal_Int32, std::vector< ValueRange > >::iterator it = maXfIdRowRangeList.begin(), it_end = maXfIdRowRangeList.end(); it != it_end; ++it ) 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(); AddressConverter& rAddrConv = getAddressConverter();
// get all row ranges for id // get all row ranges for id
for ( std::vector< ValueRange >::iterator rangeIter = it->second.begin(), rangeIter_end = it->second.end(); rangeIter != rangeIter_end; ++rangeIter ) 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 ) if( rModel.mnXfId >= 0 )
{ {
::std::vector< CellRangeAddress >::reverse_iterator aIt = maXfIdRangeLists[ XfIdNumFmtKey( rModel.mnXfId, -1 ) ].rbegin(); ScRangeList& rRangeList = maXfIdRangeLists[ XfIdNumFmtKey( rModel.mnXfId, -1 ) ];
::std::vector< CellRangeAddress >::reverse_iterator aItEnd = maXfIdRangeLists[ XfIdNumFmtKey( rModel.mnXfId, -1 ) ].rend(); ScRange* pLastRange = rRangeList.empty() ? nullptr : rRangeList.back();
/* The xlsx sheet data contains row wise information. /* The xlsx sheet data contains row wise information.
* It is sufficient to check if the row range size is one * It is sufficient to check if the row range size is one
*/ */
if( aIt != aItEnd && if (!rRangeList.empty() &&
aIt->Sheet == rModel.maCellAddr.Tab() && pLastRange->aStart.Tab() == rModel.maCellAddr.Tab() &&
aIt->StartRow == aIt->EndRow && pLastRange->aStart.Row() == pLastRange->aEnd.Row() &&
aIt->StartRow == rModel.maCellAddr.Row() && pLastRange->aStart.Row() == rModel.maCellAddr.Row() &&
(aIt->EndColumn+1) == rModel.maCellAddr.Col() ) pLastRange->aEnd.Col() + 1 == rModel.maCellAddr.Col())
{ {
aIt->EndColumn++; // Expand Column pLastRange->aEnd.IncCol(); // Expand Column
} }
else else
{ {
maXfIdRangeLists[ XfIdNumFmtKey (rModel.mnXfId, -1 ) ].push_back( maXfIdRangeLists[ XfIdNumFmtKey (rModel.mnXfId, -1 ) ].Append(ScRange(rModel.maCellAddr, rModel.maCellAddr));
CellRangeAddress( rModel.maCellAddr.Tab(), rModel.maCellAddr.Col(), rModel.maCellAddr.Row(), pLastRange = rRangeList.back();
rModel.maCellAddr.Col(), rModel.maCellAddr.Row() ) );
} }
aIt = maXfIdRangeLists[ XfIdNumFmtKey( rModel.mnXfId, -1 ) ].rbegin(); if (rRangeList.size() > 1)
aItEnd = maXfIdRangeLists[ XfIdNumFmtKey( rModel.mnXfId, -1 ) ].rend();
::std::vector< CellRangeAddress >::reverse_iterator aItM = aIt+1;
while( aItM != aItEnd )
{ {
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 */ /* Try to merge this with the previous range */
if( aIt->StartRow == (aItM->EndRow + 1) && if (pLastRange->aStart.Row() == (pMergeRange->aStart.Row() + 1) &&
aIt->StartColumn == aItM->StartColumn && pLastRange->aStart.Col() == pMergeRange->aStart.Col() &&
aIt->EndColumn == aItM->EndColumn) pLastRange->aEnd.Col() == pMergeRange->aEnd.Col())
{ {
aItM->EndRow = aIt->EndRow; pMergeRange->aEnd.SetRow(pLastRange->aEnd.Row());
maXfIdRangeLists[ XfIdNumFmtKey( rModel.mnXfId, -1 ) ].pop_back(); rRangeList.Remove(rRangeList.size() - 1);
break; 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 break; // Un-necessary to check with any other rows
} }
else
break;
++aItM;
} }
// update merged ranges for 'center across selection' and 'fill' // update merged ranges for 'center across selection' and 'fill'
if( const Xf* pXf = getStyles().getCellXf( rModel.mnXfId ).get() ) if( const Xf* pXf = getStyles().getCellXf( rModel.mnXfId ).get() )
{ {