实现对excel文件中多个sheet的拼接

用到的Python模块如下:

  • xlrd
  • pandas
  • openpyxl

xlrd、pandas、openpyxl


1、python操作excel主要用到xlrd和xlwt这两个库,即xlrd是读excel,xlwt是写excel的库。
2、pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。你很快就会发现,它是使Python成为强大而高效的数据分析环境的重要因素之一。pandas具体的用法可以参考博客

https://blog.csdn.net/liufang0001/article/details/77856255/
3、openpyxl模块是一个读写Excel 2010文档的Python库,如果要处理更早格式的Excel文档,需要用到额外的库,openpyxl是一个比较综合的工具,能够同时读取和修改Excel文档。其他很多的与Excel相关的项目基本只支持读或者写Excel一种功能。openpyxl中有三个不同层次的类,Workbook是对工作簿的抽象,Worksheet是对表格的抽象,Cell是对单元格的抽象,每一个类都包含了许多属性和方法。

Excel工作簿结构
想要解决的Excel工作簿如图:
sheets:

N个sheet

每个sheet的结构相同:字段相同

那我们就可以用下面的程序实现所有sheet进行合并,并且把合并的数据保存到新的sheet中。详细代码如下:

# -*- coding: UTF-8 -*-
#导入所需模块
import xlrd
import pandas as pd
from  pandas import DataFrame
from openpyxl import load_workbook

excel_name = r'E:\A寒假\4_step\foring_pr.xlsx'  #表格地址+表格名
wb = xlrd.open_workbook(excel_name)  # 获取workbook中所有的表格
sheets = wb.sheet_names()
print (sheets)

# 循环遍历所有sheet
alldata = DataFrame()
for i in range(len(sheets)):
    df = pd.read_excel(excel_name, sheet_name=i, index=False, encoding='utf8')
    alldata = alldata.append(df)
#查看dataframe
#print alldata

#保存为新的sheet,首先新建sheet,合并后的数据保存到新sheet中
writer = pd.ExcelWriter(r'E:\A寒假\4_step\foring_pr.xlsx',engin='openpyxl')
book = load_workbook(writer.path)
writer.book = book

#利用dataframe.to_excel保存合并后的数据到新的sheet
alldata.to_excel(excel_writer=writer,sheet_name="ALLDATA")#生成新的sheet命名为ALLDATA
writer.save()
writer.close()
print ('OK!')



查看结果
执行上面的程序,打开处理的Excel工作簿,你会发现其中多出一个名为ALLDATA的sheet,此sheet即为目标sheet,存储的是所有合并后的数据。如图:

————————————————
版权声明:本文为CSDN博主「iseeyounow2017」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/iseeyounow2017/article/details/81781668

同样可以在excel中实现:

新建一个总表,准备汇总Alt+F11,

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-81qb4O3j-1581330044539)(en-resource://database/448:1)]

在弹出的新界面中,左键双击坐标的名为”总表“的工作表,使后续的代码是复制到这个工作表中。

Sub main()
For Each sh In Sheets
If sh.Name <> "总表" Then
i = sh.Range("ALG65536").End(3).Row
k = Range("A65536").End(3).Row
sh.Range("A1:ALG" & i).Copy Range("A" & k + 1)
End If
Next
End Sub

代码详解:
a.Sub main()——其中Sub 跟括号是固定的,main是宏名,可以随便更改(其实完全没有必要多此一举,这里可以不做任何修改)
b.For Each sh In Sheets——这是遍历全部的工作表,这里就要注意,如果你的工作表中包含一些,不需要汇总数据的工作表,那么就需要将源数据表备份一份,然后将不需要汇总数据的工作表都删除掉,只剩下总表以及需要汇总数据的工作表(当然,还有其他办法,这里只讲解最简单地做法)
c.If sh.Name < >’‘总表’’ Then——这里是判断工作表的名字是不是”总表“,如果是总表,就不汇总数据,本例中总表的名字就是”总表“,如果你的工作表中,总表名字是其他的,就将这里的”总表“改为你的工作总表明细;
d.i = sh.Range(’‘D65536’’).End(3).Row——这里要注意(’‘D65536’’),是为了获得最后一个不为空的行的行号,这里用了D列,因为本例中的D列是有数据的,在实际的使用过程中,一定要选择一个最后一列有数据的列,65536代表excel最大值。否则不能获得最大行号(假如只有2列,那么这里的D可以改为B或者A)
e.k = Range(’‘A65536’’).End(3).Row——这里是获得总表的最大行号,以便复制的数据,能够依次往下粘贴;(这里的A65536跟上面提到的是一个道理,总表中的A列最后一行不是空的)f.sh.Range(’‘A2:D’’&i).Copy Range(’‘A’’ & k + 1)——这里要注意’‘A2:D’’&i是要复制的区域,因为本例中只有A-D列,而且数据是从第2行开始的,所以这里是A2:D,那假如是从E列第10行开始,到Z列结束的区域,就应该改为E10:Z;
Range(’‘A’’ & k + 1)——这里是从总表的A列开始粘贴,假如是从D列开始,那么这里的A改为D即可
g.End If
Next
End Sub——这些是结束判断、继续循环和程序结束,都不需要更改。保存执行代码
————————————————
 

发布了25 篇原创文章 · 获赞 7 · 访问量 2799

猜你喜欢

转载自blog.csdn.net/SDAU_LY124/article/details/104296989