代码改变世界

Python - openpyxl模块

2022-03-29 14:59  起个昵称  阅读(82)  评论(0编辑  收藏  举报

 

打开Excel  ->  选择表单  ->  获取单元格的值 / 修改单元格的值 / 标题数据组成字典 -> 另存为 / 保存

 1 import os
 2 from openpyxl import load_workbook
 3 
 4 
 5 # 需要打开文件的路径, Excel跟py文件在同一个目录
 6 file_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'testcases.xlsx')
 7 
 8 # 创建workbook对象 - 打开Excel
 9 wb = load_workbook(file_path)
10 
11 # 选择表单 wb['表单名']
12 sh = wb['login']
13 
14 # 单元格对象 行列都是1开始数起
15 # 读取单元格的值
16 cel = sh.cell(2, 2)
17 print(cel.value)    # 2行2列的值
18 
19 # 修改单元格的值
20 sh.cell(2, 2).value = 'New Value'   # 修改值保存在内存中,非文件
21 print(sh.cell(2, 2).value)
22 
23 # 读取所有行
24 all_rows = list(sh.rows)   # 一个列表保住所有行
25 for item in all_rows:     # item是每一行
26     for cel in item:    # cel是每一行的单元格
27         print(cel.value)
28 
29 for item in all_rows[1:]:    # 指定开始行号
30     pass
31 
32 # 获取标题行
33 titles = []
34 for header in all_rows[0]:
35     titles.append(header.value)
36 
37 # 把标题行和值组成字典   -- 方法1
38 """
39 data_lists = []
40 for item in all_rows[1:]:
41     value_dict = {}
42     for index in range(len(item)):
43         value_dict[titles[index]] = item[index].value
44     data_lists.append(value_dict)
45 """
46 
47 # 把标题行和值组成字典   -- 方法2 -- 推荐
48 data_lists = []
49 for item in all_rows[1:]:
50     values = []
51     for val in values.value:
52         values.append(val)       # 一行数据 列表
53     res = dict(zip(titles, values))    # 每获取一行数据的列表,就跟标题组成一个字典
54     res["字典型字符串"] = eval(res["字典型字符串"])   # 字典类型的字符串转成字典
55     data_lists.append(res)    # 把所有字典放在列表里
56 wb.close()   # 属于第三方资源,需要关闭
57 # 保存修改,有save()就不需要close()
58 wb.save("save_as_another_excel.xlsx")   # 保存到另外的文件
59 wb.save(file_path)   # 保存到原文件,需要关闭原文件,不然提示权限不足

 

1. zip() 打包函数,将2个列表组成成字典

2. eval() 把字典类型的字符串转成字典

3. Excel读取出来的数据只有2种类型:数字、字符串

4. 单元格的值是公式就算出来的,读取的时候只读取值

5. 操作Excel时,要确保Excel被关闭

6. 操作完Excel后,记得关闭 close()

 

封装Excel读取

from openpyxl import load_workbook


class HandleExcel():

    def __init__(self, file_path, workbook):
        self.wb = load_workbook(file_path)
        self.sh = self.wb[workbook]

    def read_titles(self):
        """
        读取Excel第一行
        :return: 标题列表
        """
        titles = []
        for item in list(self.sh.rows)[0]:
            titles.append(item.value)
        return titles

    def read_datas(self):
        """
        从Excel的第二行开始读取
        :return: 数据行列表
        """
        all_datas = []
        for item in list(self.sh.rows)[1:]:
            values = []
            for val in item:
                values.append(val.value)
            all_datas.append(values)
        return all_datas

    def read_all_data_with_title(self):
        """
        标题和数据行组成的字典
        :return: 
        """
        titles = self.read_titles()
        datas = self.read_datas()
        all_datas = []
        for data in datas:
            data_dict = dict(zip(titles, data))
            all_datas.append(data_dict)
        return all_datas

    def close_file(self):
        """
        excel属于第三方资源,用完后要关闭释放
        :return: 
        """
        self.wb.close()


if __name__ == '__main__':
    handle_excel = HandleExcel('xxx表.xlsx', 'xxx工作单')
    titles = handle_excel.read_titles()
    datas = handle_excel.read_datas()
    data_with_title = handle_excel.read_all_data_with_title()
    handle_excel.close_file()
    print(titles)
    print(datas)
    print(data_with_title)