使用的工具是:pywin32
PS:不是网上其他有些弄得那个什么pypiwin32
那个依赖pywin32 就是再封装了一层,也没有文档,使用说明等,而且在实际的代码调用中。
import win32com.client as win32
// 这里实际是通过pywin32作为python与win32com api接口的桥梁
不使用python自带的一些操作excel的库是因为这次的项目对excel格式要求比较高,要求修改后的excel表格里的公式,特殊符号都不能变,要保留,所以选择使用 win32com模块来对excel进行操作处理。
参见我的另一篇博客
简单测试一下,看是否可以达到要求/期望。 参考 用win32com对Excel追加,修改数据,直接套到自己的excel表格中,格式及特殊字符确实没变,只影响了要改的特定行列的那些单元格,其余完全不变,o( ̄▽ ̄)d
参考:
这里存在一个问题,win32com使用必须要求电脑上安装有excel。尝试了wps(校园版),报错。搜索后发现其实这和注册表中DCOM组件对象的写入有关(类似电脑中默认打开excel文件的应用程序是哪个)
根据python win32com 操作wps Excel的注意事项,不同的wps版本使用的调用方式不一样,所以卸载校园版wps重新安装正式版wps
# 报错信息:
pywintypes.com_error: (-2147221005, '无效的类字符串', None, None)
win32com.client.Dispatch("et.Application")#wps正式版
win32com.client.Dispatch("ket.Application")#wps抢先版
win32com.client.Dispatch("EXCEL.Application")#office EXCEL版
不知道如何查看wps版本的,以WPS 2019为例,打开WPS首页,点击“设置”—>“关于WPS”,即可查看版本信息。
失败 此种操作无效
报错信息
pywintypes.com_error: (-2147417851, '服务器出现意外情况。', None, None)
网上可以找到的资料都是:操作matlab的读取excel时候遇到的
读写excel数据出现服务器出现意外
由于电脑上没有office 只有wps 在 wps的com加载项中没有找到福昕阅读器相关的东西,卸载了福昕阅读器,无效。
搜索过程中看到 VBA操作wps相关字眼,所以去搜索 VBA插件for wps 安装(我是wps2020 所以需要使用vba for wps 7.0版本),这样就可以启用wps的宏。 安装之后依然无效。
pywintypes.com_error: (-2147352567, '发生意外 解决方案 :出现在Python调用WPS中
看到这个人的博客,所以
kwps=win32.Dispatch('kwps.Application')
kwps.Workbooks.open('16-FLUKE8845.xls')
报错:
AttributeError: '' object has no attribute 'Workbooks'
安装了office,但是安装顺序是(office2013 wps 然后卸载office2013 然后wps没动,然后再安装office2016),调用时,采用office的调用方式,但是报错仍然是与wps相关
import win32com.client as win32
excel = win32.Dispatch('Excel.Application') #需要安装Excel
wb = excel.Workbooks.open("./16-FLUKE8845.xls") #文件路径
AttributeError: '' object has no attribute 'WorkBooks'
// Workbooks 严格区分大小写 应该是 Workbooks 不是 大写B 改为之后报错
AttributeError: '' object has no attribute 'open'
搜索到如下内容,基本都是c#调用wps相关的东西
另,附上wps自己的接口文档
后来,动了动脑子,终于不再无脑百度了。直接进入WPS开放平台看文档才是正途啊。
本人工作环境一个win10笔记本 一个win7台式机。两个机子由于wps版本,wps与office安装顺序不同。一个调用win32com 调的是 wps 另一个调的则是 office。。。很诡异。
wps官方的接口文档-https://open.wps.cn/docs/office
office官方的接口文档- https://docs.microsoft.com/en-us/office/vba/api/excel.workbook
遇到有问题的地方,是 instance 就去查 对象。 是 attribute 就查 属性
特别注意:无论是使用python调用wps还是office,本质都是调用其中的VBA接口,这时候传递的路径一定要是 绝对路径,而不是相对路径。不然会报错,找不到文件。
wps文档重点关注:
office文档重点关注
Excel->Object model->Application object
对比(对同一个excel表做简单的读写修改,最后保存):
import win32com.client as win32
# wps
excel = win32.Dispatch('ket.Application') #需要安装Excel
wb = excel.Workbooks.Open("XXXXXXX/16-FLUKE8845.xls") #文件路径
ws = wb.Worksheets('Sheet1') #具体那张表
c_column = [11,21,31,41] #需要写入的数据
xing=10 # 某一行,这里指第十行S
ws.Range('C'+str(xing)).Value = c_column[0] #这里指对C10写入数据 1
ws.Range('D'+str(xing)).Value = c_column[1] #这里指对D10写入数据 2
ws.Range('E'+str(xing)).Value = c_column[2] #这里指对E10写入数据 3
ws.Range('F'+str(xing)).Value = c_column[3] #这里指对F10写入数据 4
wb.Save #保存表格
# office
excel = win32.Dispatch('Excel.Application') #需要安装Excel
wb = excel.Workbooks.open("路径.xlsx") #文件路径
ws = wb.Worksheets('表') #具体那张表
c_column = [1,2,3,4] #需要写入的数据
xing=10 # 某一行,这里指第十行
ws.Range('C'+str(xing)).value = c_column[0] #这里指对C10写入数据 1
ws.Range('D'+str(xing)).value = c_column[1] #这里指对D10写入数据 2
ws.Range('E'+str(xing)).value = c_column[2] #这里指对E10写入数据 3
ws.Range('F'+str(xing)).value = c_column[3] #这里指对F10写入数据 4
wb.save #保存表格
可以看到 wps和office调用时的两个区别:
相关参考: