调研-python使用win32com模块操纵excel

背景介绍

使用的工具是:pywin32

PS:不是网上其他有些弄得那个什么pypiwin32 那个依赖pywin32 就是再封装了一层,也没有文档,使用说明等,而且在实际的代码调用中。

import win32com.client as win32
// 这里实际是通过pywin32作为python与win32com api接口的桥梁

其他工具

不使用python自带的一些操作excel的库是因为这次的项目对excel格式要求比较高,要求修改后的excel表格里的公式,特殊符号都不能变,要保留,所以选择使用 win32com模块来对excel进行操作处理。

参见我的另一篇博客

简单使用

简单测试一下,看是否可以达到要求/期望。 参考 用win32com对Excel追加,修改数据,直接套到自己的excel表格中,格式及特殊字符确实没变,只影响了要改的特定行列的那些单元格,其余完全不变,o( ̄▽ ̄)d

参考:

wps和excel访问的API不同的问题

这里存在一个问题,win32com使用必须要求电脑上安装有excel。尝试了wps(校园版),报错。搜索后发现其实这和注册表中DCOM组件对象的写入有关(类似电脑中默认打开excel文件的应用程序是哪个)

尝试1:

根据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”,即可查看版本信息。
img
失败 此种操作无效

尝试2:

报错信息
pywintypes.com_error: (-2147417851, '服务器出现意外情况。', None, None)

网上可以找到的资料都是:操作matlab的读取excel时候遇到的
读写excel数据出现服务器出现意外
在这里插入图片描述

由于电脑上没有office 只有wps 在 wps的com加载项中没有找到福昕阅读器相关的东西,卸载了福昕阅读器,无效。

尝试3

搜索过程中看到 VBA操作wps相关字眼,所以去搜索 VBA插件for wps 安装(我是wps2020 所以需要使用vba for wps 7.0版本),这样就可以启用wps的宏。 安装之后依然无效。

尝试4

pywintypes.com_error: (-2147352567, '发生意外 解决方案 :出现在Python调用WPS中

看到这个人的博客,所以

kwps=win32.Dispatch('kwps.Application')
kwps.Workbooks.open('16-FLUKE8845.xls')

报错:
AttributeError: '<win32com.gen_py.Upgrade Kingsoft WPS 3.0 Object Library (Beta)._Application instance at 0x1866059667464>' object has no attribute 'Workbooks'

尝试5

安装了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: '<win32com.gen_py.Upgrade WPS Spreadsheets 3.0 Object Library (Beta)._Application instance at 0x2102370556680>' object has no attribute 'WorkBooks'
// Workbooks 严格区分大小写 应该是 Workbooks 不是 大写B 改为之后报错

AttributeError: '<win32com.gen_py.Upgrade WPS Spreadsheets 3.0 Object Library (Beta).Workbooks instance at 0x1915943788616>' 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调用时的两个区别:

  • Open函数的大小写,以及
  • value属性的大小写
  • 大概是wps为了和office做区分吧,刚好Python本身是大小写敏感的语言

相关参考:

  • 8
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吨吨不打野

解决了问题,觉得还行就给点

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值