sc/source/filter/inc/orcusinterface.hxx | 38 ++++++++++ sc/source/filter/inc/worksheethelper.hxx | 2 sc/source/filter/oox/worksheetfragment.cxx | 18 ++++ sc/source/filter/oox/worksheethelper.cxx | 4 - sc/source/filter/orcus/interface.cxx | 105 +++++++++++++++++++++++++++++ 5 files changed, 163 insertions(+), 4 deletions(-)
New commits: commit a644ea69d4baac7d3582dd50db5363dc047df298 Author: Markus Mohrhard <[email protected]> Date: Mon Aug 18 02:01:58 2014 +0200 use orcus for table import This is a proof of concept and shows that it is possible to partially replace the OOXML import with orcus. Change-Id: I610cec4ba4ec6f966848397ec9f0c465520a3c65 diff --git a/sc/source/filter/oox/worksheetfragment.cxx b/sc/source/filter/oox/worksheetfragment.cxx index f93d56ee..7fd5e76 100644 --- a/sc/source/filter/oox/worksheetfragment.cxx +++ b/sc/source/filter/oox/worksheetfragment.cxx @@ -44,11 +44,15 @@ #include "workbooksettings.hxx" #include "worksheetsettings.hxx" +#include "orcusinterface.hxx" +#include <orcus/orcus_import_xlsx.hpp> + namespace oox { namespace xls { using namespace ::com::sun::star::table; using namespace ::com::sun::star::uno; +using namespace ::com::sun::star; using namespace ::oox::core; namespace { @@ -195,7 +199,19 @@ WorksheetFragment::WorksheetFragment( const WorksheetHelper& rHelper, const OUSt // import data tables related to this worksheet RelationsRef xTableRels = getRelations().getRelationsFromTypeFromOfficeDoc( "table" ); for( Relations::const_iterator aIt = xTableRels->begin(), aEnd = xTableRels->end(); aIt != aEnd; ++aIt ) - importOoxFragment( new TableFragment( *this, getFragmentPathFromRelation( aIt->second ) ) ); + { + OUString aFragmentPath = getFragmentPathFromRelation( aIt->second ); + uno::Reference<io::XInputStream> xStream = rHelper.getBaseFilter().openInputStream(aFragmentPath); + uno::Sequence<sal_Int8> aData(8000); + sal_Int32 nRead = 0; + OStringBuffer aString; + do { + nRead = xStream->readBytes(aData, 8000); + aString.append(OString((char*) aData.getConstArray(), nRead)); + } while(nRead == 8000); + ScOrcusTable aTable(getSheetIndex()); + orcus::import_xlsx::read_table(aString.getStr(), aString.getLength(), &aTable); + } // import comments related to this worksheet OUString aCommentsFragmentPath = getFragmentPathFromFirstTypeFromOfficeDoc( "comments" ); commit 55ea8f5da96ad9765002ace388312620b3af1b2f Author: Markus Mohrhard <[email protected]> Date: Mon Aug 18 01:36:43 2014 +0200 make these types future proof Our core already supports more than 32k sheets and we should not use sal_Int16 anymore for sheets. Change-Id: Ifeb321cba044b255ef2e7d34da0908c27877d6ae diff --git a/sc/source/filter/inc/worksheethelper.hxx b/sc/source/filter/inc/worksheethelper.hxx index 37179bb..ab12261 100644 --- a/sc/source/filter/inc/worksheethelper.hxx +++ b/sc/source/filter/inc/worksheethelper.hxx @@ -191,7 +191,7 @@ public: /** Returns the type of this sheet. */ WorksheetType getSheetType() const; /** Returns the index of the current sheet. */ - sal_Int16 getSheetIndex() const; + sal_Int32 getSheetIndex() const; /** Returns the XSpreadsheet interface of the current sheet. */ const ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XSpreadsheet >& getSheet() const; diff --git a/sc/source/filter/oox/worksheethelper.cxx b/sc/source/filter/oox/worksheethelper.cxx index 4417bbe..4c02759 100644 --- a/sc/source/filter/oox/worksheethelper.cxx +++ b/sc/source/filter/oox/worksheethelper.cxx @@ -217,7 +217,7 @@ public: /** Returns the type of this sheet. */ inline WorksheetType getSheetType() const { return meSheetType; } /** Returns the index of the current sheet. */ - inline sal_Int16 getSheetIndex() const { return maUsedArea.Sheet; } + inline sal_Int32 getSheetIndex() const { return maUsedArea.Sheet; } /** Returns the XSpreadsheet interface of the current sheet. */ inline const Reference< XSpreadsheet >& getSheet() const { return mxSheet; } @@ -1380,7 +1380,7 @@ WorksheetType WorksheetHelper::getSheetType() const return mrSheetGlob.getSheetType(); } -sal_Int16 WorksheetHelper::getSheetIndex() const +sal_Int32 WorksheetHelper::getSheetIndex() const { return mrSheetGlob.getSheetIndex(); } commit dab14c9e3b2387dce32a4b12fbc3ab27f8bc2595 Author: Markus Mohrhard <[email protected]> Date: Mon Aug 18 00:16:03 2014 +0200 implement orcus::spreadsheet::iface::import_table interface Just some stubs to check that it is working. Change-Id: I24e61cd24030ca5adeb07222fd63464d836ecb3d diff --git a/sc/source/filter/inc/orcusinterface.hxx b/sc/source/filter/inc/orcusinterface.hxx index 49d435b..8c089bb 100644 --- a/sc/source/filter/inc/orcusinterface.hxx +++ b/sc/source/filter/inc/orcusinterface.hxx @@ -278,5 +278,43 @@ public: void setStatusIndicator(const com::sun::star::uno::Reference<com::sun::star::task::XStatusIndicator>& rIndicator); }; +class ScOrcusTable : public orcus::spreadsheet::iface::import_table +{ +private: + SCTAB mnTab; + +public: + ScOrcusTable(SCTAB nTab); + virtual ~ScOrcusTable(); + + virtual orcus::spreadsheet::iface::import_auto_filter* get_auto_filter() SAL_OVERRIDE; + + virtual void set_identifier(size_t id) SAL_OVERRIDE; + + virtual void set_range(const char* p_ref, size_t n_ref) SAL_OVERRIDE; + + virtual void set_totals_row_count(size_t row_count) SAL_OVERRIDE; + + virtual void set_name(const char* p, size_t n) SAL_OVERRIDE; + + virtual void set_display_name(const char* p, size_t n) SAL_OVERRIDE; + + virtual void set_column_count(size_t n) SAL_OVERRIDE; + + virtual void set_column_identifier(size_t id) SAL_OVERRIDE; + virtual void set_column_name(const char* p, size_t n) SAL_OVERRIDE; + virtual void set_column_totals_row_label(const char* p, size_t n) SAL_OVERRIDE; + virtual void set_column_totals_row_function(orcus::spreadsheet::totals_row_function_t func) SAL_OVERRIDE; + virtual void commit_column() SAL_OVERRIDE; + + virtual void set_style_name(const char* p, size_t n) SAL_OVERRIDE; + virtual void set_style_show_first_column(bool b) SAL_OVERRIDE; + virtual void set_style_show_last_column(bool b) SAL_OVERRIDE; + virtual void set_style_show_row_stripes(bool b) SAL_OVERRIDE; + virtual void set_style_show_column_stripes(bool b) SAL_OVERRIDE; + + virtual void commit() SAL_OVERRIDE; +}; + #endif /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/filter/orcus/interface.cxx b/sc/source/filter/orcus/interface.cxx index 31bbff1..f475327 100644 --- a/sc/source/filter/orcus/interface.cxx +++ b/sc/source/filter/orcus/interface.cxx @@ -698,4 +698,109 @@ void ScOrcusAutoFilter::commit() { } +ScOrcusTable::ScOrcusTable(SCTAB nTab): + mnTab(nTab) +{ +} + +ScOrcusTable::~ScOrcusTable() +{ +} + +os::iface::import_auto_filter* ScOrcusTable::get_auto_filter() +{ + return NULL; +} + +void ScOrcusTable::set_identifier(size_t id) +{ + SAL_INFO("sc.orcus.table", "set_identifier :" << id); +} + +void ScOrcusTable::set_range(const char* p_ref, size_t n_ref) +{ + OUString aRange(p_ref, n_ref, RTL_TEXTENCODING_UTF8); + SAL_INFO("sc.orcus.table", "set_range: " << aRange); +} + +void ScOrcusTable::set_totals_row_count(size_t row_count) +{ + SAL_INFO("sc.orcus.table", "set_totals_row_count: " << row_count); +} + +void ScOrcusTable::set_name(const char* p, size_t n) +{ + OUString aName(p, n, RTL_TEXTENCODING_UTF8); + SAL_INFO("sc.orcus.table", "set_name: " << aName); +} + +void ScOrcusTable::set_display_name(const char* p, size_t n) +{ + OUString aName(p, n, RTL_TEXTENCODING_UTF8); + SAL_INFO("sc.orcus.table", "set_display_name: " << aName); +} + +void ScOrcusTable::set_column_count(size_t n) +{ + SAL_INFO("sc.orcus.table", "set_column_count: " << n); +} + +void ScOrcusTable::set_column_identifier(size_t id) +{ + SAL_INFO("sc.orcus.table", "set_column_identifier: " << id); +} + +void ScOrcusTable::set_column_name(const char* p, size_t n) +{ + OUString aName(p, n, RTL_TEXTENCODING_UTF8); + SAL_INFO("sc.orcus.table", "set_column_name: " << aName); +} + +void ScOrcusTable::set_column_totals_row_label(const char* p, size_t n) +{ + OUString aLabel(p, n, RTL_TEXTENCODING_UTF8); + SAL_INFO("sc.orcus.table", "set_column_totals_row_label: " << aLabel); +} + +void ScOrcusTable::set_column_totals_row_function(os::totals_row_function_t ) +{ + SAL_INFO("sc.orcus.table", "set_column_totals_row_function"); +} + +void ScOrcusTable::commit_column() +{ + SAL_INFO("sc.orcus.table", "commit_column"); +} + +void ScOrcusTable::set_style_name(const char* p, size_t n) +{ + OUString aName(p, n, RTL_TEXTENCODING_UTF8); + SAL_INFO("sc.orcus.table", "set_style_name: " << aName); +} + +void ScOrcusTable::set_style_show_first_column(bool b) +{ + SAL_INFO("sc.orcus.table", "set_style_show_first_column: " << b); +} + +void ScOrcusTable::set_style_show_last_column(bool b) +{ + SAL_INFO("sc.orcus.table", "set_style_show_last_column: " << b); +} + +void ScOrcusTable::set_style_show_row_stripes(bool b) +{ + SAL_INFO("sc.orcus.table", "set_style_show_row_stripes: " << b); +} + +void ScOrcusTable::set_style_show_column_stripes(bool b) +{ + SAL_INFO("sc.orcus.table", "set_style_show_column_stripes: " << b); +} + +void ScOrcusTable::commit() +{ + SAL_INFO("sc.orcus.table", "commit"); +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ _______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
