python | 实例之数据合并

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


显然这一次写代码就要顺手的多。
首先是理清思路,知道自己想要做什么
再者就是理功能,哪些功能已经有模块了,哪些需要自己写代码理顺逻辑关系
以上不足的是,有些地方是在没想好逻辑关系的情况下写的,所以有点乱,而且以后如果要修改的话,可能工程会比较大。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注