当xlwings模块的Book对象提供的属性和函数不能满足需求时,可通过api属性将Book对象转换为Excel VBA中的Workbook对象,再通过调用Workbook对象的属性和函数来完成所需的工作簿操作。本节将介绍Excel VBA中Workbook对象的一些常用属性和函数。
为了防止其他用户更改工作簿的结构,如在工作簿中移动、删除或插入工作表,可通过xlwings模块中Book对象的api属性调用VBA中Workbook对象的Protect()函数来保护工作簿的结构。其语法格式如下:
表达式.api.Protect(Password,Structure,Windows)
参数说明:
表达式:一个Book对象,通常用打开或新建工作簿的方式来创建。
Password:指定保护工作簿结构的密码。
Structure:当参数值为True时,表示保护工作簿的结构;当参数值为False或者省略该参数时,表示不保护工作簿的结构。
Windows:当参数值为True时,表示保护工作簿窗口;当参数值为False或者省略该参数时,表示不保护工作簿窗口。
应用场景 保护指定工作簿的结构
◎代码文件:Protect()函数.py
◎数据文件:员工档案表.xlsx
打开文件夹“F:\python\第2章”中的工作簿“员工档案表.xlsx”,右击任意工作表的标签,在弹出的快捷菜单中可看到工作表的插入、删除、移动或复制等命令为可用状态,如下图所示。
下面在Python代码中调用VBA中Workbook对象的Protect()函数来保护工作簿的结构。演示代码如下:
1 import xlwings as xw # 导入xlwings模块并简写为xw 2 app = xw.App(visible=False, add_book=False) # 启动Excel程序 3 workbook = app.books.open('F:\\python\\第2章\\员工档案表.xlsx') # 打开指定的工作簿 4 workbook.api.Protect(Password='111', Structure=True, Windows=True) # 保护指定工作簿的结构 5 workbook.save() # 保存工作簿 6 workbook.close() # 关闭工作簿 7 app.quit() # 退出Excel程序
运行以上代码后,打开工作簿“员工档案表.xlsx”,右击任意工作表的标签,在弹出的快捷菜单中可看到插入、删除、移动或复制等命令变为灰色的不可用状态,如下图所示,说明工作簿的结构被保护了。
如果要取消对工作簿结构的保护,可以调用VBA中Workbook对象的Unprotect()函数,并传入正确的保护密码作为参数。核心代码示例如下:
1 workbook.api.Unprotect(Password='111')
通过xlwings模块中Book对象的api属性调用VBA中Workbook对象的Password属性,然后为该属性赋值,可为工作簿设置打开密码,从而防止工作簿中的信息被泄露或者被更改。调用Password属性的语法格式如下:
表达式.api.Password
参数说明:
表达式:一个Book对象,通常用打开或新建工作簿的方式来创建。
应用场景 为指定工作簿设置打开密码
◎代码文件:Password属性.py
◎数据文件:员工档案表.xlsx
本案例要在Python代码中调用VBA中Workbook对象的Password属性,为文件夹“F:\python\第2章”中的工作簿“员工档案表.xlsx”设置打开密码。演示代码如下:
1 import xlwings as xw # 导入xlwings模块并简写为xw 2 app = xw.App(visible=False, add_book=False) # 启动Excel程序 3 workbook = app.books.open('F:\\python\\第2章\\员工档案表.xlsx') # 打开指定的工作簿 4 workbook.api.Password = '111' # 设置工作簿的打开密码为“111” 5 workbook.save() # 保存工作簿 6 workbook.close() # 关闭工作簿 7 app.quit() # 退出Excel程序
运行以上代码后,打开工作簿“员工档案表.xlsx”,将会弹出如右图所示的“密码”对话框,只有在“密码”文本框中输入正确的保护密码“111”,再单击“确定”按钮,才能打开工作簿。
如果为一个工作簿设置了打开密码,那么用2.2.1节介绍的open()函数打开该工作簿时,需要通过password参数传入正确的打开密码。如果还想删除打开密码,可将一个空字符串赋给Password属性。核心代码示例如下:
1 workbook = app.books.open('F:\\python\\第2章\\员工档案表.xlsx',password='111') 2 workbook.api.Password = ''
在Excel中,可通过“另存为”操作来转换工作簿的文件格式。例如,将“.xlsx”格式的工作簿另存为“.xls”格式,以在早期版本的Excel中打开。要通过Python编程转换工作簿的文件格式,可通过xlwings模块中Book对象的api属性调用VBA中Workbook对象的SaveAs()函数来实现。其语法格式如下:
表达式.api.SaveAs(path,FileFormat)
参数说明:
表达式:一个Book对象,通常用打开或新建工作簿的方式来创建。
path:更改格式后的工作簿的保存路径,可为绝对路径或相对路径。只支持路径字符串,如果要使用路径对象,可使用str()函数将路径对象转换为路径字符串。
FileFormat:另存文件时使用的文件格式。设置为56时表示另存为“.xls”格式,设置为51时表示另存为“.xlsx”格式。
应用场景 更改指定工作簿的文件格式
◎代码文件:SaveAs()函数.py
◎数据文件:员工档案表.xlsx
本案例要在Python代码中调用VBA中Workbook对象的SaveAs()函数,将文件夹“F:\python\第2章”中的工作簿“员工档案表.xlsx”另存为“档案.xls”。演示代码如下:
1 import xlwings as xw # 导入xlwings模块并简写为xw 2 app = xw.App(visible=False, add_book=False) # 启动Excel程序 3 workbook = app.books.open('F:\\python\\第2章\\员工档案表.xlsx') # 打开指定的工作簿 4 workbook.api.SaveAs('F:\\python\\第2章\\档案.xls', FileFormat=56) # 将工作簿另存为“.xls”格式 5 workbook.close() # 关闭工作簿 6 app.quit() # 退出Excel程序
运行以上代码后,可在文件夹中看到另存得到的工作簿“档案.xls”。
如果要打印一个工作簿中的所有工作表,可以通过xlwings模块中Book对象的api属性调用VBA中Workbook对象的PrintOut()函数来实现。其语法格式如下:
表达式.api.PrintOut(Copies,ActivePrinter,Collate)
参数说明:
表达式:一个Book对象,通常用打开或新建工作簿的方式来创建。
Copies:指定打印的份数。如果省略该参数,则表示只打印一份。
ActivePrinter:指定打印机的名称。如果省略该参数,则表示使用操作系统的默认打印机。
Collate:当该参数值为True时,表示逐份打印。
应用场景 打印指定工作簿的所有工作表
◎代码文件:PrintOut()函数.py
◎数据文件:汽车备案信息.xlsx
打开文件夹“F:\python\第2章”中的工作簿“汽车备案信息.xlsx”,可看到其中有3个工作表,如下图所示。
下面在Python代码中调用VBA中Workbook对象的PrintOut()函数,将该工作簿中的所有工作表分别打印两份。演示代码如下:
1 import xlwings as xw # 导入xlwings模块并简写为xw 2 app = xw.App(visible=False, add_book=False) # 启动Excel程序 3 workbook = app.books.open('F:\\python\\第2章\\汽车备案信息.xlsx') # 打开指定的工作簿 4 workbook.api.PrintOut(Copies=2, ActivePrinter='DESKTOP-HP01', Collate=True) # 打印指定的工作簿 5 workbook.close() # 关闭工作簿 6 app.quit() # 退出Excel程序
运行以上代码,即可将工作簿“汽车备案信息.xlsx”中的3个工作表分别打印两份。