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 | 实例之数据合并