.Net调用Office Com组件的原理及问题

时间:2021-06-24 00:28:25

今日用到WordToHtml的方法,需要添加对office组件的引用(Microsoft.Office.Interop.Word)

程序集Microsoft.Office.Interop.Word
    D:\Program Files\Microsoft Visual Studio 9.0\Visual Studio Tools for Office\PIA\Office12\Microsoft.Office.Interop.Word.dll

调用代码如下

using Microsoft.Office.Interop.Word;

ApplicationClass word = new ApplicationClass();
                Type wordType = word.GetType();
                Documents docs = word.Documents;

                //打开文件
                Type docsType = docs.GetType();
                Document doc = (Document)docsType.InvokeMember("Open",
                System.Reflection.BindingFlags.InvokeMethod, null, docs, new Object[] { wordFilePath, true, true });

                //转换格式,另存为
                Type docType = doc.GetType();

                docType.InvokeMember("SaveAs", System.Reflection.BindingFlags.InvokeMethod,
                 null, doc, new object[] { htmlFileUrl, WdSaveFormat.wdFormatFilteredHTML });

                docType.InvokeMember("Close", System.Reflection.BindingFlags.InvokeMethod,
                 null, doc, null);

                //退出 Word
                wordType.InvokeMember("Quit", System.Reflection.BindingFlags.InvokeMethod,
                 null, word, null);

原理显而易见:通过程序启动Word.exe程序,将本地文件打开,做另存为html操作,关闭word文档,退出word程序

程序执行完成后存在两个文件,原有word文件和html文件

本地调试没有任何问题,Windows2003+Vs2008+IIS6.0+Office2007

发布网站,在本机IIS上配置好网站后(读取写入的权限都打钩),登陆上传word文件转换出错,错误异常消息如下:

检索 COM 类工厂中 CLSID 为{00024500-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 80070005。

从网上搜帖子答案大致相同:登陆网站的用户没有操作word.exe的权限

好,运行"中输入dcomcnfg.exe启动"组件服务",也可以从管理工具里面进,

"组件服务"- >"计算机"- >"我的电脑"- >"DCOM配置"->找到word->属性->"标识"标签,选择"交互式用户"

->安全"标签"->在"启动和激活权限"上点击"自定义",然后点击对应的"编辑"按钮,在弹出的"安全性"对话框中填加 一个"NETWORK   SERVICE"用户(注意要选择本计算机名),并给它赋予"本地启动"和"本地激活"权限.

->"安全"标签,在"访问权限"上点击"自定义",然后点击"编辑",在弹出的"安全性"对话框中也填加一个"NETWORK SERVICE"用户,然后赋予"本地访问"权限. 这样,我们便配置好了相应的Excel的DCOM权限.

重启本地机器上的IIS,未重启机器,打开网站测试,OK了,顺便提一下,操作的word文件和html文件夹要有读写的权限才行,右键--安全--Everyone或网络服务用户-->读写权限打钩

接下来,发布到服务器上,外网登陆测试,抛黄页,提示运行时错误 由于不是本地机器的登录用户所以不提示具体的错误信息。

得,从服务器的IIS里面浏览测试,抛出与我机器上同样的错误,吼吼太好了,这下我可以练练手配置一下Dcom权限了,打开组件服务傻眼了

服务器上Windows2008+IIS7.0,在Dcom配置里面没有找到word,看看安装了Office没有,结果是安装了,Office2007,再搜搜帖子windows2008 的,

找了几个帖子无果,看到了xp的组件服务配置,跟winserver2008的差不多,就这个吧

"组件服务"- >"计算机"- >"我的电脑"- >属性-->Com组件->启动和激活权限设置同上->访问权限编辑同上->都添加了Network service用户给用户赋予相应的读写权限

重启IIS了,盼望着盼望着,测试仍然是相同的错误 ,重启服务器,the same result! 我靠

难道用户添加错了吗?难道是AspNet用户吗,可是帖子上说window2000操作系统是这个用户,IIS5.0是添加这个用户,可是服务器上是windows2008+iis7.0 ,哎,试试吧

继续修改重启,仍然无果

网上仍然有招:尽管我还没有试,先贴上再说

在web.config中使用身份模拟,在<system.web>节中加入   <identity impersonate="true" userName="你的用户名" password="密码"/></system.web>

 

我一直在想,为什么在服务器上DCom配置里面,没有找到Office word 以及Office家族,是不是安装的Vs2008是框架版的没有自动注册Office的一系列组件呢

研究了一些com组件的注册和office的注册,理解了为什么之前说 *.dll(动态类库)和*.exe 都是可执行文件了,网上也有解决的办法是Excel的,贴出来:

注册方法执行 开始----运行----输入excel2003的安装路径,例如 "C:\Program Files\Microsoft Office\OFFICE11\excel.exe" /regserver 注意/符号前面有一个空格,其中"C:\Program Files\Microsoft Office\OFFICE11\excel.exe" 是excel2003的安装程序的路径,参数regserver表示注册的意思!
运行后,会启动Office 2003的安装程序,进行修复,重新注册。
excel2007为默认的启动程序的方法类同,可以执行 开始----运行----"D:\Program Files\Microsoft Office\Office12\excel.exe" /regserver
综上所述,再遇到Excel导出、导入问题时,先考虑权限问题,再考虑office的版本环境!如此基本能够解决这些问题了。

Good!Tomorrow I will have a try!

<--顺便贴出某个帖子的楼主经验:我也遇到过应用以上方法还是报错的情况,我的环境是windows2003 + office2003+office2007,在测试服务器上都可以导出无任何问题!但是更新了正式环境就是报错,权限都设置了还是报错,因为我的测试服务器是默认office启动的,所以我怀疑是office版本环境问题!于是我卸载了office2007,马上测试ok了,但是重启服务器后就产生了have not been Pre-compiled错误,导出页面都无法打开了,于是我又重新安装了office2007,页面可以打开了,但是导出excel时又开始报错!我又把所有的权限重新设置一遍,问题依旧!后来发现两个服务器默认打开excel的程序不一样,测试环境是默认office2003打开,正式环境是office2007打开,于是我在正式环境重新注册office2003,使其同样也是默认office2003打开程序,靠!问题终于解决了---->