diff options
| author | Jannis Leidel <jannis@leidel.info> | 2019-10-18 15:57:13 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-10-18 15:57:13 +0200 |
| commit | f6bf14afd22d8e5b706670590cc95f29d4483434 (patch) | |
| tree | a65fbc8b6fd1112222beb6f66c31082ffe231460 /src/tablib/formats/_ods.py | |
| parent | f3d02aa3b088e2f9044fe5e4869e8c8cb91d2cdc (diff) | |
| download | tablib-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.py | 104 |
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 |
