Hide keyboard shortcuts

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

4 

5 The io interface to file extensions 

6 

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 

14 

15 

16class SheetReader(object): 

17 """ 

18 Generic sheet reader 

19 """ 

20 

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 

47 

48 if skip_row_func: 

49 self._skip_row = skip_row_func 

50 if skip_column_func: 

51 self._skip_column = skip_column_func 

52 

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 

61 

62 elif row_position == constants.STOP_ITERATION: 

63 break 

64 

65 return_row = [] 

66 tmp_row = [] 

67 

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 

76 

77 elif column_position == constants.STOP_ITERATION: 

78 break 

79 

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 

91 

92 if self._row_renderer: 

93 return_row = self._row_renderer(return_row) 

94 yield return_row 

95 

96 def row_iterator(self): 

97 """ 

98 iterate each row 

99 

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

104 

105 def column_iterator(self, row): 

106 """ 

107 iterate each column of a given row 

108 

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) 

114 

115 def number_of_rows(self): 

116 """ 

117 implement this method for easy extension 

118 """ 

119 raise Exception("Please implement number_of_rows()") 

120 

121 def number_of_columns(self): 

122 """ 

123 implement this method for easy extension 

124 """ 

125 raise Exception("Please implement number_of_columns()") 

126 

127 def cell_value(self, row, column): 

128 """ 

129 implement this method for easy extension 

130 """ 

131 raise Exception("Please implement cell_value()") 

132 

133 def close(self): 

134 pass 

135 

136 

137class SheetWriter(object): 

138 """ 

139 Generic sheet writer 

140 """ 

141 

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) 

151 

152 def set_sheet_name(self, name): 

153 """ 

154 Set sheet name 

155 """ 

156 pass 

157 

158 def write_row(self, array): 

159 """ 

160 write a row into the file 

161 """ 

162 raise NotImplementedError("Please implement write_row()") 

163 

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) 

170 

171 def close(self): 

172 """ 

173 This call actually save the file 

174 """ 

175 pass