openpyxl——多表合并以及数据汇总

目录

1.前言

2.需求

3.处理思路

4.可优化模式

5.源代码


1.前言

        日常工作中可能会遇到需要将多个表格的数据汇总到一张表格中,并对汇总表里面的数据进行汇总计算

2.需求

        T31.xlsx文件中有两个子表,分别是“一月账单”和“二月账单”

         先需要将这两个表格中的数据汇总,存成一个新的文件,并对数据进行汇总计算

一月账单
二月账单

        预计的结果表如下图所示 

汇总表

        

3.处理思路

        为了不做多余的表头写入,首先从第一个表格中提取出表头用列表存储好

# 导入模块
from openpyxl import load_workbook,Workbook

# 打开表格
wb=load_workbook('T31.xlsx')
# 根据表名取表,先打开一月账单
ws=wb['一月账单']

# 获取表头
list1=[]
for i in ws[1]:
    list1.append(i.value)

         创建一个新表,先将表头写入,因为要循环遍历多个表格但是表头只需要写入一次

# 创建新表
wb2=Workbook()
ws2=wb2.active

# 先将表头写入新表
ws2.append(list1)

         开始循环遍历“一月账单”表和“二月账单”表,并将数据添加进新表中

# 遍历表格获取数据
for row in ws.iter_rows(min_row=2,values_only=True):
    # 判断是否为空行,剔除掉空行
    if not all(i is None for i in row):
        ws2.append(row)

# 根据表名取表,再打开二月账单
ws_two=wb['二月账单']
for row2 in ws_two.iter_rows(min_row=2,values_only=True):
    # 判断是否为空行,剔除掉空行
    if not all(i is None for i in row2):
        ws2.append(row2)

        注意:不排除表格中存在中间有空白行的情况,所以需要将空白行进行剔除

        语法解读:if not all(i is None for i in row):

        for i in row,对row中的数据进行遍历,依次存储进i中,判断i是否是None类型,前置all判断所有的i都是否是None,如果是空白行,all(i is None for i in row)会返回一个True

        这时候if not all(i is None for i in row): 相当于是 if not True:,所以if判断不会成立,不会执行下面的写入操作,于是就达到了一个剔除空白行的作用。

        当两个表格的数据都汇总之后,对汇总表的数据进行计算

sum=0
n=2 # 定义n变量记录行数
for row3 in ws2['B']:
    if row3.value=='消费金额':
        continue
    sum+=int(row3.value)
    n+=1

        这里我定义一个变量sum用来存储最后的计算结果,变量n赋值初始值为2,因为是从第2行开始计算,for循环遍历新表中的B列,用if来跳过表头单元格,最后进行累加

        因为最后写入总和的时候要在最大数据行的下一行进行写入,所以设置变量n来计算行数的变化

        计算得到结果之后,需要将数据写入表格

# 循环结束后,由n和字母B拼接出要写入计算结果的单元格坐标
ws2['A'+str(n)].value='总和'
ws2['B'+str(n)].value=sum

        直接利用单元格坐标来写入对应的数据即可

4.可优化模式

        当一个xlsx文件中存在很多个子表时,很显然,利用表名来获取表格对象是行不通的,工作量会异常庞大,这时候我们可以利用工作簿对象的sheetnames属性来获取出文件中所有的表名列表,然后循环遍历这个列表即可得到单个的表名

sheet_list=wb.sheetnames
for name in sheet_list:
    ws=wb[name]

        累加计算数据结果的时候也可以按行来获取数据

# 循环遍历新表,以行获取,对消费金额一列的数据进行求和
sum=0 # 定义sum变量存储结果
n=2 # 定义n变量记录行数
for row3 in ws2.iter_rows(min_row=2):
    sum+=int(row3[1].value)
    n+=1

5.源代码

# 导入模块
from openpyxl import load_workbook,Workbook

# 打开表格
wb=load_workbook('T31.xlsx')
# 根据表名取表,先打开一月账单
ws=wb['一月账单']
print(wb.sheetnames)

# 获取表头
list1=[]
for i in ws[1]:
    list1.append(i.value)

# 创建新表
wb2=Workbook()
ws2=wb2.active

# 先将表头写入新表
ws2.append(list1)

# 遍历表格获取数据
for row in ws.iter_rows(min_row=2,values_only=True):
    # 判断是否为空行,剔除掉空行
    if not all(i is None for i in row):
        ws2.append(row)

# 根据表名取表,再打开二月账单
ws_two=wb['二月账单']
for row2 in ws_two.iter_rows(min_row=2,values_only=True):
    # 判断是否为空行,剔除掉空行
    if not all(i is None for i in row2):
        ws2.append(row2)

# 循环遍历新表,以行获取,对消费金额一列的数据进行求和
# sum=0 # 定义sum变量存储结果
# n=2 # 定义n变量记录行数
# for row3 in ws2.iter_rows(min_row=2):
#     sum+=int(row3[1].value)
#     n+=1

sum=0
n=2 # 定义n变量记录行数
for row3 in ws2['B']:
    if row3.value=='消费金额':
        continue
    sum+=int(row3.value)
    n+=1

# 循环结束后,由n和字母B拼接出要写入计算结果的单元格坐标
ws2['A'+str(n)].value='总和'
ws2['B'+str(n)].value=sum


# 保存文件
wb2.save('T32.xlsx')

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值