summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKohei Yoshida <kohei.yoshida@collabora.com>2013-11-04 11:50:18 -0500
committerKohei Yoshida <kohei.yoshida@collabora.com>2013-11-04 13:59:55 -0500
commit370399c8304eb30254f1fa3b5fa773ddefd9b0c0 (patch)
tree07bb1826270f6e4870a398ab24b3ec2b54e8f17e
parent96860b65d4bb95603549f72b1e82c6ee49458ba8 (diff)
Import data tables from xlsx via ScDocumentImport.
Change-Id: Id3d526720f99b7557476915beab35b429ec97c1d
-rw-r--r--sc/source/filter/inc/sheetdatabuffer.hxx5
-rw-r--r--sc/source/filter/oox/sheetdatabuffer.cxx124
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);
}
}