summaryrefslogtreecommitdiff
path: root/sc
diff options
context:
space:
mode:
authorMarkus Mohrhard <markus.mohrhard@googlemail.com>2012-11-29 13:59:43 +0100
committerMarkus Mohrhard <markus.mohrhard@googlemail.com>2012-12-02 06:14:04 +0100
commit8c4719fd489ab70d5ae77e5f257254ef653a1f25 (patch)
treeebfb7b1e1c8fbc89c7dc9d618b81ef0fb2764f44 /sc
parent2291423c5e37c0c6de177880384b119dcad2b261 (diff)
support shared strings enough for gnumeric import
Change-Id: I1cedf79d0465e8b8e4b8e85bea65bd35174e51a2
Diffstat (limited to 'sc')
-rw-r--r--sc/source/filter/inc/orcusinterface.hxx23
-rw-r--r--sc/source/filter/orcus/interface.cxx101
2 files changed, 113 insertions, 11 deletions
diff --git a/sc/source/filter/inc/orcusinterface.hxx b/sc/source/filter/inc/orcusinterface.hxx
index e2c9c087f6fa..6bf3311c61e5 100644
--- a/sc/source/filter/inc/orcusinterface.hxx
+++ b/sc/source/filter/inc/orcusinterface.hxx
@@ -20,10 +20,30 @@
class ScDocument;
class ScOrcusSheet;
+class ScOrcusSharedStrings : public orcus::spreadsheet::iface::import_shared_strings
+{
+ std::vector<OUString> maSharedStrings;
+
+public:
+ virtual size_t append(const char* s, size_t n);
+ virtual size_t add(const char* s, size_t n);
+
+ virtual void set_segment_bold(bool b);
+ virtual void set_segment_italic(bool b);
+ virtual void set_segment_font_name(const char* s, size_t n);
+ virtual void set_segment_font_size(double point);
+ virtual void append_segment(const char* s, size_t n);
+
+ virtual size_t commit_segments();
+
+ const OUString& getByIndex(size_t index) const;
+};
+
class ScOrcusFactory : public orcus::spreadsheet::iface::import_factory
{
ScDocument& mrDoc;
boost::ptr_vector<ScOrcusSheet> maSheets;
+ ScOrcusSharedStrings maSharedStrings;
public:
ScOrcusFactory(ScDocument& rDoc);
@@ -38,8 +58,9 @@ class ScOrcusSheet : public orcus::spreadsheet::iface::import_sheet
{
ScDocument& mrDoc;
SCTAB mnTab;
+ ScOrcusSharedStrings& mrSharedStrings;
public:
- ScOrcusSheet(ScDocument& rDoc, SCTAB nTab);
+ ScOrcusSheet(ScDocument& rDoc, SCTAB nTab, ScOrcusSharedStrings& rSharedStrings);
// Orcus import interface
virtual void set_auto(orcus::spreadsheet::row_t row, orcus::spreadsheet::col_t col, const char* p, size_t n);
diff --git a/sc/source/filter/orcus/interface.cxx b/sc/source/filter/orcus/interface.cxx
index d22c20844d36..52072ad1987c 100644
--- a/sc/source/filter/orcus/interface.cxx
+++ b/sc/source/filter/orcus/interface.cxx
@@ -10,6 +10,7 @@
#include "orcusinterface.hxx"
#include "document.hxx"
+#include "cell.hxx"
using orcus::spreadsheet::row_t;
using orcus::spreadsheet::col_t;
@@ -24,7 +25,7 @@ orcus::spreadsheet::iface::import_sheet* ScOrcusFactory::append_sheet(const char
return NULL;
SCTAB nTab = mrDoc.GetTableCount() - 1;
- maSheets.push_back(new ScOrcusSheet(mrDoc, nTab));
+ maSheets.push_back(new ScOrcusSheet(mrDoc, nTab, maSharedStrings));
return &maSheets.back();
}
@@ -56,14 +57,13 @@ orcus::spreadsheet::iface::import_sheet* ScOrcusFactory::get_sheet(const char* s
return &(*it);
// Create a new orcus sheet instance for this.
- maSheets.push_back(new ScOrcusSheet(mrDoc, nTab));
+ maSheets.push_back(new ScOrcusSheet(mrDoc, nTab, maSharedStrings));
return &maSheets.back();
}
orcus::spreadsheet::iface::import_shared_strings* ScOrcusFactory::get_shared_strings()
{
- // We don't support it yet.
- return NULL;
+ return &maSharedStrings;
}
orcus::spreadsheet::iface::import_styles* ScOrcusFactory::get_styles()
@@ -72,8 +72,8 @@ orcus::spreadsheet::iface::import_styles* ScOrcusFactory::get_styles()
return NULL;
}
-ScOrcusSheet::ScOrcusSheet(ScDocument& rDoc, SCTAB nTab) :
- mrDoc(rDoc), mnTab(nTab) {}
+ScOrcusSheet::ScOrcusSheet(ScDocument& rDoc, SCTAB nTab, ScOrcusSharedStrings& rSharedStrings) :
+ mrDoc(rDoc), mnTab(nTab), mrSharedStrings(rSharedStrings) {}
void ScOrcusSheet::set_auto(row_t row, col_t col, const char* p, size_t n)
{
@@ -86,12 +86,40 @@ void ScOrcusSheet::set_format(row_t /*row*/, col_t /*col*/, size_t /*xf_index*/)
}
void ScOrcusSheet::set_formula(
- row_t /*row*/, col_t /*col*/, formula_grammar_t /*grammar*/, const char* /*p*/, size_t /*n*/)
+ row_t row, col_t col, formula_grammar_t grammar, const char* p, size_t n)
{
+ OUString aFormula(p, n, RTL_TEXTENCODING_UTF8);
+ formula::FormulaGrammar::Grammar eGrammar;
+ switch(grammar)
+ {
+ case orcus::spreadsheet::ods:
+ eGrammar = formula::FormulaGrammar::GRAM_ODFF;
+ break;
+ case orcus::spreadsheet::xlsx_2007:
+ case orcus::spreadsheet::xlsx_2010:
+ eGrammar = formula::FormulaGrammar::GRAM_ENGLISH_XL_A1;
+ break;
+ case orcus::spreadsheet::gnumeric:
+ eGrammar = formula::FormulaGrammar::GRAM_ENGLISH_XL_A1;
+ break;
+ }
+
+ ScFormulaCell* pCell = new ScFormulaCell(&mrDoc, ScAddress(col, row, mnTab), aFormula, eGrammar);
+ mrDoc.PutCell(col, row, mnTab, pCell);
}
-void ScOrcusSheet::set_formula_result(row_t /*row*/, col_t /*col*/, const char* /*p*/, size_t /*n*/)
+void ScOrcusSheet::set_formula_result(row_t row, col_t col, const char* p, size_t n)
{
+ ScBaseCell* pCell;
+ mrDoc.GetCell( col, row, mnTab, pCell );
+ if(!pCell || pCell->GetCellType() != CELLTYPE_FORMULA)
+ {
+ SAL_WARN("sc", "trying to set formula result for non formula \
+ cell! Col: " << col << ";Row: " << row << ";Tab: " << mnTab);
+ return;
+ }
+ OUString aResult( p, n, RTL_TEXTENCODING_UTF8);
+ static_cast<ScFormulaCell*>(pCell)->SetHybridString(aResult);
}
void ScOrcusSheet::set_shared_formula(
@@ -110,12 +138,65 @@ void ScOrcusSheet::set_shared_formula(row_t /*row*/, col_t /*col*/, size_t /*sin
{
}
-void ScOrcusSheet::set_string(row_t /*row*/, col_t /*col*/, size_t /*sindex*/)
+void ScOrcusSheet::set_string(row_t row, col_t col, size_t sindex)
+{
+ // Calc does not yet support shared strings so we have to
+ // workaround by importing shared strings into a temporary
+ // shared string container and writing into calc model as
+ // normal string
+
+ const OUString& rSharedString = mrSharedStrings.getByIndex(sindex);
+ ScBaseCell* pCell = ScBaseCell::CreateTextCell( rSharedString, &mrDoc );
+ mrDoc.PutCell(col, row, mnTab, pCell);
+}
+
+void ScOrcusSheet::set_value(row_t row, col_t col, double value)
+{
+ mrDoc.SetValue( col, row, mnTab, value );
+}
+
+size_t ScOrcusSharedStrings::append(const char* s, size_t n)
+{
+ OUString aNewString(s, n, RTL_TEXTENCODING_UTF8);
+ maSharedStrings.push_back(aNewString);
+
+ return maSharedStrings.size() - 1;
+}
+
+size_t ScOrcusSharedStrings::add(const char* s, size_t n)
+{
+ OUString aNewString(s, n, RTL_TEXTENCODING_UTF8);
+ maSharedStrings.push_back(aNewString);
+
+ return maSharedStrings.size() - 1;
+}
+
+const OUString& ScOrcusSharedStrings::getByIndex(size_t nIndex) const
{
+ if(nIndex < maSharedStrings.size())
+ return maSharedStrings[nIndex];
+
+ throw std::exception();
}
-void ScOrcusSheet::set_value(row_t /*row*/, col_t /*col*/, double /*value*/)
+void ScOrcusSharedStrings::set_segment_bold(bool /*b*/)
+{
+}
+void ScOrcusSharedStrings::set_segment_italic(bool /*b*/)
+{
+}
+void ScOrcusSharedStrings::set_segment_font_name(const char* /*s*/, size_t /*n*/)
+{
+}
+void ScOrcusSharedStrings::set_segment_font_size(double /*point*/)
+{
+}
+void ScOrcusSharedStrings::append_segment(const char* /*s*/, size_t /*n*/)
{
}
+size_t ScOrcusSharedStrings::commit_segments()
+{
+ return 0;
+}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */