Excel Coder
1 相关 的帮助文档在哪里找?
微软 官方文档
https://docs.microsoft.com/zh -cn/office/vba/api/overview/excel/object -model
xlwings 新 语法文档
https://docs.xlwings.org/en/stable/
对象 模型
https://docs.xlwings.org/en/stable/api.html
中文 :
https://www.kancloud.cn/gnefnuy/xlwings -docs/1127450
API 使用 方式使用的对象模型参见微软官方文档
2 怎样 安装 pywin32 和 xlwings ?
在连接互联网环境下,在 Power Shell 窗口输入:
pip install pywin32
回车,安装 pywin32 。
在连接互联网环境下,在 Power Shell 窗口输入:
pip install xlwings
回车,安装 xlwings 。
3 怎样离线安装 pywin32 和 xlwings?
很多公司要求员工在内网工作,无法上网,所以必须离线进行安装。
图 1 从网上 下载 pyw in32 安装 文件
访问以下 网址 :
https://pypi.org/project/pywin32/#files
在 Download files 部分 选择适合自己系统的版本点击下载。比如 pywin32 -304 -cp 311-win-amd64. whl ,表示该安装 程序对应的 python 版本是 3.11 , 操作 系统 为 64 位。
可执行 文件下载以后,双击它的图 标 ,打开安装界面。 按照 提示一步一步安装就可以了。
离线安装 xlwings ,可以在有外网的计算机上 用 pip install xlwings 安装 xlwings 。安装完后将 xlwings 的整个目录复制到要离线安装的机器上的对应位置即可。
4 安装 pywin32 后 ,在 pycharm 上 运行时 报 下面的错误 怎么办?
图 2
尝试 其他 IDE 如 IDLE 时 发现能正常使用,建议先使用能用的 IDE 。
5 安装 Py win32 包 后 导入 win32com 失败 ,或使用 xlwings 时 遇到不明问题怎么办?
遇到此类 问题,首先怀疑 Pywin32 包 的安装有问题。从 官网 下载安装文件时要选择Python 版本 和计算机系统对应的安装文件进行安装。比如 ,当前计算机上使用的 Python 版本 为 3.7.7 , Windows 系统 是 64 位 的,则下载版本为 3.7 , 64 位 的安装文件进行安装。
6 使用 xlwings 包 的程序能不能打包到 apk ?
xlwings 包依赖 Excel ,机器 上必须安装了 Excel 才能 正常工作 。手机 上一般没有安装Excel , 所以使用 xlwings 包 的程序 打包 到 apk 时 无法正常使用。
7 xlwings 使用 完后怎样 结束 进程?
xlwings 使用完 后, 可以 使用 Excel 应用 对象的 kill 方法 或 quit 方法 退出。注意 用 quit 方法退出 时不会结束进程,用 kill 方法 退出时会结束进程。
8 使用 xlwings 编程 进行调试时会在后台留下若干 Excel 进程 ,如何解决?
该 程序导入 xlwings包 后,创建 Excel 应用 ,同时在后台创建 一个 Excel 进程 。然后 获取工作表中的数据进行处理,处理完成后关闭工作簿,并 使用 app.kill() 关闭 进程。
导致问题出现的原因是,创建 Excel 进程 后,处理数据时程序出错导致中途退出, app.kill()语句 并没有执行,所以前面创建的 Excel 进程 没有关闭 , 在后台留下了。
处理方法是 ,捕获错误进行处理,使 app.kill() 最终 被执行;或从工作表获取数据后马上关闭进程。
9 使用 xlwings 编程 时,执行语句 bk = xw.books.add() 时 报错。
测试 发现,当至少有一个 Excel 应用 存在时,执行语句 bk = xw.books.add() 不会 出错;
当没有 Excel 应用 存在是直接执行语句 bk = xw.book s.add() 会 出错。
建议 使用下面的方式:
>>> import xlwings as xw
>>> app=xw.App()
>>> bk=app.books.active #或 bk=app.books.add()
>>> sht=bk.sheets.active
10 用 Python 怎样 实现 Excel 中 的 公式 向下填充?
使用 xlwings 包, 调用 Range 对象 的 FillDown 或 Copy 方法 可以实现 Excel 中 的公式向下填充。
假设 单元格 A2 中 有公式,使用 FillDown 方法 将该公式填充到 A2:A6 :
sht.api.Range('A2 :A6 ').FillDown()
使用 Copy 方法 将公式填充到 A2:A6 :
sht.api.Range('A2').Copy(Destination=sht.api.Range(' A2: A6'))
使用 Copy 方法 将公式 单独 填充到 A6 单元格:
sht.api.Range('A2').Copy(Destination=sht.api.Range('A6'))
11 使用 xlwings 包 时,发现 rng.rows.count 计算 错误,其中 rng 为 单元 格区域。
问题截屏 :
图 3
上面 截屏显示,从单元格区域 rng 中 反向删除一些行后, rng.rows.count 返回 的仍然是删除行操作前的行数。
解决 方法:使用 xlwings 的 api 使用 方式,即 rng.api.Rows.Count 即可 。
12 xlwings 使用 方式下, 使用 sht.charts.add() 和 sht.pictures.add() 方法 时发生类似下面的错误。
-----------------------------------------
>>> sht.pictures.add()
Traceback (most recent call last):
File "C: \Users \Administrator \AppData \Local \Programs \Python \Python37 \lib \site -packages \win32com \client \gencache.py", line 236, in GetModuleForCLSID__i mport__(sub_mod_name)
ModuleNotFoundError: No module named 'win32com.gen_py.45541000 -5750 -5300 -4B49 -4E47534F4655x0x3x0.Pictures'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "", line 1, in
sht.pictures.add()
File "C: \Users \Administrator \AppData \Local \Programs \Python \Python37 \lib \site -
packages \xlwings \main.py", line 967, in pictures return Pictures(impl=self.impl.pictures)
File "C: \Users \Administrator \AppData \Local \Programs \Python \Python37 \lib \site -
packages \xlwings \_xlwindows.py", line 661, in pictures return Pictures(xl=self.xl.Pictures())
File "C: \Users \Administrator \AppData \Local \Programs \Python \Python37 \lib \site -
packages \win32com \gen_py \45541000 -5750 -5300 -4B49 -4E47534F4655x0x3x0 \_Worksheet.py", line 195, in Pictures
ret = Dispatch(ret, 'Pictures', None)
File "C: \Users \Administrator \AppData \Local \Programs \Python \Python37 \lib \site -packages \win32com \client \__init__.py", line 96, in Dispatch
return __WrapDispatch(dispatch, userName, resultCLSID, typeinfo, clsctx=clsctx)
File "C: \Users \Administrator \AppData \Local \Programs \Python \Python37 \lib \site -packages \win32com \client \__init__.py", line 37, in __WrapDispatch klass = gencache.GetCla ssForCLSID(resultCLSID)
File "C: \Users \Administrator \AppData \Local \Programs \Python \Python37 \lib \site -packages \win32com \client \gencache.py", line 183, in GetClassForCLSID
mod = GetModuleForCLSID(clsid)
File "C: \Users \Administrator \AppData \Local \Prog rams \Python \Python37 \lib \site -
packages \win32com \client \gencache.py", line 244, in GetModuleForCLSID
makepy.GenerateChildFromTypeLibSpec(sub_mod, info)
File "C: \Users \Administrator \AppData \Local \Programs \Python \Python37 \lib \site -packages \win32com \clie nt\makepy.py", line 296, in GenerateChildFromTypeLibSpec
tlb = pythoncom.LoadRegTypeLib(typelibCLSID, major, minor, lcid)
pywintypes.com_error: ( -2147319779, ' 库没有注册。 ', None, None)
-------------------------------------------
解决 方法:
用 下面的语句 找到报错 的文件夹所在路径。
>>> from win32com.client.gencache import EnsureDispatch
>>> import sys
>>> xl=EnsureDispatch('Excel.Application')
>>> sys.modules[xl.__module__].__file__
'C: \\Users \\Administrator \\AppData \\Local \\Programs \\Python \\Python37 \\lib \\site -packages \\win32com \\ge n_py \\00020813 -0000 -0000 -C000 -
000000000046x0x1x9 \\_Application.py'
修改 上面目录外的其他临时目录 的 目录名,如 图 4所示。
图 4
现在 可以正常使用了。
13 使用 单元格对象的 Copy 方法 无法复制格式 的 问题。
使用 单元格 (区域 )对象的 Copy 方法 可以将 该 单元格 (区域 )的 全部内容复制到指定单元格 (区域 ),包括其中的 文本 、格式、批注 等 。但 不 包括单元格 (区域 )的 列宽。如果 要 复制列宽,需要使用单元格对象的 PasteSpecial 方法 。
如 下面 将图 6所示 单元格区域 A2 :C4 中 的内容复制到单元格区域 E2:G4 。
>>> import xlwings as xw
>>> app=xw.App()
>>> bk=app.books.active
>>> sht=bk.sheets.active
>>> sht.api.Range('A2:C4').Copy()
True
>>> sht.api.Range('E2:G4').PasteSpecial(xw.constants.PasteType.xlPasteAll )
True
使用 xlPasteAll 参数粘贴 后的效果如图 5中 所示 。 可见, 源 区域中的内容全部复制到 单元格 区域 E2:G4 了 ,但是区域内第 2列 和第 3列 的列宽没有复制过来。
图 5
使用 PasteSpecial 方法 ,用 xlPasteColumnWidths 参数 粘贴列宽。
>>>
sht.api.Range('E2:G4').PasteSpecial(xw.constants.PasteType.xlPasteColumnWidths)
True
结果 如图 6中 所示,可见,列宽被复制过来了。
图 6
14 使用 xlwings 与 工作表交换数据时如何提高效率?
首先 要尽量避免 频繁 与工作表交换 数据 。 特别 是通过循环 对 每个单元格进行数据的读写 ,例如读取每行 第 1列 和第 2列的单元格 的值 相乘 ,然后将所有 乘积 进行累加。 下面的代码 在 for 循环 内部读取每个单元格的数据 进行 计算。 因为 频繁与工作表进行交互,这种用法的工作效率比较低。
sm=0.0
for i in range(2,20001):
d1= sht.cells( i,1).value
d2= sht.cells( i,2).value
sm +=d1*d2
sht.range( 'B8' ).value=sm
正确 的 办法 是先将数据一次性读取到一个数组中,然后从数组中提取数据进行计算。
d=sht.range("B2:C2000").value
sm=0.0
for i in range(5):
sm+=d[i][0]*d[i][1]
sht.range( 'B8' ).value=sm
另外 一个就是使用 Excel 应用 对象的 scre en_updating 属性 ,在与工作表进行 频繁 交互
之前将该属性的值设置为 False , 这样可以避免系统频繁刷新屏幕 , 从而节省时间,提高运行 效率。 任务 完成以后再将该属性的值设置为 True 。
15 工作表 中含有大量公式,计算速度慢的问题。
工作表中 含有大量公式时, 在 “公式 ”功能区单击 “计算选项 “按钮, 在 弹出的菜单中 选择“自动 ”时计算 会慢很多,选 “手动 ”则 很快。
通过 编程来设置手动计算,将 Excel 应用 对象的 Calculation 属性的 值 设 置 为
xlCalculationManual 。
16 怎样 用 Python 绘图 ,并将图形固定在指定单元格?
Python 绘的图可以直接插入工作表。要固定位置的话,可以先保存图片,然后将图片固定到单元格。参见图形一章图片相关的内容。
xlwings 中 将 Matplotlib 创建 的图表 添加 到 Excel 工作表 时 可以 直接指定 left,top,width和 height 的值为指定单元格的对应数据 。
17 使用 xlwings 的 charts 对象 创建图表 cht 时,怎么理解 cht.api[ 0].Chart ?
如 图 7所示 。用 xlwings 使用 方式 , 用 charts 对象 的 add 方法 创建 图表 并返回一个 cht对象 。在 命令行输入 cht.api ,返回一个有两个元素的元组。其中 ,第一个元素为 ChartObject对象 ,第 2个 元素为 Chart 对象 。它们之间的关系是, ChartObject 对象 的 Chart 属性 返回的对象即为第 2个 元素表示的 Chart 对象 。在 VBA 中 称为嵌入式图表。
图 7
所以 ,从 该元组的两个元素都可以获取图表对象 。从 第 2个 元素直接获取, 用 第 1个 元素的 Chart 属性间接 获取。
18 用 xlwings 怎么 创建 Excel 数据 透视表?
使用 xlwings , 可 以 用 工 作 表 对 象 的 PivotTableWizard 方 法 创 建 数 据 透 视 表 , 或PivotCaches 对象 的 Add 方法 创建缓存然后用缓存对象的 CreatPivotTable 方法 创建数据透视表。
19 学习 xlwings 的图书推荐
为了让大家掌握 xlwings ,让大家使用 Python 也能拥有 VBA 的绝大部分能力,我们花了近 2年时间出版了《代替 VBA! 用 Python 轻松实现 Excel 编程》和《对比 VBA 学 Python:
高效实现数据处理自动化》两本书。图书在京东、当当和本地各大书店有售。
《代替 VBA! 用 Python 轻松实现 Excel 编程》图书的外观如图 8所示。 该 书 的 特点 是 :
国内首次系统介绍 win32com ,目前介绍 xlwings 最全 。揭示 了 打通 VBA 和 Python 的 路径 ,VBA er 能 轻松 过渡 到 Python , Pythoner 能 拥有 VBA 的绝大部分 能力。 可 作为技术 教程 ,也可以作为工具书备查。
《对比 VBA 学 Python: 高效实现数据处理自动化》图书的外观如图 8所示。该书全程采用 Excel VBA 与 Python 双 语对照的方式,介绍了语言语法知识点和 Excel 数据处理的各种方法。 该书可以帮助读者以最快的速度,系统地从 Excel VBA 脚本编程转入 Python 脚本编程,或 者 从 Python 脚本编程转入 VBA 脚本编程,或 者 同时学会两种脚本编程方法。 该书是目前介绍 Python xlwings 包功能最全面的图书。

图 8