客户有个需求,要求写程序从Excel中获取数据,统计加工后导出一定格式的PDF。为此我计划读取Excel后,写入Word模版,再用Word导出PDF。
具体实现有2种方案:
1、 使用微软的Office原生库(Microsoft.Office.Interop)进行开发
2、 使用第三方库,如:NPOI、itextsharp、Spire或者Aspose等,但是最终PDF效果不如Office原生库。
最终确定用原生库来开发。但是网上讨论说将来发给用户运行问题很多,有的说必须Office版本一致;也有的说高版本的可以兼容低版本的,众说纷纭。因此准备实际测试一下。
一、准备
开发环境:实体机、Win10、VS2019、Office2016
运行环境:VMware虚拟机、Win10、Office2007
这个“运行环境”就是目前客户的环境,因此先测一下。
二、测试Office2007
1、直接运行
将开发生成的exe拷贝到虚拟机中运行
发现报错:
由于不知道错在哪里,因此改写程序,加入错误捕获记录到文件。但是运行后依旧记录不到错误,因此只好在虚拟机中搭建开发环境,看看到底错在哪里。
2、安装VS2009
安装好VS2009,然后拷贝项目过去,打开就看到了报错:
3、重新在“引用”库
在“引用”中再次添加引用,找到Microsoft Word 12.0 Object Library,添加就报错
尝试直接点击“解决方案资源管理器”中的的两个引用
Microsoft.Office.Interop.Excel
Microsoft.Office.Interop.Word
发现也报错:
手工把这三个有问题的删除
再次添加,依旧有叹号,还是报错
4、安装“包”
进入包管理器,安装两个包:
Microsoft.Office.Interop.Excel、
Microsoft.Office.Interop.Word
解决方案资源管理器不报错了,但还有2个错误:
5、报错修复
报错1的修复:
去掉Value改为:
报错2的修复:
去掉Value改为:
报错没有了,只有7个警告
启动调试,还是报错
6、小结
看来不行,即使成功,但改动太大。还是安装新版本office再试试。
三、测试office2010
1、在VS2019中打开原项目
打开重新拷贝开发环境的项目过去,有错误:
2、添加“包”
没有警告,估计主要是“包”的问题,先添加包。错误减少了
还是value两个语句的问题。改了以后,错误没了,但是警告来了,估计是Object Library的版本问题
删除这几个带叹号的,还有错。
3、重新添加引用
再删除这两个引用再添加
重新添加2个com引用
将Office.Interop.Word的“嵌入互作类型”改为False,报错全无
4、测试Word功能
启动调试,这次运行正常,得到的PDF文件也很正常。
5、测试卸掉那两个“包”
卸掉了那两个“包”,启动调试,再测试,正常生成了PDF,看来跟“包”没关系
6、测试Excel功能
虽然没报错,但是发现了excel部分代码有问题
正常输出应该是有具体内容的,不是这种东西。打开excel看看,发现是写入成功,是读取报的错误
7、小结
再改也是无意义了,下面准备测试安装Office2016。到这里先简单总结一下,当目标电脑环境与Office原生开发环境不一致时,主要问题是库版本问题,跟“包”没有关系,仅仅Office2007需要“包”。
比如:
Office2007的库是:
Microsoft Word 12.0 Object Library
Microsoft Excel 12.0 Object Library
Office2010的库是:
Microsoft Word 14.0 Object Library
Microsoft Excel 14.0 Object Library
Office2016的库是:
Microsoft Word 16.0 Object Library
Microsoft Excel 16.0 Object Library
四、测试Office2016
1、安装(略)
2、测试
安装好Office2016,直接运行,没报错。PDF生成正常,Excel读写正常。
3、小结:
1、开发环境与最终运行环境一致时,程序无需改动
2、目前Office原生开发,其实版本,至少是Office2016。以前的系统,很多命令还未支持。
五、测试Office2019
1、安装的问题
安装好以后,发现还显示2019,原来是2016卸载不完全。用GeekUninstaller卸载后word就显示2019了。
2、测试
直接运行编译好的exe,能运行,但是word生成PDF时报错
用vs2019打开项目,没出现错误信息
启动调试,编译过程没报错,运行也没报错,但执行word操作报错:
查看解决方案资源管理器中的引用,发现Interop.Excel、Interop.Word还是16.0Object
3、尝试解决
老办法,删掉引用,重新引用,可是发现Object Library还是16.0
先导入引用,然后再修改word的“嵌入互操作类型“为False。代码没有报错了,但实际
启动调试还报错。对比一下Object Library版本
发现确实不对
Office版本 | Object Library版本 | 版本 | 文件版本 |
Office2016 | 16.0 | 8.7 | 16.0.4266.1003 |
Office2019 | 16.0 | 1.9 | 16.0.10730.20102 |
六、最后的总结
使用
Microsoft.Office.Interop.Word原生库开发office,需要注意一下几点:
1、 只需导入com类型的Object Library引用即可进行开发,无需再“包管理器”中安装包,否则会报value的错(详见二.5)。
2、 开发环境用的Office必须跟最终运行环境的一样,既不向下兼容,也不向上兼容,必须Office版本必须一致!
3、 Office开发时,起始版本最好为Office2016,之前的基本都已经淘汰
【配套代码】