Coverage for /home/martinb/.local/share/virtualenvs/camcops/lib/python3.6/site-packages/pyexcel_io/sheet.py : 24%

Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1"""
2 pyexcel_io.sheet
3 ~~~~~~~~~~~~~~~~~~~
5 The io interface to file extensions
7 :copyright: (c) 2014-2020 by Onni Software Ltd.
8 :license: New BSD License, see LICENSE for more details
9"""
10import pyexcel_io.constants as constants
11from pyexcel_io.utils import _index_filter
12from pyexcel_io._compact import irange
13from pyexcel_io.plugin_api import NamedContent # noqa: F401
16class SheetReader(object):
17 """
18 Generic sheet reader
19 """
21 def __init__(
22 self,
23 sheet,
24 start_row=0,
25 row_limit=-1,
26 start_column=0,
27 column_limit=-1,
28 skip_row_func=None,
29 skip_column_func=None,
30 skip_empty_rows=False,
31 row_renderer=None,
32 keep_trailing_empty_cells=False,
33 **deprecated_use_of_keywords_here
34 ):
35 self._native_sheet = sheet
36 self._keywords = {}
37 self._keywords.update(deprecated_use_of_keywords_here)
38 self._start_row = start_row
39 self._row_limit = row_limit
40 self._start_column = start_column
41 self._column_limit = column_limit
42 self._skip_row = _index_filter
43 self._skip_column = _index_filter
44 self._skip_empty_rows = skip_empty_rows
45 self._row_renderer = row_renderer
46 self.keep_trailing_empty_cells = keep_trailing_empty_cells
48 if skip_row_func:
49 self._skip_row = skip_row_func
50 if skip_column_func:
51 self._skip_column = skip_column_func
53 def to_array(self):
54 """2 dimentional representation of the content"""
55 for row_index, row in enumerate(self.row_iterator()):
56 row_position = self._skip_row(
57 row_index, self._start_row, self._row_limit
58 )
59 if row_position == constants.SKIP_DATA:
60 continue
62 elif row_position == constants.STOP_ITERATION:
63 break
65 return_row = []
66 tmp_row = []
68 for column_index, cell_value in enumerate(
69 self.column_iterator(row)
70 ):
71 column_position = self._skip_column(
72 column_index, self._start_column, self._column_limit
73 )
74 if column_position == constants.SKIP_DATA:
75 continue
77 elif column_position == constants.STOP_ITERATION:
78 break
80 if self.keep_trailing_empty_cells:
81 return_row.append(cell_value)
82 else:
83 tmp_row.append(cell_value)
84 if cell_value is not None and cell_value != "":
85 return_row += tmp_row
86 tmp_row = []
87 if self._skip_empty_rows and len(return_row) < 1:
88 # we by-pass next yeild here
89 # because it is an empty row
90 continue
92 if self._row_renderer:
93 return_row = self._row_renderer(return_row)
94 yield return_row
96 def row_iterator(self):
97 """
98 iterate each row
100 override this function in the sitation where
101 number_of_rows() is difficult or costly to implement
102 """
103 return irange(self.number_of_rows())
105 def column_iterator(self, row):
106 """
107 iterate each column of a given row
109 override this function in the sitation where
110 number_of_columns() is difficult or costly to implement
111 """
112 for column in irange(self.number_of_columns()):
113 yield self.cell_value(row, column)
115 def number_of_rows(self):
116 """
117 implement this method for easy extension
118 """
119 raise Exception("Please implement number_of_rows()")
121 def number_of_columns(self):
122 """
123 implement this method for easy extension
124 """
125 raise Exception("Please implement number_of_columns()")
127 def cell_value(self, row, column):
128 """
129 implement this method for easy extension
130 """
131 raise Exception("Please implement cell_value()")
133 def close(self):
134 pass
137class SheetWriter(object):
138 """
139 Generic sheet writer
140 """
142 def __init__(self, native_book, native_sheet, name, **keywords):
143 if name:
144 sheet_name = name
145 else:
146 sheet_name = constants.DEFAULT_SHEET_NAME
147 self._native_book = native_book
148 self._native_sheet = native_sheet
149 self._keywords = keywords
150 self.set_sheet_name(sheet_name)
152 def set_sheet_name(self, name):
153 """
154 Set sheet name
155 """
156 pass
158 def write_row(self, array):
159 """
160 write a row into the file
161 """
162 raise NotImplementedError("Please implement write_row()")
164 def write_array(self, table):
165 """
166 For standalone usage, write an array
167 """
168 for row in table:
169 self.write_row(row)
171 def close(self):
172 """
173 This call actually save the file
174 """
175 pass