综合实例

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

批量新建和删除工作表

使用xlwings包可以批量新建和删除工作表。

一、批量新建工作表

Document Image

图2-31 批量新建工作表

【xlwings】

本例在xlwings API使用方式下,使用for循环,利用Worksheets对象的Add方法批量新建工作表。

code.python
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从前往后依次排列。

code.python
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列的值对工作表数据进行拆分,每个部门的人员信息归总到一起组成一个新表,表的名称为该部门的名称。拆分的思路是遍历工作表的每一行,如果以部门名称命名的工作表不存在,则创建该名称的新表;如果已经存在,则将该行信息追加到该已经存在的工作表中。

Document Image

图2-32 按部门拆分工作表到多个新表

下面用xlwings包进行拆分。

【xlwings】

使用xltings包进行拆分的代码如下所示。数据文件的存放路径为Samples\ch04\示例2\各部门员工.xlsx。

code.python
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处理前工作表中所示。不同部门工作人员的信息单独放在一个工作表中,现在要将不同工作表中的数据单独保存为工作簿文件。

Document Image

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

下面用xlwings包将各工作表数据保存为单独的工作簿文件。

【xlwings】

使用xlwings包来实现的代码如下所示。

code.python
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处理前工作表中所示。不同部门工作人员的信息单独放在一个工作表中,现在要将不同工作表中的数据合并到“汇总”工作表中,并添加“部门”列,列的值为数据来源工作表的表名。

Document Image

图2-34 多个工作表合并为一个工作表

下面用xlwings包将各工作表数据合并到“汇总”工作表。

【xlwings】

使用xlwings包来实现的代码如下所示。

code.python
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中处理后“汇总“工作表中所示。