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

1# Copyright (c) 2010-2022 openpyxl 

2 

3 

4"""Write worksheets to xml representations in an optimized way""" 

5 

6from inspect import isgenerator 

7 

8from openpyxl.cell import Cell, WriteOnlyCell 

9from openpyxl.workbook.child import _WorkbookChild 

10from .worksheet import Worksheet 

11from openpyxl.utils.exceptions import WorkbookAlreadySaved 

12 

13from ._writer import WorksheetWriter 

14 

15 

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 """ 

23 

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 

30 

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 

45 

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() 

51 

52 @property 

53 def closed(self): 

54 return self.__saved 

55 

56 

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() 

65 

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 

76 

77 self._writer.xf.send(None) 

78 

79 

80 def _get_writer(self): 

81 if self._writer is None: 

82 self._writer = WorksheetWriter(self) 

83 self._writer.write_top() 

84 

85 

86 def close(self): 

87 if self.__saved: 

88 self._already_saved() 

89 

90 self._get_writer() 

91 

92 if self._rows is None: 

93 self._writer.write_rows() 

94 else: 

95 self._rows.close() 

96 

97 self._writer.write_tail() 

98 

99 self._writer.close() 

100 self.__saved = True 

101 

102 

103 def append(self, row): 

104 """ 

105 :param row: iterable containing values to append 

106 :type row: iterable 

107 """ 

108 

109 if (not isgenerator(row) and 

110 not isinstance(row, (list, tuple, range)) 

111 ): 

112 self._invalid_row(row) 

113 

114 self._get_writer() 

115 

116 if self._rows is None: 

117 self._rows = self._write_rows() 

118 next(self._rows) 

119 

120 self._rows.send(row) 

121 

122 

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) 

128 

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 

139 

140 cell.column = col_idx 

141 cell.row = row_idx 

142 

143 if cell.hyperlink is not None: 

144 cell.hyperlink.ref = cell.coordinate 

145 

146 yield cell 

147 

148 # reset cell if style applied 

149 if cell.has_style or cell.hyperlink: 

150 cell = WriteOnlyCell(self) 

151 

152 

153 def _already_saved(self): 

154 raise WorkbookAlreadySaved('Workbook has already been saved and cannot be modified or saved anymore.') 

155 

156 

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 )