Coverage for /var/srv/projects/api.amasfac.comuna18.com/tmp/venv/lib/python3.9/site-packages/tablib/formats/_ods.py: 26%
55 statements
« prev ^ index » next coverage.py v6.4.4, created at 2023-07-17 14:22 -0600
« prev ^ index » next coverage.py v6.4.4, created at 2023-07-17 14:22 -0600
1""" Tablib - ODF Support.
2"""
4import numbers
5from io import BytesIO
7from odf import opendocument, style, table, text
9bold = style.Style(name="bold", family="paragraph")
10bold.addElement(style.TextProperties(fontweight="bold", fontweightasian="bold", fontweightcomplex="bold"))
13class ODSFormat:
14 title = 'ods'
15 extensions = ('ods',)
17 @classmethod
18 def export_set(cls, dataset):
19 """Returns ODF representation of Dataset."""
21 wb = opendocument.OpenDocumentSpreadsheet()
22 wb.automaticstyles.addElement(bold)
24 ws = table.Table(name=dataset.title if dataset.title else 'Tablib Dataset')
25 wb.spreadsheet.addElement(ws)
26 cls.dset_sheet(dataset, ws)
28 stream = BytesIO()
29 wb.save(stream)
30 return stream.getvalue()
32 @classmethod
33 def export_book(cls, databook):
34 """Returns ODF representation of DataBook."""
36 wb = opendocument.OpenDocumentSpreadsheet()
37 wb.automaticstyles.addElement(bold)
39 for i, dset in enumerate(databook._datasets):
40 ws = table.Table(name=dset.title if dset.title else 'Sheet%s' % (i))
41 wb.spreadsheet.addElement(ws)
42 cls.dset_sheet(dset, ws)
44 stream = BytesIO()
45 wb.save(stream)
46 return stream.getvalue()
48 @classmethod
49 def dset_sheet(cls, dataset, ws):
50 """Completes given worksheet from given Dataset."""
51 _package = dataset._package(dicts=False)
53 for i, sep in enumerate(dataset._separators):
54 _offset = i
55 _package.insert((sep[0] + _offset), (sep[1],))
57 for row_number, row in enumerate(_package, start=1):
58 is_header = row_number == 1 and dataset.headers
59 style = bold if is_header else None
60 odf_row = table.TableRow(stylename=style)
61 ws.addElement(odf_row)
62 for j, col in enumerate(row):
63 if isinstance(col, numbers.Number):
64 cell = table.TableCell(valuetype="float", value=col)
65 else:
66 cell = table.TableCell(valuetype="string")
67 cell.addElement(text.P(text=str(col), stylename=style))
68 odf_row.addElement(cell)
70 @classmethod
71 def detect(cls, stream):
72 if isinstance(stream, bytes):
73 # load expects a file-like object.
74 stream = BytesIO(stream)
75 try:
76 opendocument.load(stream)
77 return True
78 except Exception:
79 return False