本节介绍几个比较实用的综合实例,通过实战来加强对OpenPyXL包的学习和理解。[大谦Excel,dqexcel点com]
批量新建和删除工作表
使用OpenPyXL包可以批量新建和删除工作表。使用for循环,利用工作簿对象的create_sheet方法批量新建工作表。本示例的py文件保存路径为Samples\ch03\示例1-1中,文件名为sam03-101.py。
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所示。
图3-16 批量生成工作表
使用for循环,利用工作簿对象的remove方法批量删除指定工作簿中的工作表。该工作簿文件的存放路径为Samples\ch03\示例1-2\test.xlsx,其中共有11个工作表,如图3-16中所示。本示例的py文件保存在相同目录下,文件名为sam03-102.py。
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行;如果已经存在,则将该行信息追加到该已经存在的工作表中。
图3-17 按部门拆分工作表到多个新表
使用OpenPyXL包进行拆分的代码如下所示。数据文件的存放路径为Samples\ch03\示例2\各部门员工.xlsx。本示例的py文件保存在相同目录下,文件名为sam03-103.py。
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处理前工作表中所示。不同部门工作人员的信息单独放在一个工作表中,现在要将不同工作表中的数据单独保存为工作簿文件。
图3-18 将多个工作表分别保存为工作簿文件
使用OpenPyXL包来实现的代码如下所示。数据文件的存放路径为Samples\ch03\示例3\各部门员工.xlsx。本示例的py文件保存在相同目录下,文件名为sam03-104.py。
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处理前工作表中所示。不同部门工作人员的信息单独放在一个工作表中,现在要将不同工作表中的数据合并到“汇总”工作表中,并添加“部门”列,列的值为数据来源工作表的表名。
图3-19 多个工作表合并为一个工作表
使用OpenPyXL包来实现的代码如下所示。数据文件的存放路径为Samples\ch03\示例4\各部门员工.xlsx。本示例的py文件保存在相同目录下,文件名为sam03-105.py。
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中处理后“汇总“工作表中所示。