diff options
author | Kohei Yoshida <kohei.yoshida@collabora.com> | 2013-11-04 11:50:18 -0500 |
---|---|---|
committer | Kohei Yoshida <kohei.yoshida@collabora.com> | 2013-11-04 13:59:55 -0500 |
commit | 370399c8304eb30254f1fa3b5fa773ddefd9b0c0 (patch) | |
tree | 07bb1826270f6e4870a398ab24b3ec2b54e8f17e | |
parent | 96860b65d4bb95603549f72b1e82c6ee49458ba8 (diff) |
Import data tables from xlsx via ScDocumentImport.
Change-Id: Id3d526720f99b7557476915beab35b429ec97c1d
-rw-r--r-- | sc/source/filter/inc/sheetdatabuffer.hxx | 5 | ||||
-rw-r--r-- | sc/source/filter/oox/sheetdatabuffer.cxx | 124 |
2 files changed, 69 insertions, 60 deletions
diff --git a/sc/source/filter/inc/sheetdatabuffer.hxx b/sc/source/filter/inc/sheetdatabuffer.hxx index 192f35934c19..ceb3a8058e00 100644 --- a/sc/source/filter/inc/sheetdatabuffer.hxx +++ b/sc/source/filter/inc/sheetdatabuffer.hxx @@ -176,9 +176,8 @@ private: const ::com::sun::star::table::CellRangeAddress& rRange, const ApiTokenSequence& rTokens ) const; /** Inserts the passed table operation into the sheet. */ - void finalizeTableOperation( - const ::com::sun::star::table::CellRangeAddress& rRange, - const DataTableModel& rModel ) const; + void finalizeTableOperation( + const ::com::sun::star::table::CellRangeAddress& rRange, const DataTableModel& rModel ); /** Writes all cell formatting attributes to the passed cell range list. (depreciates writeXfIdRangeProperties) */ void applyCellMerging( const ::com::sun::star::table::CellRangeAddress& rRange ); diff --git a/sc/source/filter/oox/sheetdatabuffer.cxx b/sc/source/filter/oox/sheetdatabuffer.cxx index f55d365eb1e0..2b340c572962 100644 --- a/sc/source/filter/oox/sheetdatabuffer.cxx +++ b/sc/source/filter/oox/sheetdatabuffer.cxx @@ -51,6 +51,8 @@ #include "scitems.hxx" #include "formulacell.hxx" #include "docpool.hxx" +#include "paramisc.hxx" +#include "documentimport.hxx" namespace oox { namespace xls { @@ -565,71 +567,79 @@ void SheetDataBuffer::finalizeArrayFormula( const CellRangeAddress& rRange, cons xTokens->setArrayTokens( rTokens ); } -void SheetDataBuffer::finalizeTableOperation( const CellRangeAddress& rRange, const DataTableModel& rModel ) const +void SheetDataBuffer::finalizeTableOperation( const CellRangeAddress& rRange, const DataTableModel& rModel ) { + if (rModel.mbRef1Deleted) + return; + + if (rModel.maRef1.isEmpty()) + return; + + if (rRange.StartColumn <= 0 || rRange.StartRow <= 0) + return; + sal_Int16 nSheet = getSheetIndex(); - bool bOk = false; - if( !rModel.mbRef1Deleted && !rModel.maRef1.isEmpty() && (rRange.StartColumn > 0) && (rRange.StartRow > 0) ) + + CellAddress aRef1; + if (!getAddressConverter().convertToCellAddress(aRef1, rModel.maRef1, nSheet, true)) + return; + + ScDocumentImport& rDoc = getDocImport(); + ScTabOpParam aParam; + + ScRange aScRange; + ScUnoConversion::FillScRange(aScRange, rRange); + + if (rModel.mb2dTable) { - CellRangeAddress aOpRange = rRange; - CellAddress aRef1; - if( getAddressConverter().convertToCellAddress( aRef1, rModel.maRef1, nSheet, true ) ) try - { - if( rModel.mb2dTable ) - { - CellAddress aRef2; - if( !rModel.mbRef2Deleted && getAddressConverter().convertToCellAddress( aRef2, rModel.maRef2, nSheet, true ) ) - { - // API call expects input values inside operation range - --aOpRange.StartColumn; - --aOpRange.StartRow; - // formula range is top-left cell of operation range - CellRangeAddress aFormulaRange( nSheet, aOpRange.StartColumn, aOpRange.StartRow, aOpRange.StartColumn, aOpRange.StartRow ); - // set multiple operation - Reference< XMultipleOperation > xMultOp( getCellRange( aOpRange ), UNO_QUERY_THROW ); - xMultOp->setTableOperation( aFormulaRange, TableOperationMode_BOTH, aRef2, aRef1 ); - bOk = true; - } - } - else if( rModel.mbRowTable ) - { - // formula range is column to the left of operation range - CellRangeAddress aFormulaRange( nSheet, aOpRange.StartColumn - 1, aOpRange.StartRow, aOpRange.StartColumn - 1, aOpRange.EndRow ); - // API call expects input values (top row) inside operation range - --aOpRange.StartRow; - // set multiple operation - Reference< XMultipleOperation > xMultOp( getCellRange( aOpRange ), UNO_QUERY_THROW ); - xMultOp->setTableOperation( aFormulaRange, TableOperationMode_ROW, aRef1, aRef1 ); - bOk = true; - } - else - { - // formula range is row above operation range - CellRangeAddress aFormulaRange( nSheet, aOpRange.StartColumn, aOpRange.StartRow - 1, aOpRange.EndColumn, aOpRange.StartRow - 1 ); - // API call expects input values (left column) inside operation range - --aOpRange.StartColumn; - // set multiple operation - Reference< XMultipleOperation > xMultOp( getCellRange( aOpRange ), UNO_QUERY_THROW ); - xMultOp->setTableOperation( aFormulaRange, TableOperationMode_COLUMN, aRef1, aRef1 ); - bOk = true; - } - } - catch( Exception& ) - { - } + // Two-variable data table. + if (rModel.mbRef2Deleted) + return; + + if (rModel.maRef2.isEmpty()) + return; + + CellAddress aRef2; + if (!getAddressConverter().convertToCellAddress(aRef2, rModel.maRef2, nSheet, true)) + return; + + aParam.meMode = ScTabOpParam::Both; + + aParam.aRefFormulaCell.Set(rRange.StartColumn-1, rRange.StartRow-1, nSheet, false, false, false); + aParam.aRefFormulaEnd = aParam.aRefFormulaCell; + + aScRange.aStart.IncRow(-1); + aScRange.aStart.IncCol(-1); + + // Ref1 is row input cell and Ref2 is column input cell. + aParam.aRefRowCell.Set(aRef1.Column, aRef1.Row, aRef1.Sheet, false, false, false); + aParam.aRefColCell.Set(aRef2.Column, aRef2.Row, aRef2.Sheet, false, false, false); + rDoc.setTableOpCells(aScRange, aParam); + + return; } - // on error: fill cell range with #REF! error codes - if( !bOk ) try + // One-variable data table. + + if (rModel.mbRowTable) { - Reference< XCellRangeData > xCellRangeData( getCellRange( rRange ), UNO_QUERY_THROW ); - size_t nWidth = static_cast< size_t >( rRange.EndColumn - rRange.StartColumn + 1 ); - size_t nHeight = static_cast< size_t >( rRange.EndRow - rRange.StartRow + 1 ); - Matrix< Any > aErrorCells( nWidth, nHeight, Any( getFormulaParser().convertErrorToFormula( BIFF_ERR_REF ) ) ); - xCellRangeData->setDataArray( ContainerHelper::matrixToSequenceSequence( aErrorCells ) ); + // One-variable row input cell (horizontal). + aParam.meMode = ScTabOpParam::Row; + aParam.aRefRowCell.Set(aRef1.Column, aRef1.Row, aRef1.Sheet, false, false, false); + aParam.aRefFormulaCell.Set(rRange.StartColumn-1, rRange.StartRow, nSheet, false, true, false); + aParam.aRefFormulaEnd = aParam.aRefFormulaCell; + aScRange.aStart.IncRow(-1); + rDoc.setTableOpCells(aScRange, aParam); } - catch( Exception& ) + else { + // One-variable column input cell (vertical). + aParam.meMode = ScTabOpParam::Column; + aParam.aRefColCell.Set(aRef1.Column, aRef1.Row, aRef1.Sheet, false, false, false); + aParam.aRefFormulaCell.Set(rRange.StartColumn, rRange.StartRow-1, nSheet, true, false, false); + aParam.aRefFormulaEnd = aParam.aRefFormulaCell; + aScRange.aStart.IncCol(-1); + rDoc.setTableOpCells(aScRange, aParam); } } |