C

科技玩点原始事 2025-02-26 03:48:42

客户有个需求,要求写程序从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

这个“运行环境”就是目前客户的环境,因此先测一下。

二、测试Office20071、直接运行

将开发生成的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

四、测试Office20161、安装(略)2、测试

安装好Office2016,直接运行,没报错。PDF生成正常,Excel读写正常。

3、小结:

1、开发环境与最终运行环境一致时,程序无需改动

2、目前Office原生开发,其实版本,至少是Office2016。以前的系统,很多命令还未支持。

五、测试Office20191、安装的问题

安装好以后,发现还显示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,之前的基本都已经淘汰

【配套代码】

0 阅读:0

科技玩点原始事

简介:感谢大家的关注