[Libreoffice-commits] .: oox/inc oox/source

Muthu Subramanian sumuthu at kemper.freedesktop.org
Wed Jun 29 00:13:30 PDT 2011


 oox/inc/oox/xls/worksheethelper.hxx |    7 +++++++
 oox/source/xls/sheetdatacontext.cxx |   15 +++++++++++----
 oox/source/xls/workbookfragment.cxx |    7 +++++++
 oox/source/xls/worksheethelper.cxx  |   13 +++++++++++++
 4 files changed, 38 insertions(+), 4 deletions(-)

New commits:
commit e827ed6a7ed1a152b5baa3396cce2d4156417f21
Author: Muthu Subramanian <sumuthu at novell.com>
Date:   Wed Jun 29 12:56:51 2011 +0530

    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.

diff --git a/oox/inc/oox/xls/worksheethelper.hxx b/oox/inc/oox/xls/worksheethelper.hxx
index 91f206e..18a7443 100644
--- a/oox/inc/oox/xls/worksheethelper.hxx
+++ b/oox/inc/oox/xls/worksheethelper.hxx
@@ -323,6 +323,13 @@ public:
     void                putValue(
                             const ::com::sun::star::table::CellAddress& rAddress,
                             double fValue ) const;
+    void                putFormulaResult(
+                            const ::com::sun::star::table::CellAddress& rAddress,
+                            double fValue ) const;
+    void                putFormulaString(
+                            const ::com::sun::star::table::CellAddress& rAddress,
+                            const ::rtl::OUString& rText ) const;
+
     /** Inserts a string cell directly into the Calc sheet. */
     void                putString(
                             const ::com::sun::star::table::CellAddress& rAddress,
diff --git a/oox/source/xls/sheetdatacontext.cxx b/oox/source/xls/sheetdatacontext.cxx
index 93fa18e..698f0fe 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 9aef3ba..ee59177 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 186a903..5368940 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 );


More information about the Libreoffice-commits mailing list