记一次读取excel,日志记录异常。

mac2025-10-24  5

from openpyxl import load_workbook from openpyxl.styles import Font from openpyxl.styles.colors import BLACK from collections import namedtuple from config.config import DATA_PATH from common.RecordLog import log class ParseExcel(): #解析excel文件 def __init__(self,filename): try: self.filename = filename self.__wb = load_workbook(self.filename) except FileNotFoundError as e: log.error("解析Excel文件{}失败\n{}".format(self.filename,e)) def get_max_row_num(self,sheet_name): #获取最大行号 max_row_num = self.__wb[sheet_name].max_row return max_row_num def get_max_column_num(self, sheet_name): # 获取最大列数 max_column = self.__wb[sheet_name].max_column return max_column def get_cell_value(self, sheet_name, coordinate=None, row=None, column=None): #获取指定单元格的而数据 if coordinate is not None: try: return self.__wb[sheet_name][coordinate].value except Exception as e: raise e elif coordinate is None and row is not None and column is not None: if isinstance(row,int) and isinstance(column,int): return self.__wb[sheet_name].cell(row=row,column=column).value else: raise TypeError('row and column must be type int') else: raise Exception('Insufficient Coordinate of cell') def get_row_value(self, sheet_name,row): """获取某一行的数据""" column_num = self.get_max_column_num(sheet_name) row_value = [] if isinstance(row, int): for column in range(1, column_num + 1): values_row = self.__wb[sheet_name].cell(row, column).value row_value.append(values_row) return row_value else: raise TypeError('row must be type int') def get_column_value(self,sheet_name,column): """获取某一列的数据""" row_num = self.get_max_column_num(sheet_name) column_value = [] if isinstance(column, int): for row in range(1, row_num+1): values_column = self.__wb[sheet_name].cell(row, column).value column_value.append(values_column) return column_value else: raise Exception("column must be type int") def get_all_value(self,sheet_name): """获取指定表单的所有数据(除去表头)""" rows_obj = self.__wb[sheet_name].iter_rows(min_row=2,max_row=self.__wb[sheet_name].max_row,values_only=TypeError) values = [] for row_tuple in rows_obj: value_list = [] for value in row_tuple: value_list.append(value) values.append(value_list) log.info("读取{}文件,表单{}的所有数据\n{}".format(self.filename, sheet_name, values)) return values def get_excel_title(self, sheet_name): """获取sheet表头""" title_key = tuple(self.__wb[sheet_name].iter_rows(max_row=1,values_only=True))[0] log.info("解析{}文件表单{}的标题:\n你{}".format(self.filename, sheet_name, title_key)) return title_key def get_list_dict_all_value(self, sheet_name): """获取所有数据,返回嵌套字典的列表""" sheet_title = self.get_excel_title(sheet_name) all_values = self.get_all_value(sheet_name) value_list = [] for value in all_values: value_list.append(dict(zip(sheet_title,value))) return value_list def get_name_tuple_all_value(self,sheet_name): """获取所有数据,返回嵌套命名元组的列表 """ sheet_title = self.get_excel_title(sheet_name) values = self.get_all_value(sheet_name) excel = namedtuple('excel', sheet_name) value_list = [] for value in values: e = excel(*value) value_list.append(e) return value_list def write_cell(self,sheet_name, row,column, value=None, bold=True, color=BLACK): if isinstance(row, int) and isinstance(column, int): try: log.info("{}文件,表单{},第{}行第{}列写入数据{}".format(self.filename, sheet_name, row, column, value)) cell_obj = self.__wb[sheet_name].cell(row,column) cell_obj.font = Font(color=color,bold=bold) cell_obj.value = value self.__wb.save(self.filename) except Exception as e: log.error("{}文件,表单{},第{}行第{}列写入数据{}失败\n{}".format(self.filename, sheet_name, row, color, value, e)) raise e else: log.error( log.error("{}文件写数据失败:row and column must be type int".format(self.filename))) raise TypeError('row and column must be type int') do_excel = ParseExcel(DATA_PATH) if __name__ == '__main__': pe = ParseExcel(DATA_PATH) print(pe.get_all_value('login')) pe.get_name_tuple_all_value('login') column_row = pe.get_max_column_num('login') print('最大列号:', column_row) max_row = pe.get_max_row_num('login') print('最大行号:', max_row) cell_value_1 = pe.get_cell_value('login', row=2, column=3) print('第%d行, 第%d列的数据为: %s' % (2, 3, cell_value_1)) cell_value_2 = pe.get_cell_value('login', coordinate='A5') print('A5单元格的数据为: {}'.format(cell_value_2)) value_row = pe.get_row_value('login', 3) print('第{}行的数据为:{}'.format(3, value_row)) value_column = pe.get_column_value('login', 2) print('第{}列的数据为:{}'.format(2, value_column)) values_2 = pe.get_all_value('login') print('第二种方式获取所有数据\n', values_2) title = pe.get_excel_title('login') print('表头为\n{}'.format(title)) dict_value = pe.get_list_dict_all_value('login') print('所有数据组成的嵌套字典的列表:\n', dict_value) namedtuple_value = pe.get_list_dict_all_value('login') print('所有数据组成的嵌套命名元组的列表:\n', namedtuple_value)
最新回复(0)