summaryrefslogtreecommitdiff
path: root/tablib/formats
diff options
context:
space:
mode:
authorKenneth Reitz <me@kennethreitz.com>2011-05-22 14:07:17 -0400
committerKenneth Reitz <me@kennethreitz.com>2011-05-22 14:07:17 -0400
commit87e65fd3e77f21efc9efc4ab367611702fcd3cfe (patch)
tree51d5236072bbfa8907d607331de42f05860d6a05 /tablib/formats
parentffbc3b122d7db7740d070112aec023cbbf663f4e (diff)
parentcceb41af98afe11ef04e1c9b187e70af293c94d0 (diff)
downloadtablib-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__.py3
-rw-r--r--tablib/formats/_ods.py100
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