zoukankan      html  css  js  c++  java
  • 封装openpyxl,更加方便处理 excel(中级)

    学习了基础的 Excel 操作后,对其进行了封装, 为了使用框架时更加方便的调用

    废话不多说,直接上代码,需要可以直接使用(写了详细的备注)

    import openpyxl
    
    
    class ExcelHandle(object):
        """ excel封装 """
    
        def __init__(self):
            """ 也可以把文件名和表名写到init里面 """
            pass
    
        def select_form(self, file_name, sheet_name):
            """
            选择表单,判断传入的 sheet_name 是整数根据索引,不是整数根据表单名处理
            :param file_name: excel文件路径
            :param sheet_name: 表单的名字或者索引
            """
            wb = openpyxl.load_workbook(file_name)
            if isinstance(sheet_name, int):
                try:
                    return wb.worksheets[sheet_name]
                except IndexError:
                    print('输入的表单索引有误')
            elif isinstance(sheet_name, str):
                try:
                    return wb[sheet_name]
                except KeyError:
                    print('输入的表单名称有误')
            else:
                print('输入有误,请输入表单索引或表单名称')
    
        def read_one_data(self, file_name, sheet_name, row, column):
            """
            读取 一个单元格的数据 , 根据第几行第几个获取数据
            :param file_name: excel文件路径
            :param sheet_name: 表单的名字或者索引
            :param row: 行
            :param column: 列
            :return:
            """
            sheet = self.select_form(file_name, sheet_name)
            return sheet.cell(row, column).value
    
        def read_line(self, file_name, sheet_name, line):
            """
            读取 一列单元格的数据
            :param file_name: excel文件路径
            :param sheet_name: 表单的名字或者索引
            :param line:
            """
            # 调用上面选择表单
            sheet = self.select_form(file_name, sheet_name)
            # 获取单元格
            sheet_data = sheet[line]
            # 元组 (Cell(1,1), Cell(1,2)
            data = []
            for c in sheet_data:
                data.append(c.value)
            return data
    
        def read_all(self, file_name, sheet_name, start_row=2, start_column=1):
            """
            读取所有的数据,
            :param file_name: excel文件路径
            :param sheet_name: 表单的名字或者索引
            :param start_row: 从第几'行'开始
            :param start_column: 从第几'列'开始
            :return:
            """
            sheet = self.select_form(file_name, sheet_name)
            # 使用 列表推导式  列表中的索引开始是从 1 开始, 而不是 0
            header = [colmn.value for colmn in sheet[1]]
            data = []
            # sheet.max_row 获取最大行数
            for row in range(start_row, sheet.max_row + 1):
                row_data = []
                # sheet.max_column 获取最大列数
                for column in range(start_column, sheet.max_column + 1):
                    row_data.append(sheet.cell(row, column).value)
                # 把标题头和输入组合成字典 把两个列表组合成字典
                row_data = dict(zip(header, row_data))
                data.append(row_data)
            return data
    
        @staticmethod
        def write(file_name, sheet_name, row, column, data):
            """
            保存数据,使用 静态方法 一次修改一个
            :param file_name: excel文件路径
            :param sheet_name: 表单的名字
            :param row: 修改数据的'行'
            :param column: 修改数据的'列'
            :param data: 修改的内容
            :return:
            """
            wb = openpyxl.load_workbook(file_name)
            # todo 使用 get_sheet_by_name 会告诉你这个函数被弃用了
            #  sheet = wb.get_sheet_by_name(sheet_name)
            # 建议使用
            sheet = wb[sheet_name]
            sheet.cell(row, column).value = data
            # 保存关闭
            wb.save(file_name)
            wb.close()
    
    
    if __name__ == '__main__':
        eh = ExcelHandle()
        # 获取表单
        print(eh.select_form(r'D:data.xlsx', 0))
        # 一个数据
        print(eh.read_one_data(r'D:data.xlsx', 0, 1, 1))
        # 获取所有数据
        print(eh.read_all(r'D:data.xlsx', 0))
        # 保存数据
        eh.write(r'D:data.xlsx', 'Sheet1', 1, 1, 'URL')
  • 相关阅读:
    OpenFire源码学习之二:Mina基础知识
    revel + swagger 文档也能互动啦
    Auto Layout 在iOS屏幕适配中的使用
    iOS小技巧
    一种简易的聊天泡泡设置颜色以及添加描边的方式
    做好交互应该克服哪些问题
    jQuery .on() 绑定事件无效
    浅谈iOS的Autolayout
    img 元素无法获取高度的问题
    简易自动化部署服务器集群
  • 原文地址:https://www.cnblogs.com/yongzhuang/p/12181080.html
Copyright © 2011-2022 走看看