python自动化办公实例(使用openpyxl、os处理统计Excel表中的数据并将其合并)

源数据格式

以其中一个表格为例

可以看到表中数据比较杂乱且并没有我们想要的数据、指标(如一等奖、二等奖的数量)不利于下一步数据的分析。所以我们需要手动对数据进行一些处理,大致格式如下:

数据处理格式

这里的手动处理可以通过优化我们的代码来进行一些简化以减少我们的工作量(如其他列不用删只要把奖项这里的列名进行统一就好了、文件名其实也可以不用进行重命名可以直接用我们之前的名字这样不仅可以减少工作量又可以让表的名字更加清晰且有辨识度)不过由于本人之前并未接触过python相关库的使用所以代码写完之后才意识到这些问题。以后有时间再把代码优化优化......

数据处理好存储在一个文件目录下就可以开始运行我们的代码了

代码

python 复制代码
import openpyxl
import os
'''
    1、使用代码前请检查表格格式
    2、请安装相应的库(openpyxl、os、pandas)
    3、代码运行前需关闭打开的需要处理的文件
    4、本人水平有限,如果一直报错请上CSDN........
'''
dizhi1=input("请输入原数据存储的路径:")
dizhi2=input("请输入数据处理后存储的路径:")
# 当前目录
base_dir = dizhi1
# 获取当前目录下的所有文件
# 遍历文件列表,输出文件名
#获取绝对路径        files = [os.path.join(base_dir, file) for file in os.listdir(r"{}".format(base_dir))]

for file in os.listdir(r"{}".format(base_dir)):
    print(file)
    # 获取工作簿对象
    wb = openpyxl.load_workbook(r'{}/{}'.format(dizhi1,file))
    wb2=openpyxl.load_workbook('湖南省本科院校清单.xlsx')
    # 获取所有工作表名称
    print(wb.sheetnames)
    # 获取工作表对象
    sheet1 = wb.worksheets[0]
    sheet_2 = wb2.worksheets[0]
    # 设置Sheet名称
    sheet1.title = '竞赛成绩'
    # 创建一个新sheet,可以指定名称,index表示新创建的工作簿放在第几个位置, index从0开始计数
    sheet2 = wb.create_sheet(index=1, title='竞赛成绩统计及汇总')
    # 获取所有工作表名称
    print(wb.sheetnames)
    #获取名单
    b=[]#名单
    # 获取工作表总行数
    rows_2 = sheet_2.max_row
    # 获取工作表总列数
    cols_2 = sheet_2.max_column
    # 总行,总列
    print(rows_2, cols_2)
    for i in range(2, rows_2):
        cell_value = sheet_2.cell(row=i, column=1).value
        b.append(cell_value)
    print(b)
    #给表二的列命名
    sheet2['A1'] = '学校'
    sheet2['B1'] = '一等奖'
    sheet2['C1'] = '二等奖'
    sheet2['D1'] = '三等奖'
    sheet2['E1'] = '获奖总数'
    sheet2['F1'] = '排名'
    sheet2['G1'] = '排名指标'
    sheet2['H1'] = '综合竞赛指标'

    # 获取所有工作表名称
    print(wb.sheetnames)
    # 获取工作表总行数
    rows = sheet1.max_row
    # 获取工作表总列数
    cols = sheet1.max_column
    # 总行,总列
    print(rows, cols)
    # 读取所有内容
    zs=0#获奖总数
    no1=0#一等奖
    no2=0#二等奖
    no3=0#三等奖
    mz=[]
    a=[]#初始表
    x=[]#最终表
    for i in range(1, rows+1):
        row_list = []
        for j in range(1, cols+1):
            cell_value = sheet1.cell(row=i, column=j).value
            row_list.append(cell_value)
        a.append(row_list)
    for i in range(1, rows):
        name=a[i][0]
        if(name not in mz and name in b):
            zs=0
            no1=0
            no2=0
            no3=0
            zhzb=0
            mz.append(name)
            for j in range(1, rows):
                if a[j][0] == name:
                    zs = zs + 1
                    if a[j][1] == '一等奖' or a[j][1] == '一等':
                        no1 = no1 + 1
                    if a[j][1] == '二等奖' or a[j][1] == '二等':
                        no2 = no2 + 1
                    if a[j][1] == '三等奖' or a[j][1] == '三等':
                        no3 = no3 + 1
            print(name,zs, no1, no2, no3)
            # 竞赛综合指标依据2021年度吉首大学教学奖励办法,按照导向性、重点性、示范性原则制定
            zhzb = no1 * 0.5 + no2 * 0.2 + no3 * 0.1
            # 写入多个单元格(追加模式,不会覆盖之前的,从有数据的下一行开始)
            #sheet2.append([name,no1,no2,no3,zs,None,None,zhzb])
            x.append([name,no1,no2,no3,zs,None,None,zhzb])
    x.sort(key=lambda x: (x[1], x[2], x[3]),reverse=True)
    n=len(x)
    s=100
    pm=1
    t=x[0][1:4]
    for i in range(n):
        #print(t[1],x[i][1]);
        if(x[i][1:4] != t):
            pm=i+1
            print(pm)
        x[i][5]=pm
        x[i][6]=round(s-(pm-1)*(100/n),2)
        sheet2.append(x[i])
        t=x[i][1:4]
    # 保存
    print(x)
    wb.save(r"{}\{}".format(dizhi2,file))

注释全写在代码里了哦

数据处理后的格式

将处理汇总好的数据放在了另一个表里

附录

湖南省本科院校清单

我直接把这个表放在了python文件的同一目录下以便调用

相关推荐
weixin_462446231 小时前
一键安装 Hadoop 3.3.6 自动化脚本详解 |(含 JAVA_HOME 自动配置)
java·hadoop·自动化
臭东西的学习笔记7 小时前
论文学习——机器学习引导的蛋白质工程
人工智能·学习·机器学习
Rabbit_QL7 小时前
【水印添加工具】从零设计一个工程级 Python 图片水印工具:WaterMask 架构与实现
开发语言·python
ghgxm5208 小时前
Fastapi_00_学习方向 ——无编程基础如何用AI实现APP生成
人工智能·学习·fastapi
求真求知的糖葫芦8 小时前
巴伦学习(一)一种新型补偿传输线巴伦论文学习笔记(自用)
笔记·学习·射频工程
沉默-_-8 小时前
力扣hot100滑动窗口(C++)
数据结构·c++·学习·算法·滑动窗口
曲幽8 小时前
FastAPI多进程部署:定时任务重复执行?手把手教你用锁搞定
redis·python·fastapi·web·lock·works
freepopo9 小时前
书房设计|3㎡书桌角,治愈学习时光 [特殊字符]
学习
鑫—萍9 小时前
嵌入式开发学习——STM32单片机入门教程
c语言·驱动开发·stm32·单片机·嵌入式硬件·学习·硬件工程
J2虾虾9 小时前
Docker启动超时,吓得我一身汗
运维·docker·容器