@[TOC]利用python openpyxl库实现对多个excel工作簿的快速汇总


前言

最近又参与了一个关于危险货物运输的项目,需要对调查表格进行汇总。收到了112个excel工作簿,分布于22个主文件夹中。本文基于python openpyxl库实现了上述112个excel工作簿的快速汇总,不到10秒钟快速结束战斗。


一、文件夹结构

一个主文件夹下包含着多个子文件夹,子文件夹里包含着exce工作簿,打开补充调研主文件夹,如下图所示。
打开金牛区文件夹,如下图所示。
打开某公司的excel工作簿,如下图所示。

二、思路

首先我们已经知道了文件夹的结构,同时通过观察每个工作簿,可以发现这些表格具有相同的表头、表尾,只是表身长度不同而已。那么我们就可以借助于Python的os库和openpyxl库来快速的解决这个问题!

首先借助于os库获取每一个Excel工作簿的地址。然后我们借助于openpyxl库来对任意一个表格进行读取,再新建工作部,写入读取的数据。最后再遍历读取的文件地址就实现了对所有表格的汇总。

对于表1,确定初始遍历行,向下进行遍历,同时对空行进行忽略,直到遍历到填表说明结束。

对于表2,由于表2是固定的高度和固定的宽度,所以对表2的处理相对比较方便,只需要通过对行和列进行遍历就可以对所有的单元格进行汇总。

对于表3,先判断应急预案和应急演练的所在单元格位置的行数,然后向下便利,同时,对于空行进行忽略,直到遍历到填表说明结束。

如此就实现了对所有工作簿中工作表的汇总。

三、代码

代码如下:

import os
from openpyxl import Workbook
from openpyxl import load_workbook
import time
start = time.time()wb0 = Workbook()  # 新建工作簿
ws0 = wb0.active
ws0.append(['管理单位', '填报人', '联系电话', '企业名称', '危货名称', '危货类别', '2018年运输量', '2019年运输量', '2020年运输量','2021年1-8月运输量', '运输主要途经道路(成都市域内)', '出行类别', '流向情况', '出发地', '目的地'])  # 添加表头
ws0.title = '流量流向情况'
ws1 = wb0.create_sheet('安全培训情况')  # 新建工作表
ws1.append(['管理单位', '填报人', '联系电话', '企业名称','培训人员类别', '2018年开展培训次数', '2019年开展培训次数', '2020年开展培训次数', '2021年开展培训次数', '是否保留台账'])
ws2 = wb0.create_sheet('应急预案情况')
ws2.append(['管理单位', '填报人', '联系电话', '企业名称', '应急预案名称', '最近修改日期'])
ws3 = wb0.create_sheet('应急演练情况')
ws3.append(['管理单位', '填报人', '联系电话', '企业名称', '应急演练名称', '演练日期', '演练人数', '组织单位', '参与单位', '演练地点'])def get_address(file_dir):i = 0for root, dirs, files in os.walk(file_dir):  # 利用os.walk()函数来遍历文件夹输出文件名for file in files:i += 1dir1 = os.path.join(root, file)  # 连接根目录和文件名# print(dir1)deal_excel(dir1)def deal_excel(file_dir):print("当前打开文件地址为:" + file_dir)a0 = file_dir.split("\\", )[-2]  # 返回文件夹名print("文件所在的文件夹为:" + a0)wb = load_workbook(file_dir)  # 加载工作簿print(wb.sheetnames)ws = wb.activea = ws.cell(3, 2).value  # 填报人姓名b = ws.cell(3, 7).value  # 电话c = ws.cell(4, 2).value  # 企业名称list1 = [str(a0), str(a), str(b), str(c)]  # 存储表头max1 = ws.max_row  # 获取工作表最大行数# 以下处理表1for i in range(7, max1 - 34 + 1):  # 从第7行开始向下遍历list2 = []  # 存储行数据x = ws.cell(i, 1).valueif x == '填写说明:':  # 判断是否到达“填写说明:”单元格所在行breakelse:if ws.cell(i, 1).value is None and ws.cell(i, 2).value is None and ws.cell(i, 3).value is None:continue  # 当遍历到空行时,利用continue啥也不做else:for j in range(1, 12):  # 遍历工作表行数据d = ws.cell(i, j).valuelist2.append(str(d))list3 = list1 + list2  # 与表头信息合并ws0.append(list3)  # 添加到新建工作簿活动工作表中# 以下处理表2for i in range(5, 9):list4 = []  # 存储行数据for j in range(13, 19):e = ws.cell(i, j).valuelist4.append(str(e))list5 = list1 + list4ws1.append(list5)# 以下处理表3第1部分for i in range(1, max1 + 1):x = ws.cell(i, 13).valueif x != '应急预案名称':continue  # 从上下行进行遍历,判断第13列单元格的值是否为’应急预案名称‘,不是就继续向下。else:for j in range(i + 1, max1 + 1):x = ws.cell(j, 13).valueif x == '填写说明:':  # 判断是否到达“填写说明:”单元格所在行breakelse:# 处理预案部分list6 = []f = ws.cell(j, 13).valueg = ws.cell(j, 14).valueif f is None and g is None:continue  # 对空行进行排除else:list6.append(str(f))list6.append(str(g))list7 = list1 + list6ws2.append(list7)# 以下处理表3第2部分for i in range(1, max1 + 1):x = ws.cell(i, 15).valueif x != '应急演练名称':continue  # 从上下行进行遍历,判断第13列单元格的值是否为’应急演练名称‘,不是就继续向下。else:for j in range(i + 1, max1 + 1):x = ws.cell(j, 13).valueif x == '填写说明:':  # 判断是否到达“填写说明:”单元格所在行breakelse:list8 = []if ws.cell(j, 15).value is None and ws.cell(j, 16).value is None and ws.cell(j, 17).value is None:continue  # 当遍历到空行时,利用continue啥也不做else:for k in range(15, 21):h = ws.cell(j, k).valuelist8.append(str(h))list9 = list1 + list8ws3.append(list9)get_address(r"E:\补充调研")
wb0.save("汇总表.xlsx")
end = time.time()
print(end-start)

总结

运行代码后,得到如下所示汇总表。112个表格总共用时不到10秒,真来丝。

利用python openpyxl库实现对多个excel工作簿的快速汇总相关推荐

  1. 使用 Python 第三方库 xlwt 写入数据到 Excel 工作表

    使用 Python 第三方库 xlwt 写入数据到 Excel 工作表 1. 安装 xlwt 库 2. 使用 xlwt 库 2.1 向 Excel 工作表写入单个数据 2.2 向 Excel 工作表写 ...

  2. python 读取geotiff_科学网—利用python GDAL库读写geotiff格式的遥感影像方法 - 张伟的博文...

    (1)利用python GDAL库读写geotiff格式的遥感影像方法,具有很好的参考价值,不错! from osgeo import gdal import numpy as np def read ...

  3. 利用python you-get库下载网络视频、音乐及图片

    Python,让繁琐工作高效便捷:利用python you-get库单个.批量下载网络视频.音乐及图片,you-get命令需要在cmd窗口中运行. 很多人学习python,不知道从何学起. 很多人学习 ...

  4. 霍兰德人格分析:利用Python第三方库matplotlib绘制雷达图

    美国约翰霍普金斯大学霍兰德教授认为,个人职业兴趣特性与职业之间应有一种内在的对应关系.根据兴趣的不同,人格可分为研究型(I).艺术型(A).社会型(S).企业型(E).传统型(C).现实型(R)六个维 ...

  5. python读取tiff影像_科学网—利用python GDAL库读写geotiff格式的遥感影像方法 - 张伟的博文...

    (1)利用python GDAL库读写geotiff格式的遥感影像方法,具有很好的参考价值,不错! from osgeo import gdal import numpy as np def read ...

  6. 利用python机器学习库进行Kaggle皮马印第安人糖尿病预测分析

    利用python机器学习库进行Kaggle皮马印第安人糖尿病预测分析 项目摘要 本项目主要使用python对各医学参数与糖尿病之间的关系进行可视化分析.描述性分析.使用scikit-learn机器学习 ...

  7. Python操作Excel工作簿的示例代码(.xlsx)

    前言 Excel 作为流行的个人计算机数据处理软件,混迹于各个领域,在程序员这里也是常常被处理的对象,可以处理 Excel 格式文件的 Python 库还是挺多的,比如 xlrd.xlwt.xluti ...

  8. Python操作Excel工作簿(\*.xlsx)

    文章目录 前言 EXCEL文件 测试环境 Excel具体操作 `xlrd`.`xlwt`.`xlutils` `openpyxl` `xlwings` 使用 `xlwings` 的基本方式: 创建一个 ...

  9. Python 多excel工作簿 多sheet工作表合并

    项目场景: 遇到需要多个excel工作簿.多sheet工作进行合并,但又不想买WPS会员和VBA,就可以借助python进行一个简单的程序编写从而解决. 问题描述 将以上三个工作簿,及其对应工作表表进 ...

  10. python获取excel数据进行判断输出结果到excel,如何使用python xlrd/xlwt从一个excel工作簿提取数据并输出到另一个excel工作簿?...

    我正在为xlutils.xlrd和xlwt创建一个名为excel functions的类,最终我可能会创建一个库.如果你有兴趣帮我做一个删除工作表的功能. 您可能希望转向openpyxl和/或pyex ...

最新文章

  1. 解决导航守卫router.beforeResolve使用不了this.$store
  2. C++ (14) 异常处理
  3. springMVC 与mybatis 整合 demo(maven 工程)
  4. 佟年计算机天才不会打游戏,《亲爱的热爱的》佟年爱得卑微?其实是韩商言,爱得不够勇敢...
  5. 为什么这么多烂代码?
  6. 目录操作相关的系统函数
  7. Swagger2的使用
  8. 2020年12月最新OneDrive网盘免费领取5TB教程
  9. CentOs基础操作指令(压缩、定时任务调度)
  10. 计算机怎么切换到音乐,电脑怎么换开关机背景音乐?电脑换开关机背景音乐的方法...
  11. 一道很简单却也很容易入坑的java面试题
  12. [转载] python如何删除对象属性_Python3基础 delattr 删除对象的属性
  13. NDT 算法和一些常见配准算法
  14. 自动驾驶车辆控制 最终项目作业 实现分析
  15. 普渡斩获双奖——“2020年度科创人物”、“2020杰出科技抗疫奖”!
  16. 用html做七巧板的方法,纯CSS3打造七巧板
  17. 用计算机弹音乐的歌谱《奇迹再现》,奇迹再现曲谱_奇迹再现的歌谱
  18. wp 主题,wp 主题大全,wp 主题模板
  19. Lubuntu下启用Compiz
  20. File和Filelnfo类

热门文章

  1. 宽带连接720错误代码解决办法
  2. 从IEEE购买合法MAC地址教程
  3. 情商高的人所看透的四种人生真相
  4. 测量电源纹波-正确测量方法
  5. FTP服务器 虚拟用户 530 Login incorrect. Login failed 解决办法
  6. 计算逻辑单元(ALU)和存储单元
  7. 客户端SDK测试是什么?如何测?
  8. 笔记本插入耳机没反应 必须重启前插入再启动才行 启动后拔下再插入依旧外放
  9. github连接显示隐私设置错误的解决方案
  10. 医院基本流程-挂号收费