概述:
首先给出的结论是:VBA > PyWin32 > Jacob,下面将给出详细的对比情况
详细对比数据:
1. VBA
VBA,微软的亲儿子,和Office是契合度最高的,也是和Windows系统契合度最高的,如果你是VBA高手,那么恭喜你,几乎所有的Office文档问题,你都可以解决,它具有以下的优缺点;
优点
- 只要代码正确,调用Office的成功率就是100%,所以根本不用担心
- 速度快,执行效率高
- 书写简单,可以直接找ChatGpt帮忙代写
缺点
- 运行机制不完美或者不完善,如果数据量特别大的时候,很容易卡死或者宕机。比如很大的一个word文档,要获取到每一个字符的Range信息(index,行号,页号等),就很容易卡死
- 数据结构简单,只有数组等简单的基本结构,编程不方便
总结
综上,VBA以其良好的系统亲和力,0失误率,是其成为处理office的第一选择;但是因其内存管理不完美,如果进程内存占用过高,处理不妥当的话就会出现卡死的情况;
所以在文档处理时,简单的业务,可以直接使用高级语言或者VBA,但是复杂的业务,通常会作为其他高级语言的临时脚本使用
- 关于文档的操作,尽量交给VBA
- 脚本并不会容纳太多数据,处理完一部分文档的业务后,就会返回
- 脚本可重复调用
关于java等高级语言对VBA脚本(宏)的调用,前文已经讲过,或者直接问chatGpt
2. PyWin32
pyWin32因微软向其公开了API,所以不需要任何中间件,直接调用即可,且网上有完善的教程学习,比如B站,有以下优缺点:
优点
- 不需要中间件,只要有Python环境,导入依赖包就可以使用
- 代码的写法无线近似于VBA
- 有良好的内存管理机制
缺点
- 速度一般,尤其是在做大数据量的遍历的时候,会变得很慢。解决办法是,分段的调用VBA脚本,进行处理
- 调用API时,有时候会出现COM组件异常的情况,当然也有解决办法,就是让
Application的Visable属性,设置为True,可见即可
总结
- PyWin32因其调用COM得API时,会出现异常,虽然有解决办法,但是终究不是COM得API得调用方
- 但是因其写法近似于VBA,且环境不依赖中间件,所以是良好的VBA脚本得调用方
- 所以建议得是,PyWin32来调用VBA脚本,来完成文档处理,这是最佳得解决方案
3. jaocb
jacob是java提供的COM组件的调用包,依赖与jacob.dll文件运行,在java环境的基础上,还需要配置jacob的运行环境,且写法相较于PyWin32较为笨拙,冗余,具有下面的优缺点:
优点
- 优点可能就是java可以打包成jar包发布,以及良好的内存管理机制
缺点
- 强依赖于Dispatch这个操作对象,导致写法笨拙,代码冗余
- 在java环境的基础上还需要正确配置jacob.dll这个文件
- Pywin调用不通的COM-API,jacob仍然调用不通,jacob调用不通的COM-API,pywin32也调用不通,解决办法也一样,就是让Application的Visable属性,设置为True,可见即可
- 遍历属性时,强依赖于For循环,同时只能用Item(Num)这个属性来取,有时候会出现错误,不像Pywin32那样可以类似于VBA的遍历方法来进行属性遍历
总结
- Jacob并不是一个好的COM-API调用方,因为有些情况会出现错误,虽然可以像PyWin32那样让Application的Visable属性,设置为True,但是还是不建议
- jacob又不是一个好的VBA脚本调用方,因为强依赖于for循环和Item(Num),使得有时候进行遍历处理时,会出错,比如在使用 doc.ConvertNumbersToText,这个函数进行序号清除时,以及遍历删除时
所以,如果实在一定要用jacob进行文档处理时,最好做到以下几点:
- 最好将ActiveXComponent的Visible属性设置为True,哪怕是以最小化的形式打开
- 最好是将COM-API调用交给VBA来做,将jacob作为VBA脚本的调用方
- 妥善处理属性遍历时的FOR循环,用ITEM(num)来进行属性的更改,删除,格式话时,如果不能交给VBA脚本来做,就多测试
总结:
- 就文本处理而言,VBA是最好的COM-API的调用方,但是复杂的业务只能作为脚本使用,因为内存处理较差
- PyWin32是最好的VBA脚本调用方,因为遍历属性时,不需要Item(Num)来获取属性,但是记得要设置Application的Visable为true;同时PyWin32也不是最好的COM-API的使用方
- 如果一定要使用Jacob,尽量将COM-API的调用方交给VBA,jacob仅仅作为脚本的调用方,并记得要设置Application的Visable为true;同时如果要用Item(Num)来获取属性,来格式化,删除,转换等消除动作时,如果不能交给VBA,记得多测试
- Pywin32和Jacob在COM-API的调用出错情况是相同的,解决办法也是一样的