当前位置:   article > 正文

openpyxl——多表合并以及数据汇总_openpyxl合并单元格并写入数据

openpyxl合并单元格并写入数据

目录

1.前言

2.需求

3.处理思路

4.可优化模式

5.源代码


1.前言

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

2.需求

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

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

一月账单
二月账单

        预计的结果表如下图所示 

汇总表

        

3.处理思路

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

  1. # 导入模块
  2. from openpyxl import load_workbook,Workbook
  3. # 打开表格
  4. wb=load_workbook('T31.xlsx')
  5. # 根据表名取表,先打开一月账单
  6. ws=wb['一月账单']
  7. # 获取表头
  8. list1=[]
  9. for i in ws[1]:
  10. list1.append(i.value)

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

  1. # 创建新表
  2. wb2=Workbook()
  3. ws2=wb2.active
  4. # 先将表头写入新表
  5. ws2.append(list1)

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

  1. # 遍历表格获取数据
  2. for row in ws.iter_rows(min_row=2,values_only=True):
  3. # 判断是否为空行,剔除掉空行
  4. if not all(i is None for i in row):
  5. ws2.append(row)
  6. # 根据表名取表,再打开二月账单
  7. ws_two=wb['二月账单']
  8. for row2 in ws_two.iter_rows(min_row=2,values_only=True):
  9. # 判断是否为空行,剔除掉空行
  10. if not all(i is None for i in row2):
  11. 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判断不会成立,不会执行下面的写入操作,于是就达到了一个剔除空白行的作用。

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

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

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

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

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

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

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

4.可优化模式

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

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

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

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

5.源代码

  1. # 导入模块
  2. from openpyxl import load_workbook,Workbook
  3. # 打开表格
  4. wb=load_workbook('T31.xlsx')
  5. # 根据表名取表,先打开一月账单
  6. ws=wb['一月账单']
  7. print(wb.sheetnames)
  8. # 获取表头
  9. list1=[]
  10. for i in ws[1]:
  11. list1.append(i.value)
  12. # 创建新表
  13. wb2=Workbook()
  14. ws2=wb2.active
  15. # 先将表头写入新表
  16. ws2.append(list1)
  17. # 遍历表格获取数据
  18. for row in ws.iter_rows(min_row=2,values_only=True):
  19. # 判断是否为空行,剔除掉空行
  20. if not all(i is None for i in row):
  21. ws2.append(row)
  22. # 根据表名取表,再打开二月账单
  23. ws_two=wb['二月账单']
  24. for row2 in ws_two.iter_rows(min_row=2,values_only=True):
  25. # 判断是否为空行,剔除掉空行
  26. if not all(i is None for i in row2):
  27. ws2.append(row2)
  28. # 循环遍历新表,以行获取,对消费金额一列的数据进行求和
  29. # sum=0 # 定义sum变量存储结果
  30. # n=2 # 定义n变量记录行数
  31. # for row3 in ws2.iter_rows(min_row=2):
  32. # sum+=int(row3[1].value)
  33. # n+=1
  34. sum=0
  35. n=2 # 定义n变量记录行数
  36. for row3 in ws2['B']:
  37. if row3.value=='消费金额':
  38. continue
  39. sum+=int(row3.value)
  40. n+=1
  41. # 循环结束后,由n和字母B拼接出要写入计算结果的单元格坐标
  42. ws2['A'+str(n)].value='总和'
  43. ws2['B'+str(n)].value=sum
  44. # 保存文件
  45. wb2.save('T32.xlsx')

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号