本节介绍几个比较实用的综合实例,通过实战来加强对xlwings包的学习和理解。[大谦Excel,dqexcel点com]
批量新建和删除工作表
使用xlwings包可以批量新建和删除工作表。
一、批量新建工作表
图2-31 批量新建工作表
【xlwings】
本例在xlwings API使用方式下,使用for循环,利用Worksheets对象的Add方法批量新建工作表。
1 import xlwings as xw
2 app=xw.App()
3 bk=app.books(1)
4 for i in range(1,11):
5 bk.api.Worksheets.Add(After=bk.api.Worksheets(bk.api.Worksheets.Count))
第1行导入xlwings包,别名为xw。
第2行和第3行创建Excel应用对象和工作簿对象。
第2-5行用1个for循环批量新建10个工作表,新建的工作表放在所有工作表的最后面。
在Python IDLE文件脚本窗口,在"Run"菜单中单击"Run Module"选项,批量新建10个工作表如图2-33所示。
二、批量删除工作表
【xlwings】
本例使用for循环,利用Sheets对象的Delete方法批量删除指定工作簿中的工作表。该工作簿文件的存放路径为Samples\ch04\示例1-2\test01.xlsx,其中共有11个工作表,编号从1-11从前往后依次排列。
1 import xlwings as xw
2 import os
3 root=os.getcwd()
4 app=xw.App(visible=True, add_book=False)
5 bk=app.books.open(fullname=root+r"\test01.xlsx",read_only=False)
6 app.display_alerts=False
7 for i in range(11,1,-1):
8 bk.api.Sheets(i).Delete()
9 app.display_alerts=True
第1-2行导入xlwings包和os包。
第3行获取本py文件所在的目录,即当前目录。
第4行创建Excel应用对象,设置visible参数的值为True,使应用可见;设置add_book参数的值为False,不添加工作簿。
第5行用books对象的open方法打开当前目录下的test01.xlsx文件,返回工作簿对象。设置read_only参数的值为False,可写,即可以在删除工作表后保存工作簿文件。
第6行设置Excel应用对象app的display_alerts属性的值为False,后面删除工作表的时候不弹出提示信息对话框。
第7-8行用1个for循环实现批量删除10个工作表。
第9行将app的display_alerts属性的值恢复为True。
在Python IDLE文件脚本窗口,在"Run"菜单中单击"Run Module"选项,从后往前批量删除10个工作表。
按工作表某列分类拆分到多个工作表
现有各部门工作人员信息如图2-32处理前工作表中所示。现在要根据第1列的值对工作表数据进行拆分,每个部门的人员信息归总到一起组成一个新表,表的名称为该部门的名称。拆分的思路是遍历工作表的每一行,如果以部门名称命名的工作表不存在,则创建该名称的新表;如果已经存在,则将该行信息追加到该已经存在的工作表中。
图2-32 按部门拆分工作表到多个新表
下面用xlwings包进行拆分。
【xlwings】
使用xltings包进行拆分的代码如下所示。数据文件的存放路径为Samples\ch04\示例2\各部门员工.xlsx。
1 import xlwings as xw
2 from xlwings.constants import Direction
3 import os
4 root = os.getcwd() #获取当前工作目录,即本py文件所在目录
5 app=xw.App(visible=True, add_book=False)
6 bk=app.books.open(fullname=root+r"\各部门员工.xlsx",read_only=False)
7 app.screen_updating=False
8 app.display_alerts=False
9 sht=bk.sheets(1) #获取“汇总”工作表
10 irow=sht.api.Range("A"+str(sht.api.Rows.Count)).End(Direction.xlUp).Row
11 strs=[]
12 #遍历数据表的每一行
13 for i in range(2,irow+1):
14 sht2=bk.api.Worksheets("汇总")
15 strt=sht2.Range("A"+str(i)).Text #获取该行所属部门名称
16 if(strt not in strs):
17 #如果是新部门,添加名称到strs列表,复制表头和数据
18 strs.append(strt)
19 bk.api.Worksheets.Add(After=bk.api.Worksheets(bk.api.Worksheets.Count))
20 bk.api.ActiveSheet.Name = strt
21 bk.api.Worksheets("汇总").Rows(1).Copy(bk.api.ActiveSheet.Rows(1))
22 bk.api.Worksheets("汇总").Rows(i).Copy(bk.api.ActiveSheet.Rows(2))
23 else:
24 #如果是已经存在的部门名称,直接追加数据行
25 bk.api.Worksheets(strt).Select()
26 r=bk.api.ActiveSheet.Range("A"+\
27 str(bk.api.ActiveSheet.Rows.Count)).\
28 End(Direction.xlUp).Row + 1
29 bk.api.Worksheets("汇总").Rows(i).\
30 Copy(bk.api.ActiveSheet.Rows(r))
31
32 #删除新生成的工作表的第一列
33 for i in range(1,bk.api.Worksheets.Count+1):
34 bk.api.Worksheets(i).Columns(1).Delete()
35
36 app.screen_updating=True
37 app.display_alerts=True
第1-3行导入xlwings包、xlwings.constants模块中的Direction类和os包。
第4行获取py文件所在的目录,即当前目录。
第5行创建Excel应用对象,设置visible参数的值为True,使应用可见;设置add_book参数的值为False,不添加工作簿。
第6行用books对象的open方法打开当前目录下的各部门员工.xlsx文件,返回工作簿对象。设置read_only参数的值为False,可写,即可以在添加工作表后保存工作簿文件。
第7-8行设置Excel应用对象app的screen_updating和display_alerts属性的值为False,取消窗口重画和警告提示信息对话框的显示。
第9-10行获取工作簿中的第1个工作表,获取该工作表中数据区域的行数。
第11行创建空列表strs,列表中的元素对应于已经存在的部门工作表的名称。
第12-30行遍历数据表中各行,实现工作表按部门取值进行拆分。
第14行获取“汇总”工作表。
第15行获取当前行第1个单元格中的文本,即部门名称。
第16-30行判断刚刚获取的部门名称是否被包含在strs列表中,如果不在,就创建新表添加数据;如果在,则将该行数据追加到与部门名称同名的工作表中。
第18-22行向strs列表中追加部门名称,添加工作表到所有工作表末尾,名称为部门名称。将“汇总”表的表头复制到新表第1行,将该行数据复制到新表第2行。
第25-30行计算与部门名称同名的工作表中数据区域的下一行行号,将“汇总”表中当前行的数据复制过来。
第33-34行用for循环删除新生成的工作表的第1列,即“部门”列。
第36-37行恢复Excel应用对象的ScreenUpdating和DisplayAlerts属性的值为True。
在Python IDLE文件脚本窗口,在"Run"菜单中单击"Run Module"选项,进行工作表拆分。拆分效果如图2-32中处理后各工作表中所示。
将多个工作表分别保存为工作簿
现有各部门工作人员信息如图2-33处理前工作表中所示。不同部门工作人员的信息单独放在一个工作表中,现在要将不同工作表中的数据单独保存为工作簿文件。
图2-33 将多个工作表分别保存为工作簿文件
下面用xlwings包将各工作表数据保存为单独的工作簿文件。
【xlwings】
使用xlwings包来实现的代码如下所示。
1 import xlwings as xw
2 import os
3 root = os.getcwd()
4 app=xw.App(visible=True, add_book=False)
5 bk=app.books.open(fullname=root+r"\各部门员工.xlsx",read_only=False)
6 app.screen_updating=False
7 for sht in bk.api.Worksheets: #遍历每个工作表,分别保存
8 sht.Copy()
9 app.api.ActiveWorkbook.SaveAs(root+"\\"+sht.Name+".xlsx", 51)
10 app.api.ActiveWorkbook.Close()
11
12 app.screen_updating=True
第1-2行导入xlwings和os包。
第3行获取py文件所在的目录,即当前目录。
第4行创建Excel应用对象,设置visible参数的值为True,使应用可见;设置add_book参数的值为False,不添加工作簿。
第5行用books对象的open方法打开当前目录下的各部门员工.xlsx文件,返回工作簿对象。设置read_only参数的值为False,可写,即可以在添加工作表后保存工作簿文件。
第6行设置Excel应用对象app的screen_updating属性的值为False,取消窗口重画。
第7-10行用1个for循环遍历各工作表,实现各工作表数据的单独保存。
第8行用不带参数的Copy方法创建一个新的工作簿并将原始工作表中的数据拷贝过来。新创建的工作簿即为活动工作簿。
第9行把活动工作簿中的数据保存到文件,文件名称为原始工作表的名称。
第10行关闭新生成的工作簿。
第12行恢复Excel应用对象的screen_updating属性的值为True。
在Python IDLE文件脚本窗口,在"Run"菜单中单击"Run Module"选项,保存各工作表中的数据。处理效果如图2-33中处理后各工作表中所示。
将多个工作表合并到一个工作表
2.7.2小节将一个工作表根据某个列的值拆分为多个工作表,这里反过来,将多个工作表中的数据合并到一个工作表。
现有各部门工作人员信息如图2-34处理前工作表中所示。不同部门工作人员的信息单独放在一个工作表中,现在要将不同工作表中的数据合并到“汇总”工作表中,并添加“部门”列,列的值为数据来源工作表的表名。
图2-34 多个工作表合并为一个工作表
下面用xlwings包将各工作表数据合并到“汇总”工作表。
【xlwings】
使用xlwings包来实现的代码如下所示。
1 import xlwings as xw
2 from xlwings.constants import Direction
3 import os
4 root = os.getcwd()
5 app=xw.App(visible=True, add_book=False)
6 bk=app.books.open(fullname=root+r"\各部门员工.xlsx",read_only=False)
7 sht= bk.api.Worksheets("汇总")
8 #清空“汇总”表
9 sht.Cells.Clear()
10 #复制表头
11 sht.Range("A1").Value = "部门"
12 bk.api.Worksheets(1).Range("A1:D1").Copy(sht.Range("B1"))
13 #遍历"汇总"工作表外的每个工作表
14 for shtt in bk.api.Worksheets:
15 if shtt.Name!= "汇总":
16 rngt=shtt.Range("A2",shtt.Cells(shtt.\
17 Range("A"+str(shtt.Rows.Count)).\
18 End(Direction.xlUp).Row,4))
19 row=sht.Range("A1").CurrentRegion.Rows.Count+1
20 rngt.Copy(sht.Cells(row,2)) #复制数据
21 #在第一列添加部门名称
22 rt=sht.Range("A"+str(sht.Rows.Count)).\
23 End(Direction.xlUp).Row + 1
24 row2=shtt.Range("A1").CurrentRegion.Rows.Count-1
25 rt2=rt+row2
26 for i in range(rt,rt2):
27 sht.Cells(i,1).Value=shtt.Name
第1-3行导入xlwings包、xlwings.constants模块的Direction类和os包。
第4行获取py文件所在的目录,即当前目录。
第5行创建Excel应用对象,设置visible参数的值为True,使应用可见;设置add_book参数的值为False,不添加工作簿。
第6行用books对象的open方法打开当前目录下的各部门员工.xlsx文件,返回工作簿对象。设置read_only参数的值为False,可写,即可以在添加工作表后保存工作簿文件。
第7行获取“汇总”工作表。
第9行清空“汇总”工作表。
第11-12行把第1个工作表的表头复制到“汇总”表B1到E1单元格,A1单元格添加“部门”。
第12-27行用1个for循环遍历各工作表,将各部门工作表的数据复制粘贴到“汇总”工作表,并在第1列添加对应的部门名称。
第16-20行将各部门工作表的数据复制粘贴到“汇总”工作表。第16-18行实为1行,用斜杠表示续行。该行取得源工作表的数据区域。第19行获取“汇总”工作表中当前数据区域的行数,将行数加1即为追加数据的起始位置。第20行用Copy方法将源数据复制到“汇总”工作表。
第22-27行在“汇总”工作表的第1列添加部门名称。变量rt和rt2记录该次追加数据在“汇总”工作表中的起始行和终止行。第26-27行用for循环将当前工作表的名称作为“部门”列的值进行添加。
在Python IDLE文件脚本窗口,在"Run"菜单中单击"Run Module"选项,合并各工作表中的数据到”汇总“工作表,并添加”部门“列。处理效果如图2-34中处理后“汇总“工作表中所示。