summaryrefslogtreecommitdiff
path: root/src/tablib/formats/_ods.py
diff options
context:
space:
mode:
authorJannis Leidel <jannis@leidel.info>2019-10-18 15:57:13 +0200
committerGitHub <noreply@github.com>2019-10-18 15:57:13 +0200
commitf6bf14afd22d8e5b706670590cc95f29d4483434 (patch)
treea65fbc8b6fd1112222beb6f66c31082ffe231460 /src/tablib/formats/_ods.py
parentf3d02aa3b088e2f9044fe5e4869e8c8cb91d2cdc (diff)
downloadtablib-f6bf14afd22d8e5b706670590cc95f29d4483434.tar.gz
Add project release config and cleanup project setup. (#398)
* Add project release config and use Travis build stages. Refs #378. * Restructure project to use src/ and tests/ directories. * Fix testing. * Remove eggs. * More fixes. - isort and flake8 config - manifest template update - tox ini extension - docs build fixes - docs content fixes * Docs and license cleanup.
Diffstat (limited to 'src/tablib/formats/_ods.py')
-rw-r--r--src/tablib/formats/_ods.py104
1 files changed, 104 insertions, 0 deletions
diff --git a/src/tablib/formats/_ods.py b/src/tablib/formats/_ods.py
new file mode 100644
index 0000000..dbf57c4
--- /dev/null
+++ b/src/tablib/formats/_ods.py
@@ -0,0 +1,104 @@
+# -*- coding: utf-8 -*-
+
+""" Tablib - ODF Support.
+"""
+
+from io import BytesIO
+from odf import opendocument, style, table, text
+from tablib.compat import unicode
+
+title = 'ods'
+extensions = ('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)
+
+
+def detect(stream):
+ if isinstance(stream, bytes):
+ # load expects a file-like object.
+ stream = BytesIO(stream)
+ try:
+ opendocument.load(stream)
+ return True
+ except Exception:
+ return False