diff options
| author | Kenneth Reitz <me@kennethreitz.com> | 2011-05-22 14:07:17 -0400 |
|---|---|---|
| committer | Kenneth Reitz <me@kennethreitz.com> | 2011-05-22 14:07:17 -0400 |
| commit | 87e65fd3e77f21efc9efc4ab367611702fcd3cfe (patch) | |
| tree | 51d5236072bbfa8907d607331de42f05860d6a05 /tablib/formats | |
| parent | ffbc3b122d7db7740d070112aec023cbbf663f4e (diff) | |
| parent | cceb41af98afe11ef04e1c9b187e70af293c94d0 (diff) | |
| download | tablib-87e65fd3e77f21efc9efc4ab367611702fcd3cfe.tar.gz | |
Merge pull request #14 from f4nt/tablib
---
This should provide basic support for OpenDocument spreadsheets. I didnt have py2.7 installed to test with in tox, but 2.5, 2.6, and py3k passed all tests with tox for me. Lemme know if you see any issues I may have glossed over.
Conflicts:
tablib/compat.py
Diffstat (limited to 'tablib/formats')
| -rw-r--r-- | tablib/formats/__init__.py | 3 | ||||
| -rw-r--r-- | tablib/formats/_ods.py | 100 |
2 files changed, 102 insertions, 1 deletions
diff --git a/tablib/formats/__init__.py b/tablib/formats/__init__.py index 306ca30..5fdf279 100644 --- a/tablib/formats/__init__.py +++ b/tablib/formats/__init__.py @@ -10,5 +10,6 @@ from . import _yaml as yaml from . import _tsv as tsv from . import _html as html from . import _xlsx as xlsx +from . import _ods as ods -available = (json, xls, yaml, csv, tsv, html, xlsx) +available = (json, xls, yaml, csv, tsv, html, xlsx, ods) diff --git a/tablib/formats/_ods.py b/tablib/formats/_ods.py new file mode 100644 index 0000000..d8c4f8b --- /dev/null +++ b/tablib/formats/_ods.py @@ -0,0 +1,100 @@ +# -*- coding: utf-8 -*- + +""" Tablib - ODF Support. +""" + +import sys + + +if sys.version_info[0] > 2: + from io import BytesIO +else: + from cStringIO import StringIO as BytesIO + +from tablib.compat import opendocument, style, table, text, unicode + +title = 'ods' +extentions = ('ods',) + +bold = style.Style(name="bold", family="paragraph") +bold.addElement(style.TextProperties(fontweight="bold", fontweightasian="bold", fontweightcomplex="bold")) + +def export_set(dataset): + """Returns ODF representation of Dataset.""" + + wb = opendocument.OpenDocumentSpreadsheet() + wb.automaticstyles.addElement(bold) + + ws = table.Table(name=dataset.title if dataset.title else 'Tablib Dataset') + wb.spreadsheet.addElement(ws) + dset_sheet(dataset, ws) + + stream = BytesIO() + wb.save(stream) + return stream.getvalue() + + +def export_book(databook): + """Returns ODF representation of DataBook.""" + + wb = opendocument.OpenDocumentSpreadsheet() + wb.automaticstyles.addElement(bold) + + for i, dset in enumerate(databook._datasets): + ws = table.Table(name=dset.title if dset.title else 'Sheet%s' % (i)) + wb.spreadsheet.addElement(ws) + dset_sheet(dset, ws) + + + stream = BytesIO() + wb.save(stream) + return stream.getvalue() + + +def dset_sheet(dataset, ws): + """Completes given worksheet from given Dataset.""" + _package = dataset._package(dicts=False) + + for i, sep in enumerate(dataset._separators): + _offset = i + _package.insert((sep[0] + _offset), (sep[1],)) + + for i, row in enumerate(_package): + row_number = i + 1 + odf_row = table.TableRow(stylename=bold, defaultcellstylename='bold') + for j, col in enumerate(row): + try: + col = unicode(col, errors='ignore') + except TypeError: + ## col is already unicode + pass + ws.addElement(table.TableColumn()) + + # bold headers + if (row_number == 1) and dataset.headers: + odf_row.setAttribute('stylename', bold) + ws.addElement(odf_row) + cell = table.TableCell() + p = text.P() + p.addElement(text.Span(text=col, stylename=bold)) + cell.addElement(p) + odf_row.addElement(cell) + + # wrap the rest + else: + try: + if '\n' in col: + ws.addElement(odf_row) + cell = table.TableCell() + cell.addElement(text.P(text=col)) + odf_row.addElement(cell) + else: + ws.addElement(odf_row) + cell = table.TableCell() + cell.addElement(text.P(text=col)) + odf_row.addElement(cell) + except TypeError: + ws.addElement(odf_row) + cell = table.TableCell() + cell.addElement(text.P(text=col)) + odf_row.addElement(cell)
\ No newline at end of file |
