Kaydet (Commit) 152c79ee authored tarafından Kohei Yoshida's avatar Kohei Yoshida Kaydeden (comit) Kohei Yoshida

Initial step on enabling the orcus-based Excel 2003 XML filter.

Still some work remains in the orcus interface implementation code
in sc.

Change-Id: Idc4d95b489e8e55fbe3593557399610abe6c4ae0
Reviewed-on: https://gerrit.libreoffice.org/46655Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarKohei Yoshida <libreoffice@kohei.us>
üst 99210a14
......@@ -509,6 +509,7 @@ $(eval $(call filter_Configuration_add_filters,fcfg_langpack,fcfg_calc_filters.x
MS_Excel_95_Vorlage_Template \
MS_Excel_97 \
MS_Excel_97_Vorlage_Template \
MS_Excel_2003_XML_Orcus \
Rich_Text_Format__StarCalc_ \
SYLK \
StarOffice_XML__Calc_ \
......
......@@ -16,7 +16,7 @@
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
-->
<node oor:name="MS Excel 2003 XML" oor:op="replace">
<prop oor:name="Flags"><value>IMPORT EXPORT ALIEN 3RDPARTYFILTER</value></prop>
<prop oor:name="Flags"><value>EXPORT ALIEN 3RDPARTYFILTER</value></prop>
<prop oor:name="UIComponent"/>
<prop oor:name="FilterService"><value>com.sun.star.comp.Writer.XmlFilterAdaptor</value></prop>
<prop oor:name="UserData"><value oor:separator=",">com.sun.star.documentconversion.XSLTFilter,,com.sun.star.comp.Calc.XMLOasisImporter,com.sun.star.comp.Calc.XMLOasisExporter,../$(share_subdir_name)/xslt/import/spreadsheetml/spreadsheetml2ooo.xsl,../$(share_subdir_name)/xslt/export/spreadsheetml/ooo2spreadsheetml.xsl</value></prop>
......
<!--
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
-->
<node oor:name="MS Excel 2003 XML Orcus" oor:op="replace">
<prop oor:name="Flags"><value>IMPORT ALIEN PREFERRED</value></prop>
<prop oor:name="UIComponent"/>
<prop oor:name="FilterService"/>
<prop oor:name="UserData"/>
<prop oor:name="Type"><value>calc_MS_Excel_2003_XML</value></prop>
<prop oor:name="TemplateName"/>
<prop oor:name="DocumentService"><value>com.sun.star.sheet.SpreadsheetDocument</value></prop>
<prop oor:name="UIName">
<value xml:lang="en-US">Microsoft Excel 2003 XML</value>
</prop>
</node>
......@@ -16,12 +16,12 @@
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
-->
<node oor:name="calc_MS_Excel_2003_XML" oor:op="replace">
<prop oor:name="DetectService"><value>com.sun.star.comp.filters.XMLFilterDetect</value></prop>
<prop oor:name="DetectService"><value>com.sun.star.comp.sc.OrcusFilterDetect</value></prop>
<prop oor:name="URLPattern"/>
<prop oor:name="Extensions"><value>xml xls</value></prop>
<prop oor:name="MediaType"/>
<prop oor:name="Preferred"><value>false</value></prop>
<prop oor:name="PreferredFilter"><value>MS Excel 2003 XML</value></prop>
<prop oor:name="PreferredFilter"/>
<prop oor:name="UIName">
<value xml:lang="en-US">Microsoft Excel 2003 XML</value>
</prop>
......
......@@ -31,6 +31,8 @@ public:
virtual bool importGnumeric(ScDocument& rDoc, SfxMedium& rMedium) const = 0;
virtual bool importExcel2003XML(ScDocument& rDoc, SfxMedium& rMedium) const = 0;
virtual bool importXLSX(ScDocument& rDoc, SfxMedium& rMedium) const = 0;
virtual bool importODS(ScDocument& rDoc, SfxMedium& rMedium) const = 0;
......
......@@ -21,6 +21,7 @@ public:
virtual bool importCSV(ScDocument& rDoc, SfxMedium& rMedium) const override;
virtual bool importGnumeric(ScDocument& rDoc, SfxMedium& rMedium) const override;
virtual bool importExcel2003XML(ScDocument& rDoc, SfxMedium& rMedium) const override;
virtual bool importXLSX(ScDocument& rDoc, SfxMedium& rMedium) const override;
virtual bool importODS(ScDocument& rDoc, SfxMedium& rMedium) const override;
......
......@@ -80,8 +80,16 @@ OUString OrcusFormatDetect::detect(css::uno::Sequence<css::beans::PropertyValue>
}
orcus::format_t eFormat = orcus::detect(reinterpret_cast<const unsigned char*>(aContent.getStr()), aContent.getLength());
if (eFormat == orcus::format_t::gnumeric)
return OUString("Gnumeric XML");
switch (eFormat)
{
case orcus::format_t::gnumeric:
return OUString("Gnumeric XML");
case orcus::format_t::xls_xml:
return OUString("calc_MS_Excel_2003_XML");
default:
;
}
return OUString();
}
......
......@@ -25,6 +25,7 @@
#include <orcus/orcus_csv.hpp>
#include <orcus/orcus_gnumeric.hpp>
#include <orcus/orcus_xlsx.hpp>
#include <orcus/orcus_xls_xml.hpp>
#include <orcus/orcus_ods.hpp>
#include <orcus/orcus_import_ods.hpp>
#include <orcus/global.hpp>
......@@ -115,6 +116,38 @@ bool ScOrcusFiltersImpl::importGnumeric(ScDocument& rDoc, SfxMedium& rMedium) co
return true;
}
bool ScOrcusFiltersImpl::importExcel2003XML(ScDocument& rDoc, SfxMedium& rMedium) const
{
ScOrcusFactory aFactory(rDoc);
aFactory.setStatusIndicator(getStatusIndicator(rMedium));
SvStream* pStream = rMedium.GetInStream();
pStream->Seek(0);
static const size_t nReadBuffer = 1024*32;
OStringBuffer aBuffer((int(nReadBuffer)));
size_t nRead = 0;
do
{
char pData[nReadBuffer];
nRead = pStream->ReadBytes(pData, nReadBuffer);
aBuffer.append(static_cast<sal_Char*>(pData), nRead);
}
while (nRead == nReadBuffer);
try
{
rDoc.ClearTabs();
orcus::orcus_xls_xml filter(&aFactory);
filter.read_stream(aBuffer.getStr(), aBuffer.getLength());
}
catch (const std::exception& e)
{
SAL_WARN("sc", "Unable to load Excel 2003 XML file! " << e.what());
return false;
}
return true;
}
bool ScOrcusFiltersImpl::importXLSX(ScDocument& rDoc, SfxMedium& rMedium) const
{
ScOrcusFactory aFactory(rDoc);
......
......@@ -1169,6 +1169,14 @@ bool ScDocShell::ConvertFrom( SfxMedium& rMedium )
bRet = pOrcus->importGnumeric(aDocument, rMedium);
}
else if (aFltName == "MS Excel 2003 XML Orcus")
{
ScOrcusFilters* pOrcus = ScFormatFilter::Get().GetOrcusFilters();
if (!pOrcus)
return false;
bRet = pOrcus->importExcel2003XML(aDocument, rMedium);
}
else if (aFltName == pFilterAscii)
{
SfxItemSet* pSet = rMedium.GetItemSet();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment