diff options
| author | Mark Rogers <f4nt@f4ntasmic.com> | 2011-05-14 16:13:17 -0500 |
|---|---|---|
| committer | Mark Rogers <f4nt@f4ntasmic.com> | 2011-05-14 16:13:17 -0500 |
| commit | 420dd36ab8c4fa7a3f75b8da80ffc2effdf0029e (patch) | |
| tree | 000454f244f158e8c956b2bc1bab8bc5435de9f8 /tablib/formats/_ods.py | |
| parent | 9a05770899a5864e72727830da71a23b7203d050 (diff) | |
| download | tablib-420dd36ab8c4fa7a3f75b8da80ffc2effdf0029e.tar.gz | |
Tidied up a bit, renamed _odf to _ods like it should have been. Bold not working yet :(
Diffstat (limited to 'tablib/formats/_ods.py')
| -rw-r--r-- | tablib/formats/_ods.py | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/tablib/formats/_ods.py b/tablib/formats/_ods.py new file mode 100644 index 0000000..d4520c7 --- /dev/null +++ b/tablib/formats/_ods.py @@ -0,0 +1,108 @@ +# -*- 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.packages.odf.opendocument import OpenDocumentSpreadsheet +from tablib.packages.odf.style import Style, TextProperties, TableColumnProperties, Map +from tablib.packages.odf.number import NumberStyle, CurrencyStyle, CurrencySymbol, Number, Text +from tablib.packages.odf.text import P +from tablib.packages.odf.table import Table, TableColumn, TableRow, TableCell + +from tablib.compat import unicode + +title = 'ods' +extentions = ('ods',) + +bold = Style(name='Bold', family="text") +bold.addElement(TextProperties(fontweight="bold")) + +def export_set(dataset): + """Returns ODF representation of Dataset.""" + + wb = OpenDocumentSpreadsheet() + wb.automaticstyles.addElement(bold) + + ws = 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 = OpenDocumentSpreadsheet() + wb.automaticstyles.addElement(bold) + + for i, dset in enumerate(databook._datasets): + ws = 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 = TableRow(stylename=bold) + for j, col in enumerate(row): + ws.addElement(TableColumn()) + + # bold headers + if (row_number == 1) and dataset.headers: + odf_row.setAttribute('stylename', bold) + ws.addElement(odf_row) + cell = TableCell() + cell.addElement(P(stylename="Bold", text=unicode(col, errors='ignore'))) + odf_row.addElement(cell) + + # bold separators + elif len(row) < dataset.width: + ws.addElement(odf_row) + cell = TableCell() + cell.addElement(P(text=unicode(col, errors='ignore'))) + odf_row.addElement(cell) + + # wrap the rest + else: + try: + if '\n' in col: + ws.addElement(odf_row) + cell = TableCell() + cell.addElement(P(text=unicode(col, errors='ignore'))) + odf_row.addElement(cell) + else: + ws.addElement(odf_row) + cell = TableCell() + cell.addElement(P(text=unicode(col, errors='ignore'))) + odf_row.addElement(cell) + except TypeError: + ws.addElement(odf_row) + cell = TableCell() + cell.addElement(P(text=unicode(col, errors='ignore'))) + odf_row.addElement(cell) + + |
