import openpyxl import os '''2021.12.10更新 将文件中指定单元格区域中的数据,复制到新表格中,并保存到指定文件夹 此处需考虑,假如指定文件是.xls 文件格式的情况,需要将其事先转化''' # 定义一个使用单元格区域为参数的函数,wss代表数据源工作表,sa表示要取值的单元格区域,wsd指的是数据源目标工作表 def writeCell(wss, sa, wsd): r = wsd.max_row c = wsd.max_column ci = 1 rj = 1 for rowofcellobjects in wss[sa]: for cellobj in rowofcellobjects: wsd.cell(row=r+rj, column=ci, value=cellobj.value) ci += 1 rj += 1 ci = 1 # 收集文件夹文件信息,包含的文件数量 files_root = "C:\\Users\\Administrator\\Desktop\\测试用表格" digit_root = "C:\\Users\\Administrator\\Desktop\\结果" # 确定接下来要处理的表 fun = {0: "早餐订餐表", 1: "食堂满意度"} area_sheet = {"早餐订餐表": ["J2:P7", "A2:H55"], "食堂满意度": "A2:D15"} # 各表中需要采集的数据所在单元格区域。此处内容要手动修改 choose = int(input("0 -> 早餐订餐表\n1 -> 食堂满意度\n接下来要处理的表单是:")) fc = fun[choose] if choose == 0: dc = int(input(f"您将处理表 {area_sheet[fc]} 中的哪个区域(以位置表示):")) area_key = area_sheet[fc][dc] else: area_key = area_sheet[fc] # 新建一个空白的表,存放到制定文件夹中 wbd = openpyxl.Workbook() i = 0 fn = 0 # 循环遍历目标地址三元组数据包括,根目录root,子目录dirs,以及文件files for root, dirs, file_tar in os.walk(files_root): for f in file_tar: # 获取文件地址 sour_path = os.path.join(root, f) # 任何文件,除文件名以外的路径都是root wb = openpyxl.load_workbook(sour_path, data_only=True) # 逐个打开工作薄 try: wb_sheet = wb[fc] except KeyError: print(f"Keyerror: 工作簿{f}中无此表 {fun[choose]} ,但是有 {wb.sheetnames}") fn += 1 continue i += 1 writeCell(wb_sheet, area_key, wbd.active) print(f"第 {i} 份:工作簿 {f} 中的 {fc} 已复制完毕!") digit_xlsx = os.path.join(digit_root, fc +area_key[:2]+ '.xlsx') wbd.save(digit_xlsx) print(f"\nDone:" f"\n所有数据已合并保存至文件{digit_xlsx}" f"\n其中行数为{wbd.active.max_row},列数为{wbd.active.max_column}" f"\n成功保存文件数:{i} 份,失败:{fn} 份") # 是否保存到日志中? 结果如下: C:\Users\Administrator\PycharmProjects\pythonProject\venv\Scripts\python.exe C:/Users/Administrator/PycharmProjects/pythonProject/合并数据.py 0 -> 早餐订餐表 1 -> 食堂满意度 接下来要处理的表单是:0 您将处理表 ['J2:P7', 'A2:H55'] 中的哪个区域(以位置表示):0 第 1 份:工作簿 701.xlsx 中的 早餐订餐表 已复制完毕! 第 2 份:工作簿 906.xlsx 中的 早餐订餐表 已复制完毕! 第 3 份:工作簿 910.xlsx 中的 早餐订餐表 已复制完毕! 第 4 份:工作簿 912.xlsx 中的 早餐订餐表 已复制完毕! Keyerror: 工作簿新建 XLSX 工作表.xlsx中无此表 早餐订餐表 ,但是有 ['Sheet1', 'Sheet2', 'Sheet3'] Done: 所有数据已合并保存至文件C:\Users\Administrator\Desktop\结果\早餐订餐表J2.xlsx 其中行数为25,列数为7 成功保存文件数:4 份,失败:1 份 显然这一次写代码就要顺手的多。 首先是理清思路,知道自己想要做什么 再者就是理功能,哪些功能已经有模块了,哪些需要自己写代码理顺逻辑关系 以上不足的是,有些地方是在没想好逻辑关系的情况下写的,所以有点乱,而且以后如果要修改的话,可能工程会比较大。
python | 实例之数据合并