综合实例

本节介绍几个比较实用的综合实例,通过实战来加强对OpenPyXL包的学习和理解。[大谦Excel,dqexcel点com]

批量新建和删除工作表

使用OpenPyXL包可以批量新建和删除工作表。使用for循环,利用工作簿对象的create_sheet方法批量新建工作表。本示例的py文件保存路径为Samples\ch03\示例1-1中,文件名为sam03-101.py。

code.python
1	from openpyxl import Workbook
2	import os
3	root = os.getcwd()  #获取当前工作目录
4	wb = Workbook()
5	sht=wb.active
6	for i in range(1,11):  #新建10个工作表
7	    wb.create_sheet()
8	wb.save(root+"\\test.xlsx")

第1行从OpenPyXL包导入Workbook类。

第2行导入os包。

第3行获取本py文件所在的目录,即当前目录。

第4行用Workbook函数创建一个新的工作簿。

第5行获取工作簿中的活动工作表。

第6-7行用1个for循环批量新建10个工作表。新建工作表使用的是工作簿对象的create_sheet方法。

在Python IDLE文件脚本窗口,在"Run"菜单中单击"Run Module"选项,批量新建10个工作表如图3-16所示。

Document Image

图3-16 批量生成工作表

使用for循环,利用工作簿对象的remove方法批量删除指定工作簿中的工作表。该工作簿文件的存放路径为Samples\ch03\示例1-2\test.xlsx,其中共有11个工作表,如图3-16中所示。本示例的py文件保存在相同目录下,文件名为sam03-102.py。

code.python
1	from openpyxl import load_workbook
2	import os
3	root = os.getcwd()
4	wb = load_workbook(root+"\\test.xlsx")  #打开文件
5	for i in range(10,0,-1):  #批量删除工作表
6	    wb.remove(wb.worksheets[i])
7	wb.save(root+"\\test.xlsx")

第1行从OpenPyXL包导入load_workbook函数。

第2-3行导入os包,获取当前目录。

第4行用load_workbook函数打开当前目录下的test.xlsx文件,返回工作簿对象。

第5-6行用1个for循环实现批量删除10个工作表。注意range函数的参数,范围的起始位置和终止位置是从10到0,是从大到小的,步长为-1,递减。这样处理是因为连续删除时剩下的工作表在worksheets集合中的索引号不会变。如果从0到10,即从小到大迭代,把前面的工作表删除以后,后面工作表的索引号会自动减1,变动了,最后会导致出错。

第7行保存删除工作表后的工作簿文件。

在Python IDLE文件脚本窗口,在"Run"菜单中单击"Run Module"选项,从后往前批量删除10个工作表。

按工作表某列分类拆分到多个工作表

现有各部门工作人员信息如图3-17处理前工作表中所示。现在要根据第1列的值对工作表数据进行拆分,每个部门的人员信息归总到一起组成一个新表,表的名称为该部门的名称。拆分的思路是遍历工作表的每一行,如果以部门名称命名的工作表不存在,则创建该名称的新表,添加表头,把该行数据复制到第2行;如果已经存在,则将该行信息追加到该已经存在的工作表中。

Document Image

图3-17 按部门拆分工作表到多个新表

使用OpenPyXL包进行拆分的代码如下所示。数据文件的存放路径为Samples\ch03\示例2\各部门员工.xlsx。本示例的py文件保存在相同目录下,文件名为sam03-103.py。

code.python
1	from openpyxl import load_workbook
2	import os
3	root=os.getcwd()  #获取当前工作目录,即本py文件所在目录
4	wb=load_workbook(root+"\\各部门员工.xlsx")  #打开数据文件
5	#获取“汇总”工作表
6	sht=wb["汇总"]
7	irow=sht.max_row  #获取数据行数
8	strs=[]  #新建列表,用于保存已经新建工作表的名称
9	for i in range(2,irow+1):  #遍历每行数据
10	    strt=sht.cell(row=i,column=1).value  #获取该行所属部门名称
11	    if(strt not in strs):
12	        #如果是新部门,添加名称到strs列表
13	        strs.append(strt)
14	        sht1=wb.create_sheet(strt)  #新建工作表
15	        for j in range(1,sht.max_column):  #新工作表添加表头
16	            sht1.cell(row=1,column=j).value=\
17	                sht.cell(row=1,column=j).value
18	            sht1.cell(row=2,column=j).value=\  #数据拷到新工作表第2行
19	                sht.cell(row=i,column=j).value
20	    else:
21	        #如果是已经存在的部门名称,直接追加数据行
22	        r=wb[strt].max_row+1  #追加的位置
23	        for j in range(1,sht.max_column):  #追加数据行
24	            sht1.cell(row=r,column=j).value=\
25	                sht.cell(row=i,column=j).value
26
27	#删除新生成的工作表的第一列
28	for i in range(len(wb.worksheets)):
29	    sht1=wb.worksheets[i]
30	    if(sht1.title!="汇总"):
31	        sht1.delete_cols(1)
32
33	wb.save(root+"\\各部门员工.xlsx")

第1行从OpenPyXL包导入load_workbook函数。

第2-3行导入os包,获取当前目录。

第4行用load_workbook函数打开当前目录下的数据文件,返回工作簿对象。

第6-7行获取“汇总”工作表及其中数据区域的行数。

第8行创建一个新的列表strs,记录已经存在的部门工作表的名称。

第9-25行用1个for循环实现工作表的拆分。第9行遍历”汇总“表中各数据行。

第10行获取数据行第1个单元格中的部门名称。

第11-19行判断如果当前部门名称在strs中不存在,则把它添加到strs列表,并创建一个该名称命名的工作表。第15-19行用for循环复制“汇总”表表头到新表,复制“汇总”表中当前行数据到新表的第2行。

第20-25行如果当前部门名称在strs列表中已经存在,则把“汇总”表中当前行数据复制追加到同名工作表。

第28-31行删除新生成的工作表的第1列,即“部门”列。

第33行保存修改后的工作簿文件。

在Python IDLE文件脚本窗口,在"Run"菜单中单击"Run Module"选项,根据“部门”列的值进行工作表拆分。拆分效果如图3-17中处理后各工作表中所示。

将多个工作表分别保存为工作薄

现有各部门工作人员信息如图3-18处理前工作表中所示。不同部门工作人员的信息单独放在一个工作表中,现在要将不同工作表中的数据单独保存为工作簿文件。

Document Image

图3-18 将多个工作表分别保存为工作簿文件

使用OpenPyXL包来实现的代码如下所示。数据文件的存放路径为Samples\ch03\示例3\各部门员工.xlsx。本示例的py文件保存在相同目录下,文件名为sam03-104.py。

code.python
1	from openpyxl import load_workbook
2	from openpyxl import Workbook
3	import os
4	root = os.getcwd()
5	wb = load_workbook(root+"\\各部门员工.xlsx")  #打开数据文件
6	for sht in wb.worksheets:  #遍历每个工作表,分别保存
7	    row_min=sht.min_row
8	    row_max=sht.max_row
9	    col_min=sht.min_column
10	    col_max=sht.max_column
11	    wb1=Workbook()  #新建工作簿
12	    sht1=wb1.active
13	    for i in range(row_min,row_max+1):  #将数据拷贝到新工作簿
14	        for j in range(col_min,col_max+1):
15	            sht1.cell(row=i,column=j).value=\
16	                sht.cell(row=i,column=j).value
17	    wb1.save(root+"\\"+sht.title+".xlsx")  #保存新工作簿
18	    wb1.close()

第1-2行从OpenPyXL包导入load_workbook函数和Workbook类。

第3-4行导入os包,获取当前目录。

第5行用load_workbook函数打开当前目录下的数据文件,返回工作簿对象。

第6-16行实现将各工作表数据单独保存到一个文件。第6行遍历工作簿中各工作表。

第7-10行获取数据区域的范围,即行和列的最小值和最大值。

第11-12行创建一个新工作簿,获取其中的工作表。

第13-16行用嵌套的for循环将当前工作表中的数据复制到新工作簿中的工作表。

第17行保存新工作簿的数据到文件,文件名称为原始工作簿中当前工作表的名称。

第18行关闭新工作簿。

在Python IDLE文件脚本窗口,在"Run"菜单中单击"Run Module"选项,保存各工作表中的数据。处理效果如图3-18中处理后所示。

将多个工作表合并到一个工作表

2.4.2小节将一个工作表根据某个列的值拆分为多个工作表,这里反过来,将多个工作表中的数据合并到一个工作表。

现有各部门工作人员信息如图3-19处理前工作表中所示。不同部门工作人员的信息单独放在一个工作表中,现在要将不同工作表中的数据合并到“汇总”工作表中,并添加“部门”列,列的值为数据来源工作表的表名。

Document Image

图3-19 多个工作表合并为一个工作表

使用OpenPyXL包来实现的代码如下所示。数据文件的存放路径为Samples\ch03\示例4\各部门员工.xlsx。本示例的py文件保存在相同目录下,文件名为sam03-105.py。

code.python
1	from openpyxl import load_workbook
2	from openpyxl import Workbook
3	import os
4	root = os.getcwd()
5	wb = load_workbook(root+"\\各部门员工.xlsx")  #打开数据文件
6	sht=wb["汇总"]
7	sht.cell(row=1,column=1).value="部门"
8	sht1=wb.worksheets[1]
9	min_col=sht1.min_column
10	max_col=sht1.max_column
11	for i in range(min_col,max_col+1):  #复制表头
12	    sht.cell(row=1,column=i+1).value=sht1.\
13	                        cell(row=1,column=i).value
14  #遍历"汇总"工作表外的每个工作表
15	for sht2 in wb.worksheets:
16	    if sht2.title!= "汇总":
17		    #汇总表向下第1个空行
18	        max_row0=sht.max_row+1
19	        #部门表的数据范围
20	        min_col=sht2.min_column
21	        max_col=sht2.max_column
22	        min_row=sht2.min_row+1
23	        max_row=sht2.max_row
24
25	        #复制数据
26	        n=0
27	        for i in range(min_row,max_row+1):
28	            n+=1
29	            for j in range(min_col,max_col+1):
30	                sht.cell(row=max_row0+n-1,column=j+1).value=\
31	                                sht2.cell(row=i,column=j).value
32
33	        #在第一列添加部门名称
34	        rows0=max_row-min_row+1
35	        max_row1=max_row0+rows0-1
36	        for i in range(max_row0,max_row1+1):
37	            sht.cell(row=i,column=1).value=sht2.title
38
39	wb.save(root+"\\各部门员工.xlsx")

第1-2行从OpenPyXL包导入load_workbook函数和Workbook类。

第3-4行导入os包,获取当前目录。

第5行用load_workbook函数打开当前目录下的数据文件,返回工作簿对象。

第7-13行将第1个工作表的表头复制到“汇总”工作表第1行从B1开始的位置,A1的位置输入“部门”。

第15-37行将各部门工作表中的数据复制到“汇总”工作表。第15行遍历每个工作表,并在第1列添加对应的部门名称。

第15-31行将各部门工作表的数据复制粘贴到“汇总”工作表。第20-23行取得部门工作表中数据区域的范围,即行和列的最小值和最大值。第26-31行用for循环将部门工作表各单元格中的数据复制到“汇总”表对应的单元格。变量n帮助计算新数据在“汇总”工作表中插入的行号。

第33-37行在“汇总”工作表的第1列添加部门名称。变量rows0和max_row1记录该次追加数据在“汇总”工作表中的起始行和终止行。第36-37行用for循环将当前工作表的名称作为“部门”列的值进行添加。

第39行保存修改后的工作簿文件。

在Python IDLE文件脚本窗口,在"Run"菜单中单击"Run Module"选项,合并各工作表中的数据到”汇总“工作表,并添加”部门“列。处理效果如图3-19中处理后“汇总“工作表中所示。