summaryrefslogtreecommitdiff
path: root/sc
diff options
context:
space:
mode:
authorKohei Yoshida <kohei.yoshida@gmail.com>2013-04-09 15:36:03 -0400
committerKohei Yoshida <kohei.yoshida@gmail.com>2013-04-13 01:54:35 -0400
commit0552a09b95010d0f622688c2508a0684803a3fa5 (patch)
tree7bc34a9a805cddd9686a3ff5614ca92771cf05c2 /sc
parent938d2f9502359f696b0680f249c8e644cd1caba0 (diff)
Manage to use orcus to import ods, xlsx, and csv.
But this occasionally crashes. Change-Id: I0a18d0e210639b43b89b966a54de541b9a43e329
Diffstat (limited to 'sc')
-rw-r--r--sc/inc/orcusfilters.hxx4
-rw-r--r--sc/source/filter/inc/orcusfiltersimpl.hxx2
-rw-r--r--sc/source/filter/orcus/orcusfiltersimpl.cxx42
-rw-r--r--sc/source/ui/docshell/docsh.cxx31
-rw-r--r--sc/source/ui/inc/docsh.hxx2
5 files changed, 76 insertions, 5 deletions
diff --git a/sc/inc/orcusfilters.hxx b/sc/inc/orcusfilters.hxx
index ef88795432f3..ab09d8cdb680 100644
--- a/sc/inc/orcusfilters.hxx
+++ b/sc/inc/orcusfilters.hxx
@@ -30,6 +30,10 @@ public:
virtual bool importGnumeric(ScDocument& rDoc, const OUString& rPath) const = 0;
+ virtual bool importXLSX(ScDocument& rDoc, const OUString& rPath) const = 0;
+
+ virtual bool importODS(ScDocument& rDoc, const OUString& rPath) const = 0;
+
/**
* Create a context for XML file. The context object stores session
* information for each unique XML file. You must create a new context
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 );