调研-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

参考:

  • 用win32com对Excel追加,修改数据

wps和excel

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

  • 关于调用Excel.Application报错的解决方法

尝试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”,即可查看版本信息。
调研-python使用win32com模块操纵excel_第1张图片
失败 此种操作无效

尝试2:

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

网上可以找到的资料都是:操作matlab的读取excel时候遇到的
读写excel数据出现服务器出现意外
调研-python使用win32com模块操纵excel_第2张图片

由于电脑上没有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: '' 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: '' object has no attribute 'WorkBooks'
// Workbooks 严格区分大小写 应该是 Workbooks 不是 大写B 改为之后报错

AttributeError: '' object has no attribute 'open'

搜索到如下内容,基本都是c#调用wps相关的东西

  • C#调用WPS将文档转换成pdf进行预览
  • C#调用WPS2016方法和常见问题处理
  • c#操作wps中的excel

另,附上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文档重点关注
调研-python使用win32com模块操纵excel_第3张图片
office文档重点关注
Excel->Object model->Application object
调研-python使用win32com模块操纵excel_第4张图片

对比(对同一个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本身是大小写敏感的语言

相关参考:

  • AttributeError:win32com.gen_py.Microsoft Excel 15.0 Object Library.Range instance at 0x338547600
    不管是使用xlwings还是pywin32接口,本质都是和底层的API打交道。
  • wps正确关闭调用的文档

你可能感兴趣的:(项目实战,excel,python)