diff options
author | Markus Mohrhard <markus.mohrhard@googlemail.com> | 2012-11-29 13:59:43 +0100 |
---|---|---|
committer | Markus Mohrhard <markus.mohrhard@googlemail.com> | 2012-12-02 06:14:04 +0100 |
commit | 8c4719fd489ab70d5ae77e5f257254ef653a1f25 (patch) | |
tree | ebfb7b1e1c8fbc89c7dc9d618b81ef0fb2764f44 /sc | |
parent | 2291423c5e37c0c6de177880384b119dcad2b261 (diff) |
support shared strings enough for gnumeric import
Change-Id: I1cedf79d0465e8b8e4b8e85bea65bd35174e51a2
Diffstat (limited to 'sc')
-rw-r--r-- | sc/source/filter/inc/orcusinterface.hxx | 23 | ||||
-rw-r--r-- | sc/source/filter/orcus/interface.cxx | 101 |
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: */ |