From 420dd36ab8c4fa7a3f75b8da80ffc2effdf0029e Mon Sep 17 00:00:00 2001 From: Mark Rogers Date: Sat, 14 May 2011 16:13:17 -0500 Subject: Tidied up a bit, renamed _odf to _ods like it should have been. Bold not working yet :( --- tablib/core.py | 2 +- tablib/formats/__init__.py | 4 +- tablib/formats/_odf.py | 118 --------------------------------------------- tablib/formats/_ods.py | 108 +++++++++++++++++++++++++++++++++++++++++ test_tablib.py | 2 + 5 files changed, 113 insertions(+), 121 deletions(-) delete mode 100644 tablib/formats/_odf.py create mode 100644 tablib/formats/_ods.py diff --git a/tablib/core.py b/tablib/core.py index e8e17ce..678e515 100644 --- a/tablib/core.py +++ b/tablib/core.py @@ -402,7 +402,7 @@ class Dataset(object): pass @property - def odf(): + def ods(): """An Excel Spreadsheet representation of the :class:`Dataset` object, with :ref:`separators`. Cannot be set. .. admonition:: Binary Warning diff --git a/tablib/formats/__init__.py b/tablib/formats/__init__.py index 58199a3..5fdf279 100644 --- a/tablib/formats/__init__.py +++ b/tablib/formats/__init__.py @@ -10,6 +10,6 @@ from . import _yaml as yaml from . import _tsv as tsv from . import _html as html from . import _xlsx as xlsx -from . import _odf as odf +from . import _ods as ods -available = (json, xls, yaml, csv, tsv, html, xlsx, odf) +available = (json, xls, yaml, csv, tsv, html, xlsx, ods) diff --git a/tablib/formats/_odf.py b/tablib/formats/_odf.py deleted file mode 100644 index 4dafab4..0000000 --- a/tablib/formats/_odf.py +++ /dev/null @@ -1,118 +0,0 @@ -# -*- 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 openpyxl - -from odf.opendocument import OpenDocumentSpreadsheet -from odf.style import Style, TextProperties, TableColumnProperties, Map -from odf.number import NumberStyle, CurrencyStyle, CurrencySymbol, Number, Text -from odf.text import P -from odf.table import Table, TableColumn, TableRow, TableCell - -from tablib.compat import unicode - -title = 'odf' -extentions = ('odf',) - -def export_set(dataset): - """Returns ODF representation of Dataset.""" - - wb = OpenDocumentSpreadsheet() - 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() - 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() - for j, col in enumerate(row): - ws.addElement(TableColumn()) - #col_idx = get_column_letter(j + 1) - - # bold headers - if (row_number == 1) and dataset.headers: - ws.addElement(odf_row) - cell = TableCell() - cell.addElement(P(text=col)) - odf_row.addElement(cell) - #style = ws.get_style('%s%s' % (col_idx, row_number)) - #style.font.bold = True - #ws.freeze_panes = '%s%s' % (col_idx, row_number) - - - # bold separators - elif len(row) < dataset.width: - ws.addElement(odf_row) - cell = TableCell() - cell.addElement(P(text=col)) - odf_row.addElement(cell) - #ws.cell('%s%s'%(col_idx, row_number)).value = unicode( - # '%s' % col, errors='ignore') - #style = ws.get_style('%s%s' % (col_idx, row_number)) - #style.font.bold = True - - # wrap the rest - else: - try: - if '\n' in col: - ws.addElement(odf_row) - cell = TableCell() - cell.addElement(P(text=col)) - odf_row.addElement(cell) - #ws.cell('%s%s'%(col_idx, row_number)).value = unicode( - # '%s' % col, errors='ignore') - #style = ws.get_style('%s%s' % (col_idx, row_number)) - #style.alignment.wrap_text - else: - ws.addElement(odf_row) - cell = TableCell() - cell.addElement(P(text=col)) - odf_row.addElement(cell) - #ws.cell('%s%s'%(col_idx, row_number)).value = unicode( - # '%s' % col, errors='ignore') - except TypeError: - ws.addElement(odf_row) - cell = TableCell() - cell.addElement(P(text=col)) - odf_row.addElement(cell) - #ws.cell('%s%s'%(col_idx, row_number)).value = unicode(col) - - 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) + + diff --git a/test_tablib.py b/test_tablib.py index 474323a..5715eb0 100755 --- a/test_tablib.py +++ b/test_tablib.py @@ -223,6 +223,7 @@ class TablibTestCase(unittest.TestCase): data.tsv data.xls data.xlsx + data.ods data.html @@ -236,6 +237,7 @@ class TablibTestCase(unittest.TestCase): book.yaml book.xls book.xlsx + book.ods def test_json_import_set(self): -- cgit v1.2.1