操作Excel对象模型的一般过程

本节介绍使用Excel VBA和Python操作Excel对象模型的一般过程,包括Excel对象的创建、设置和关闭退出等步骤。

用VBA操作Excel对象模型的一般过程

Excel VBA中用Application对象表示Excel应用本身,可以直接使用。从图4-1中可以看出,它的子对象是Workbooks集合,该集合保存和管理当前Excel应用中的所有工作簿。通过索引,可以获取该集合中的某个工作簿,例如,在立即窗口输出集合中第1个工作簿的名称。示例文件的存放路径为Samples\ch04\Excel VBA\一般过程.xlsm。

code.vba
Dim bk As Workbook
Set bk=Application.Workbooks(1)
Debug.Print bk.Name

其中,Application就表示Application对象,它常常可以省略。所以,上面的语句又可以写成:

code.vba
Debug.Print Workbooks(1).Name

直接设置Excel应用的属性时不能省略Application,比如设置Excel应用窗口不可见:

code.vba
Application.Visible=False

使用Workbooks对象的Add方法可以新建工作簿对象:

code.vba
Dim bk2 As Workbook
Set bk=Workbooks.Add

使用Workbooks对象的Open方法打开Excel文件。如下面打开C盘下的Excel文件dqexcel.xlsx:

code.vba
Dim bk2 As Workbook
Set bk2=Workbooks.Open("C:\dqexcel.xlsx")

新建工作簿后默认时会在工作簿中添加一个工作表,它保存在Worksheets集合中,获取该工作表:

code.vba
Dim sht As Worksheet
Set sht=bk.Worksheets(1)

或者直接用ActiveSheet表示它,它完整的表示是Application.ActiveSheet,即Excel应用的活动工作表。

用Worksheets对象的Add方法新建工作表对象:

code.vba
Set sht=bk.Worksheets.Add

工作表对象的Range属性返回单元格对象或单元格区域对象。下面设置工作表中A1单元格的值为10:

code.vba
sht.Range("A1").Value=10

读取工作表中A1单元格的值:

code.vba
Debug.Print sht.Range("A1").Value

保存工作簿的更改调用Workbooks对象的Save方法。

code.vba
bk.Save

如果想将文件另存为一个新的文件,或者第一次保存一个新建的工作簿,使用SaveAs方法。参数指定文件保存的路径及文件名。

code.vba
bk.SaveAs "D:\dqexcel.xlsx"

使用工作簿对象的Close方法关闭工作簿。

code.vba
Workbooks(1).Close

使用Quit方法,退出应用程序而不保存任何工作簿。

code.vba
Application.Quit

与Excel相关Python包

目前常用的跟Excel有关的第三方Python包如表4-1所示。这些包都有各自的特点,有的小快灵,有的功能齐全可与VBA使用的模型相媲美;有的不依赖Excel,有的必须依赖Excel;有的工作效率一般,有的工作效率很高。

表4-1 Excel相关的Python包

Python包 说 明
xlrd 支持读取xls和xlsx文件
xlwt 支持写xls文件
OpenPyXl 支持xlsx/xlsm/xltx/xltm文件的读写,支持Excel对象模型,不依赖Excel
XlsxWriter 支持xlsx文件的写,支持VBA
win32com 封装了VBA使用的所有Excel对象
comtypes 封装了VBA使用的所有Excel对象
xlwings 重新封装了win32com,支持与VBA混合编程,与各种数据类型进行数据类型转换
pandas 支持.xls,.xlsx文件的读写,提供进行数据处理的各种函数,处理更简洁,速度更快

xlwings包及其安装

表4-1所示各Python包中,本书结合xlwings包进行介绍。xlwings包在win32com包的基础上进行了二次封装,号称给Excel插上翅膀,是目前功能最强大的Excel Python包之一。它封装了Excel, Word等软件的所有对象。所以,从这个角度讲,Excel VBA能做的,使用它基本上也能做到。

xlwings包还进行了很多改进和扩展,可以很方便地与NumPy和pandas等包提供的数据进行类型转换和读取操作,可以将Matplotlib绘制的图形很方便地写入Excel工作表。使用它还可以跟VBA混合编程,可以在VBA编程环境中调用Python代码,也可以在Python代码中调用VBA函数。

安装xlwings包,首先需要安装PyWin32包,请访问以下网址:

https://sourceforge.net/projects/pywin32/

按以下步骤操作,打开网页如图4-2所示。

1 点击“Files”菜单。

2 进入“pywin32”目录。

3 选择文件夹如“Build 221 "。

4 选择适合自己系统的版本点击下载。比如pywin34-221.win-amd64-py3.7.exe,表示该安装程序对应的python版本是3.7,系统版本64位。

Document Image

图4-2 从网上下载PyWin32安装文件

可执行文件下载以后,双击它的图标,打开安装界面。按照提示一步一步安装就可以了,需要注意的是,如果计算机上安装有多个编程环境比如IDLE, PyCharm, Anaconda等,请选择PyWin32要安装的目录进行安装,如图4-3所示。

Document Image

图4-3 安装PyWin32

安装完以后,就可以在Python IDLE编程环境中进行编程了。

另外,在有的计算机上也可以在DOS命令窗口输入下面的语句进行安装。

python -m pip install pypiwin32

有时候将已经安装的PyWin32卸载了,重新安装时会提示类似“Pywin32 无法卸载”的错误,此时在C盘查找类似下面的文件删除或更改名称,其中版本号根据具体情况而异。

pywin34-221-py3.7.egg-info

然后重新安装即可。

安装PyWin32包后,使用下面的命令安装xlwings包。

pip install xlwings

用xlwings包操作Excel对象模型的一般过程

使用xlwings包之前先导入它。打开Python IDLE编程界面,在Python Shell窗口导入xlwings包。

code.python
>>> import xlwings

创建一个Excel应用:

code.python
>>> app=xlwings.App()

为了方便后面使用,常常定义xlwings包的缩写形式。

code.python
>>> import xlwings as xw

这样,创建Excel应用app时可以这样写:

code.python
>>> app=xw.App()

此时弹出一个Excel工作界面,它就是我们讲的Excel应用。默认时它是可见的。默认时会新建一个工作簿对象,它保存在集合books中,可以用索引进行引用:

code.python
>>> bk=app.books(1)

或获取当前活动工作簿:

code.python
>>> bk=app.books.active

创建Excel应用时可以通过参数设置其可见性,设置是否有工作簿。下面新建一个可见,但是没有添加工作簿的Excel应用。

code.python
>>> app=xw.App(visible=True, add_book=False)

visible参数的值为True时Excel应用可见,为False时不可见;add_book参数的值为True时在Excel应用中添加工作簿,为False时不添加。

用books对象的add方法可以新建工作簿对象:

code.python
>>> bk2=xw.books.add()

使用books对象的open方法打开Excel文件。如下面打开C盘下的Excel文件dqexcel.xlsx:

code.python
>>> bk3=xw.books.open(r"C:/dqexcel.xlsx")

新建工作簿后默认时会在工作簿中添加一个工作表,它保存在sheets集合中,获取该工作表:

code.python
>>> sht=bk.sheets(1)

用sheets对象的add方法新建一个工作表对象:

code.python
>>> sht2=bk.sheets.add()

设置工作表中A1单元格的值为10:

code.python
>>> sht.range("A1").value=10

读取工作表中A1单元格的值:

code.python
>>> sht.range("A1").value
10

使用工作簿对象的save方法保存指定工作簿的数据到指定文件。

code.python
>>> bk.save(r"D:\dqexcel.xlsx")

使用工作簿对象的close方法关闭工作簿。

code.python
>>> bk.close()

使用工作簿对象的quit方法,退出应用程序而不保存任何工作簿。

code.python
>>> app.quit()