diff options
author | Kohei Yoshida <kohei.yoshida@gmail.com> | 2013-04-09 15:36:03 -0400 |
---|---|---|
committer | Kohei Yoshida <kohei.yoshida@gmail.com> | 2013-04-13 01:54:35 -0400 |
commit | 0552a09b95010d0f622688c2508a0684803a3fa5 (patch) | |
tree | 7bc34a9a805cddd9686a3ff5614ca92771cf05c2 /sc/source | |
parent | 938d2f9502359f696b0680f249c8e644cd1caba0 (diff) |
Manage to use orcus to import ods, xlsx, and csv.
But this occasionally crashes.
Change-Id: I0a18d0e210639b43b89b966a54de541b9a43e329
Diffstat (limited to 'sc/source')
-rw-r--r-- | sc/source/filter/inc/orcusfiltersimpl.hxx | 2 | ||||
-rw-r--r-- | sc/source/filter/orcus/orcusfiltersimpl.cxx | 42 | ||||
-rw-r--r-- | sc/source/ui/docshell/docsh.cxx | 31 | ||||
-rw-r--r-- | sc/source/ui/inc/docsh.hxx | 2 |
4 files changed, 72 insertions, 5 deletions
diff --git a/sc/source/filter/inc/orcusfiltersimpl.hxx b/sc/source/filter/inc/orcusfiltersimpl.hxx index de5f988f03dc..e07cd19d39e1 100644 --- a/sc/source/filter/inc/orcusfiltersimpl.hxx +++ b/sc/source/filter/inc/orcusfiltersimpl.hxx @@ -22,6 +22,8 @@ public: virtual bool importCSV(ScDocument& rDoc, const OUString& rPath) const; virtual bool importGnumeric(ScDocument& rDoc, const OUString& rPath) const; + virtual bool importXLSX(ScDocument& rDoc, const OUString& rPath) const; + virtual bool importODS(ScDocument& rDoc, const OUString& rPath) const; virtual ScOrcusXMLContext* createXMLContext(ScDocument& rDoc, const OUString& rPath) const; }; diff --git a/sc/source/filter/orcus/orcusfiltersimpl.cxx b/sc/source/filter/orcus/orcusfiltersimpl.cxx index e74a5e421891..7ef1310c4793 100644 --- a/sc/source/filter/orcus/orcusfiltersimpl.cxx +++ b/sc/source/filter/orcus/orcusfiltersimpl.cxx @@ -17,6 +17,8 @@ #include <orcus/spreadsheet/import_interface.hpp> #include <orcus/orcus_csv.hpp> #include <orcus/orcus_gnumeric.hpp> +#include <orcus/orcus_xlsx.hpp> +#include <orcus/orcus_ods.hpp> #include <orcus/global.hpp> #ifdef WNT @@ -71,6 +73,46 @@ bool ScOrcusFiltersImpl::importGnumeric(ScDocument& rDoc, const OUString& rPath) return true; } +bool ScOrcusFiltersImpl::importXLSX(ScDocument& rDoc, const OUString& rPath) const +{ + ScOrcusFactory aFactory(rDoc); + OString aSysPath = toSystemPath(rPath); + const char* path = aSysPath.getStr(); + + try + { + orcus::orcus_xlsx filter(&aFactory); + filter.read_file(path); + } + catch (const std::exception& e) + { + SAL_WARN("sc", "Unable to load xlsx file! " << e.what()); + return false; + } + + return true; +} + +bool ScOrcusFiltersImpl::importODS(ScDocument& rDoc, const OUString& rPath) const +{ + ScOrcusFactory aFactory(rDoc); + OString aSysPath = toSystemPath(rPath); + const char* path = aSysPath.getStr(); + + try + { + orcus::orcus_ods filter(&aFactory); + filter.read_file(path); + } + catch (const std::exception& e) + { + SAL_WARN("sc", "Unable to load ods file! " << e.what()); + return false; + } + + return true; +} + ScOrcusXMLContext* ScOrcusFiltersImpl::createXMLContext(ScDocument& rDoc, const OUString& rPath) const { return new ScOrcusXMLContextImpl(rDoc, rPath); diff --git a/sc/source/ui/docshell/docsh.cxx b/sc/source/ui/docshell/docsh.cxx index 16942554d809..0cc10bdd9db6 100644 --- a/sc/source/ui/docshell/docsh.cxx +++ b/sc/source/ui/docshell/docsh.cxx @@ -1493,16 +1493,39 @@ sal_Bool ScDocShell::ConvertFrom( SfxMedium& rMedium ) return bRet; } -bool ScDocShell::LoadExternal(SfxMedium& rMed, const OUString& rProvider) +bool ScDocShell::LoadExternal( SfxMedium& rMed ) { - if (rProvider == "orcus") + const SfxFilter* pFilter = rMed.GetFilter(); + if (!pFilter) + return false; + + if (pFilter->GetProviderName() == "orcus") { ScOrcusFilters* pOrcus = ScFormatFilter::Get().GetOrcusFilters(); if (!pOrcus) return false; - if (!pOrcus->importGnumeric(aDocument, rMed.GetName())) - return false; + const OUString& rFilterName = pFilter->GetName(); + if (rFilterName == "gnumeric") + { + if (!pOrcus->importGnumeric(aDocument, rMed.GetName())) + return false; + } + else if (rFilterName == "csv") + { + if (!pOrcus->importCSV(aDocument, rMed.GetName())) + return false; + } + else if (rFilterName == "xlsx") + { + if (!pOrcus->importXLSX(aDocument, rMed.GetName())) + return false; + } + else if (rFilterName == "ods") + { + if (!pOrcus->importODS(aDocument, rMed.GetName())) + return false; + } FinishedLoading(SFX_LOADED_MAINDOCUMENT | SFX_LOADED_IMAGES); return true; diff --git a/sc/source/ui/inc/docsh.hxx b/sc/source/ui/inc/docsh.hxx index a26a234f3a83..d761f7f46fba 100644 --- a/sc/source/ui/inc/docsh.hxx +++ b/sc/source/ui/inc/docsh.hxx @@ -201,7 +201,7 @@ public: virtual sal_Bool Load( SfxMedium& rMedium ); virtual sal_Bool LoadFrom( SfxMedium& rMedium ); virtual sal_Bool ConvertFrom( SfxMedium &rMedium ); - virtual bool LoadExternal(SfxMedium& rMedium, const OUString& rProvider); + virtual bool LoadExternal( SfxMedium& rMedium ); virtual sal_Bool Save(); virtual sal_Bool SaveAs( SfxMedium& rMedium ); virtual sal_Bool ConvertTo( SfxMedium &rMedium ); |