因自己的电脑没有装office,在用Python调用xlwings来操作Word文档时总会出现一些奇奇怪怪的错误,查资料发现网上千篇一律都是一样的内容,而且无法解决实质性的问题,于是只能自己琢磨,终于弄出来一个还可以用用的demo
鉴于WPS的API文档实在难以找到,我就直接在这里贴上连接吧,方便后续诸位同学查询:WPS的API跳转链接
1、安装所依赖的库:
pip install xlwings
pip install win32com
当然如果觉的安装太慢可以使用国内的源,在安装命令后加个 -i 然后接国内源地址就行了
pip install xlwings -i https://pypi.douban.com/simple/
2、Python国内镜像地址:
1.阿里云:https://mirrors.aliyun.com/pypi/simple/
2.豆瓣:https://pypi.douban.com/simple/
3.清华大学:https://pypi.tuna.tsinghua.edu.cn/simple/(推荐)
4.中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple/
5.华中理工大学:http://pypi.hustunique.com/
6.山东理工大学:http://pypi.sdutlinux.org/
3、创建 WPS 的 Excel 文档
报错信息:pywintypes.com_error: (-2147221005, ‘无效的类字符串‘, None, None)xlwings报错
解决方法如下:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# 首先当然是先引入对应的包
import os
import xlwings as xw
from win32com.client import Dispatch
def create_excel():
create_path = “./WPS/Excel” # 所要创建表格的目录地址
# 为了避免直接修改库自带的源码,就研究了下源码,发现只要引入impl就可以了
# noinspection PyProtectedMember
xl = xw._xlwindows.COMRetryObjectWrapper(Dispatch("Ket.Application"))
# noinspection PyProtectedMember
impl = xw._xlwindows.App(visible=False, add_book=False, xl=xl)
# 新建一个excel(visible为是否需要可视化,True为可视化,False为后台运行)
app = xw.App(visible=True, add_book=False, impl=impl)
BaseWorkBook = app.books.add()
# 判断路径是否存在
isExists = os.path.exists(create_path)
isPath = os.path.isdir(create_path)
if isExists and isPath:
BaseWorkBook.save(create_path + "/Workbook.xlsx")
else:
os.mkdir(create_path)
BaseWorkBook.save(create_path + "/Workbook.xlsx")
return BaseWorkBook
注意:鉴于很多同学电脑中只安装了WPS,从而导致创建excel文件时,在保存这一步骤时会报错 (-2147352573, ‘找不到成员。’, None, None),因为现在xlwings库对wps兼容性不够导致的,暂时没有想到合适的解决方案,所以只能暂时绕过这个操作,先使用openpyxl先新建一个excel文件,然后在继续用xlwings来操作,代码如下:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# 首先引入对应的包
import os
import openpyxl
import xlwings as xw
from win32com.client import Dispatch
def create_excel():
create_path = “./WPS/Excel” # 所要创建表格的目录地址
# 判断路径是否存在
isExists = os.path.exists(create_path)
isPath = os.path.isdir(create_path)
if isExists and isPath:
newFilePath = create_path + "/Workbook.xlsx"
else:
os.mkdir(create_path)
newFilePath = create_path + "/Workbook.xlsx"
# 使用openpyxl先新建一个excel文件
wb = openpyxl.Workbook()
sh = wb[wb.sheetnames[0]]
sh.title = "Sheet1"
wb.save(newFilePath)
wb.close()
xl = xw._xlwindows.COMRetryObjectWrapper(Dispatch("Ket.Application"))
impl = xw._xlwindows.App(visible=False, add_book=False, xl=xl)
# 新建一个excel(visible为是否需要可视化,True为可视化,False为后台运行)
excelApp = xw.App(visible=True, add_book=False, impl=impl)
workbook = excelApp.books.open(newFilePath)
return workbook
4、针对WPS中激活 Sheet 页
对于WPS激活Sheet页时,使用xlwings库常规的激活方式会报错,这个时候就需要用api的方式来规避这个问题
解决方法如下:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# 首先当然是先引入对应的包
import os
import xlwings as xw
from win32com.client import Dispatch
def active_sheet():
excelPath = “./WPS/Excel/test.xlsx” # excel文件
# 为了避免直接修改库自带的源码,就研究了下源码,发现只要引入impl就可以了
# noinspection PyProtectedMember
xl = xw._xlwindows.COMRetryObjectWrapper(Dispatch("Ket.Application"))
# noinspection PyProtectedMember
impl = xw._xlwindows.App(visible=False, add_book=False, xl=xl)
# 新建一个excel(visible为是否需要可视化,True为可视化,False为后台运行)
app = xw.App(visible=True, add_book=False, impl=impl)
BaseWorkBook = app.books.open(excelPath)
# 根据Sheet页名称激活Sheet页
sheetName = "sheet页名称"
sh = BaseWorkBook.sheets[sheetName]
sh.api.Application.Sheets.Item(sheetName).Activate()
# 根据Sheet位置激活Sheet页
sheetIndex = 1 # sheet页位置
sh = BaseWorkBook.sheets[sheetName]
sh.api.Application.Sheets.Item(sh.name).Activate()