通过openpyxl自定义封装excel快捷方法,获取表格内容

通过封装openpyxl方法获取excel数据,减少业务层代码对三方库和表格的调用,提高运行速度,同时分离出业务层与基础模块,方便后期维护

 除示例方法外,封装类中可添加其他其他方法,如获取单元格内容,获取单个、多个sheet的值并返回数组或迭代器,单元格写入新内容等。

from openpyxl import load_workbook
import openpyxl as xl  # 可注释,此处导入仅用来声明self.wb和self.sheet的类型,方便查询对应子方法


class ExcelHandler():
    """
    处理excel表格
    """
    def __init__(self, file: str = None, sheet: str = None):
        self.wb: xl.workbook.Workbook = load_workbook(file)     # 加载表格
        self.sheet: xl.workbook.Workbook.Worksheet = self.wb[sheet]     # 获取指定sheet对象

    def get_col_value(self, col:str=None):
        """
        获取列数据
        :param col: 列号,从"A"开始,未传入时返回所有列的数据(最大取到第15列的数据)
        :return:
        """
        if col:  # 如果col传入值,则取对应列数据,否则返回所有列数据
            data = [cell.value for cell in self.sheet[col]]  # self.sheet[row,col]同时传入row和col时返回单元格内容,传入单一值时,以元组返回单行或单列数据
        else:
            data = []
            data_iter = self.sheet.iter_rows(min_row=1, max_row=self.sheet.max_row, min_col=1, max_col=15)  # iter_rows()返回一个迭代器,min/max参数限制查找范围
            for col in data_iter:  # 每次迭代一行数据
                data.append([cell.value for cell in col])  # 存储所有行的数据,数据量大的情况下,可直接返回迭代器data_iter,在后续逻辑迭代获取值
        return data

    def get_row_value(self, row: int=None):
        """
        获取列数据
        :param row: 行号,从 1 开始,未传入时返回所有行的数据(每行最大取到第15列的数据)
        :return:
        """
        if row:
            data = [cell.value for cell in self.sheet[row]]
            
        else:
            data = []
            data_iter = self.sheet.iter_rows(min_row=1, max_row=self.sheet.max_row, min_col=1, max_col=15)
            for row in data_iter:
                data.append([cell.value for cell in row])
        return data

    @property
    def max_row(self):
        # 数据行数
        return self.sheet.max_row

    @property
    def max_col(self):
        # 数据列数
        return self.sheet.max_col

if __name__ == '__main__':
    handler = ExcelHandler(r"C:\Users\", "sheet1")
    data = handler.get_col_value("A")  # 取A列的数据
    data = handler.get_row_value(1)    # 取第一行的数据
    print(data)

 

posted @ 2022-09-30 16:58  TGZZ  阅读(111)  评论(0)    收藏  举报