Coverage for /var/srv/projects/api.amasfac.comuna18.com/tmp/venv/lib/python3.9/site-packages/openpyxl/worksheet/_write_only.py: 34%
94 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# Copyright (c) 2010-2022 openpyxl
4"""Write worksheets to xml representations in an optimized way"""
6from inspect import isgenerator
8from openpyxl.cell import Cell, WriteOnlyCell
9from openpyxl.workbook.child import _WorkbookChild
10from .worksheet import Worksheet
11from openpyxl.utils.exceptions import WorkbookAlreadySaved
13from ._writer import WorksheetWriter
16class WriteOnlyWorksheet(_WorkbookChild):
17 """
18 Streaming worksheet. Optimised to reduce memory by writing rows just in
19 time.
20 Cells can be styled and have comments Styles for rows and columns
21 must be applied before writing cells
22 """
24 __saved = False
25 _writer = None
26 _rows = None
27 _rel_type = Worksheet._rel_type
28 _path = Worksheet._path
29 mime_type = Worksheet.mime_type
31 # copy methods from Standard worksheet
32 _add_row = Worksheet._add_row
33 _add_column = Worksheet._add_column
34 add_chart = Worksheet.add_chart
35 add_image = Worksheet.add_image
36 add_table = Worksheet.add_table
37 tables = Worksheet.tables
38 print_titles = Worksheet.print_titles
39 print_title_cols = Worksheet.print_title_cols
40 print_title_rows = Worksheet.print_title_rows
41 freeze_panes = Worksheet.freeze_panes
42 print_area = Worksheet.print_area
43 sheet_view = Worksheet.sheet_view
44 _setup = Worksheet._setup
46 def __init__(self, parent, title):
47 super(WriteOnlyWorksheet, self).__init__(parent, title)
48 self._max_col = 0
49 self._max_row = 0
50 self._setup()
52 @property
53 def closed(self):
54 return self.__saved
57 def _write_rows(self):
58 """
59 Send rows to the writer's stream
60 """
61 try:
62 xf = self._writer.xf.send(True)
63 except StopIteration:
64 self._already_saved()
66 with xf.element("sheetData"):
67 row_idx = 1
68 try:
69 while True:
70 row = (yield)
71 row = self._values_to_row(row, row_idx)
72 self._writer.write_row(xf, row, row_idx)
73 row_idx += 1
74 except GeneratorExit:
75 pass
77 self._writer.xf.send(None)
80 def _get_writer(self):
81 if self._writer is None:
82 self._writer = WorksheetWriter(self)
83 self._writer.write_top()
86 def close(self):
87 if self.__saved:
88 self._already_saved()
90 self._get_writer()
92 if self._rows is None:
93 self._writer.write_rows()
94 else:
95 self._rows.close()
97 self._writer.write_tail()
99 self._writer.close()
100 self.__saved = True
103 def append(self, row):
104 """
105 :param row: iterable containing values to append
106 :type row: iterable
107 """
109 if (not isgenerator(row) and
110 not isinstance(row, (list, tuple, range))
111 ):
112 self._invalid_row(row)
114 self._get_writer()
116 if self._rows is None:
117 self._rows = self._write_rows()
118 next(self._rows)
120 self._rows.send(row)
123 def _values_to_row(self, values, row_idx):
124 """
125 Convert whatever has been appended into a form suitable for work_rows
126 """
127 cell = WriteOnlyCell(self)
129 for col_idx, value in enumerate(values, 1):
130 if value is None:
131 continue
132 try:
133 cell.value = value
134 except ValueError:
135 if isinstance(value, Cell):
136 cell = value
137 else:
138 raise ValueError
140 cell.column = col_idx
141 cell.row = row_idx
143 if cell.hyperlink is not None:
144 cell.hyperlink.ref = cell.coordinate
146 yield cell
148 # reset cell if style applied
149 if cell.has_style or cell.hyperlink:
150 cell = WriteOnlyCell(self)
153 def _already_saved(self):
154 raise WorkbookAlreadySaved('Workbook has already been saved and cannot be modified or saved anymore.')
157 def _invalid_row(self, iterable):
158 raise TypeError('Value must be a list, tuple, range or a generator Supplied value is {0}'.format(
159 type(iterable))
160 )