diff options
author | Muthu Subramanian <sumuthu@novell.com> | 2011-06-29 12:56:51 +0530 |
---|---|---|
committer | Muthu Subramanian <sumuthu@novell.com> | 2011-06-29 12:56:51 +0530 |
commit | 5e30bfb9214767de07e97af8761523eb67776592 (patch) | |
tree | e3d1e849f5368fbd0f0eebb01529fd7bcf176022 /oox/source | |
parent | 26cdd787f6f93a595278e85c39ee2362d1fb3be1 (diff) |
Improved xlsx formula import.
Now uses the values present in the import document
rather than calculating the formula. This speeds up
document loading.
TODO: Extend this to string results as well.
Diffstat (limited to 'oox/source')
-rw-r--r-- | oox/source/xls/sheetdatacontext.cxx | 15 | ||||
-rw-r--r-- | oox/source/xls/workbookfragment.cxx | 7 | ||||
-rw-r--r-- | oox/source/xls/worksheethelper.cxx | 13 |
3 files changed, 31 insertions, 4 deletions
diff --git a/oox/source/xls/sheetdatacontext.cxx b/oox/source/xls/sheetdatacontext.cxx index 569126e0ebad..36011518cb92 100644 --- a/oox/source/xls/sheetdatacontext.cxx +++ b/oox/source/xls/sheetdatacontext.cxx @@ -163,8 +163,8 @@ void SheetDataContext::onCharacters( const OUString& rChars ) maCellValue = rChars; break; case XLS_TOKEN( f ): - if( maFmlaData.mnFormulaType != XML_TOKEN_INVALID ) - maTokens = mrFormulaParser.importFormula( maCellData.maCellAddr, rChars ); + maCellValue = rChars; + mrSheetData.putFormulaString( maCellData.maCellAddr, maCellValue ); break; } } @@ -177,8 +177,8 @@ void SheetDataContext::onEndElement() if( mbHasFormula ) switch( maFmlaData.mnFormulaType ) { case XML_normal: - mrSheetData.setFormulaCell( maCellData, maTokens ); - break; + //mrSheetData.setFormulaCell( maCellData, maTokens ); + break; case XML_shared: if( maFmlaData.mnSharedId >= 0 ) { @@ -240,6 +240,13 @@ void SheetDataContext::onEndElement() mrSheetData.setBlankCell( maCellData ); } } + else if( maCellValue.getLength() > 0 ) switch( maCellData.mnCellType ) + { + case XML_n: + /* Set the pre-loaded value */ + mrSheetData.putFormulaResult( maCellData.maCellAddr, maCellValue.toDouble() ); + break; + } } } diff --git a/oox/source/xls/workbookfragment.cxx b/oox/source/xls/workbookfragment.cxx index 96fd34f0c100..9d22f5fdf937 100644 --- a/oox/source/xls/workbookfragment.cxx +++ b/oox/source/xls/workbookfragment.cxx @@ -29,6 +29,7 @@ #include "oox/xls/workbookfragment.hxx" #include <com/sun/star/table/CellAddress.hpp> +#include <com/sun/star/sheet/XCalculatable.hpp> #include "oox/core/filterbase.hxx" #include "oox/drawingml/themefragmenthandler.hxx" #include "oox/helper/attributelist.hxx" @@ -59,6 +60,7 @@ namespace xls { using namespace ::com::sun::star::io; using namespace ::com::sun::star::table; using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::sheet; using namespace ::oox::core; using ::oox::drawingml::ThemeFragmentHandler; @@ -313,6 +315,11 @@ void WorkbookFragment::finalizeImport() // final conversions, e.g. calculation settings and view settings finalizeWorkbookImport(); + + // Recalculate (only changed ones) + Reference< XCalculatable > xCalculatable( getDocument(), UNO_QUERY ); + if( xCalculatable.is() ) + xCalculatable->calculate(); } // private -------------------------------------------------------------------- diff --git a/oox/source/xls/worksheethelper.cxx b/oox/source/xls/worksheethelper.cxx index 068c89cde2d9..b4bb373d3f9f 100644 --- a/oox/source/xls/worksheethelper.cxx +++ b/oox/source/xls/worksheethelper.cxx @@ -1654,6 +1654,19 @@ void WorksheetHelper::putValue( const CellAddress& rAddress, double fValue ) con if( xCell.is() ) xCell->setValue( fValue ); } +void WorksheetHelper::putFormulaResult( const CellAddress& rAddress, double fValue ) const +{ + Reference< XCell > xCell = getCell( rAddress ); + OSL_ENSURE( xCell.is(), "WorksheetHelper::putFormulaResult - missing cell interface" ); + if( xCell.is() ) xCell->setFormulaResult( fValue ); +} + +void WorksheetHelper::putFormulaString( const CellAddress& rAddress, const OUString& rFormula ) const +{ + Reference< XCell > xCell = getCell( rAddress ); + if( xCell.is() ) xCell->setFormulaString( rFormula ); +} + void WorksheetHelper::putString( const CellAddress& rAddress, const OUString& rText ) const { Reference< XText > xText( getCell( rAddress ), UNO_QUERY ); |