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)