net中C#自动化调用Word的实例总结

本文介绍了如何在 C# 的 ASP.NET 中调用 Word 进行自动化操作,包括建立工程、代码逻辑实现、遇到的问题及解决方案。重点展示了通过 COM 技术与 VBA 语法在服务器端生成 Word 文档的过程,同时提供了针对运行稳定性、代码安全性和开发难度的分析,最终推荐了 SOAOffice 这款软件作为替代方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

本文通过一个实用例子完整演示了如何使用C#在ASP.NET里调用Word、自动化Word,并且总结了实际应用中发现的问题,最后提出了有效的解决方案。

关键词:ASP.NET; C#; Word; 自动化; VBA; COM; 死进程;

1. 建立工程

在ASP.NET里操作Word的第一步就是添加COM引用到你的工程里,通过右键点击“解决方案资源管理器”的“引用”,添加引用。选择COM选项卡,添加Microsoft Word 12.0 Object Library(其中12.0是Word版本号,根据当前电脑上安装的Word版本确定)。 ASP.Net会自动生成Word的COM包装类程序集添加到应用程序目录里。

2. 代码逻辑

在服务器端访问本地存在的Word文件,并根据他新建一个文件,利用Word的标签定位赋值。客户端浏览器通过文件链接访问到这个新生成的Word文件。

具体代码如下:
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
object Missing = Type.Missing;
//取得Word文件路径
string strTemp = "doc/test.doc";
//新Word文件保存路径
string newFileName = "doc/test2.doc";
//创建一个名为WordApp的组件对象
Application WordApp = new ApplicationClass();
//必须设置为不可见
WordApp.Visible = false;

try
{
//创建以strTemp为模板的文档
object oTemplate = Server.MapPath(strTemp);
Document WordDoc
= WordApp.Documents.Add(ref oTemplate, ref Missing,ref Missing, ref Missing);
WordDoc.Activate();

//对标签"Title"进行填充
string strBM = "Title";
object objBM = strBM;
if(WordApp.ActiveDocument.Bookmarks.Exists(strBM) == true)
{
WordApp.ActiveDocument.Bookmarks.get_Item(
ref objBM).Select();
WordApp.Selection.TypeText(
"公文标题");
}

//保存为新文件
object oNewFileName = Server.MapPath(newFileName);
WordDoc.SaveAs(
ref oNewFileName, ref Missing,ref Missing, ref Missing,ref Missing,ref Missing,ref Missing,
ref Missing,ref Missing,ref Missing, ref Missing, ref Missing, ref Missing, ref Missing, ref Missing, ref Missing);
WordDoc.Close(
ref Missing, ref Missing, ref Missing);

WordApp.Quit(
ref Missing, ref Missing, ref Missing);
}
catch(Exception Ex)
{
throw new Exception(Ex.Message);
}

//浏览器弹出下载框
Page.RegisterStartupScript("", "<script>window.open('"+newFileName+"')</script>");
}

运行前,工程目录下建文件夹doc, doc里新建一个test.doc,内容自己定,手动插入一个名为“Title”的标签。
此代码在 VS.Net2003+WinXP+Office2007 下运行通过。
如果你在运行时出现下面的调试错误:
拒绝访问。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。
异常详细信息: System.UnauthorizedAccessException: 拒绝访问。
ASP.NET 未被授权访问所请求的资源。请考虑授予 ASP.NET 请求标识访问此资源的权限。ASP.NET 有一个在应用程序没有模拟时使用的基进程标识(通常,在 IIS 5 上为 {MACHINE}/ASPNET,在 IIS 6 上为网络服务)。如果应用程序正在通过 <identity impersonate="true"/> 模拟,则标识将为匿名用户(通常为 IUSR_MACHINENAME)或经过身份验证的请求用户。
若要授予 ASP.NET 对文件的写访问权,请在资源管理器中右击该文件,选择“属性”,然后选择“安全”选项卡。单击“添加”添加适当的用户或组。突出显示 ASP.NET 帐户,选中所需访问权限对应的框。
出现以上错误时,表明ASP.NET进程无法对具有用户界面的Word进行自动化调用,必须由一个拥有桌面的用户角色来启动ASP.NET进程。解决方法:在Web.config文件的System.Web节里添加<identity impersonate="true" userName="*" password="*" />,其中userName和password是你电脑里的Windows登录账户。
3. 方案总结
Web服务器端自动化调用Word在实际应用中发现的问题:
一、 开发难易度:Word自动化中的调用都基于VBA语法,需要开发者对VBA很熟悉。VBA中Word对象众多、逻辑复杂,COM调用方式难于理解。一般开发者很少接触VBA和COM,因此开发起来比较麻烦。
二、 代码安全性:上述运行错误“拒绝访问”的最佳解决方法就是添加<identity impersonate="true" userName="*" password="*" />,不过缺点是在Web.config里可以看到你的账户密码,尽管Web.config不会轻易被人下载到,但还是具有一定的危险性。另外也可以运行Dcomcnfg.exe工具提升ASPNET账户权限为交互式用户,当然这样也会增加服务器的风险。网上搜索发现有网友的解决方法是:在.net 安装根目录下找到config文件夹下的machine.config文件将processModel 中的username属性改为SYSTEM。还有网友的解决方法是:将IIS默认的账户改为管理员账户。这两个方法更加危险,一旦黑客获得了ASP.Net进程的权限,他就能完全控制你的服务器。
三、 运行稳定性:微软Office是主要针对普通用户开发的桌面办公应用软件,它具有丰富的UI(用户界面)元素,是一套纯粹的本地运行软件或者说是客户端软件。Word自动化接口主要是为了方便窗口应用程序调用而设计的。例如Delphi、VB、C# Winform等开发的本地应用程序。虽然可以强制Visible为false,Word可以运行在服务器端代码里,但毕竟还是会带来许多棘手问题。1. ASP.NET是基于B/S架构的。B/S架构下用户访问都是并发的,也就是说经常会出现同时N个用户对一个服务器页面发出请求。在这种情况下Word自动化调用会时常出现死进程。2. 由于隐藏界面运行,一些涉及界面的可以在窗口程序里成功调用的接口,在服务器端调用就会失败,甚至崩溃,这种情况也会经常导致死进程。3. 由于Word是复杂的桌面程序,并不符合一般Web服务程序简洁高效的标准,所以在服务器端运行时速度慢,并且还会消耗大量资源(CPU、内存),尤其不能支持大量用户同时访问,资源会很快耗尽。4. 绝大部分开发者对COM技术比较陌生,在编程调用Word接口时经常存在一些代码错误,而又很难检查到问题所在,这又是导致死进程的经常因素。Word死进程不仅会消耗服务器资源,还经常会导致服务器页面不能创建新的Word自动化对象而无法继续工作。有网友提出死进程解决方法:编程Kill掉Word死进程,这样是治标不治本的做法,Word死进程是不在了,可是Word非正常关闭会导致很多资源无法及时释放。这样的Web服务器能持续工作多久恐怕就很难说了。
既然在Web服务器端自动化调用Word存在这么多问题,那么能不能在客户端浏览器里调用Word呢?用javascript肯定可以,不过要想运行就得把浏览器的安全性降到最低,呵呵,恐怕没有几个用户愿意这么做啊。即使不存在安全问题,本来写在服务器端的代码逻辑要写在javascript里,由此带来的大量麻烦(打开、传值、取值、保存到服务器等)也会让人难以容忍。
4. 解决方案
为了解决这些问题,笔者经过全面研究比较,发现网上有一款软件SOAOffice(微软Office专用Web中间件),完全消除了以上问题,推荐给大家分享。
经研究发现,SOAOffice是一套由服务器端组件和客户端控件构成的中间件系统。服务器端组件是标准.NET组件,提供简洁高效的Word、Excel简化接口;客户端控件在浏览器网页里运行。服务器端调用SOAWord.WebOpen打开文档后,浏览器页面里客户端控件会启动客户机上的Word并且运行在网页里而不是本地打开。服务器端无需安装Office软件。
SOAOffice的架构很巧妙,开发者只需关注服务器端编程逻辑,客户端如何工作都交由控件自动完成。SOAOffice充分利用了分布式计算的思想,把本来要在服务器端运行的Word运算量交给了客户机。也就是说,原来采用服务器端自动化技术的网页同时要处理N个Word任务现在交给了N个客户机,每个客户机运行一个Word。服务器只需处理需要服务器处理的业务逻辑,一切与界面有关、与Word程序本身有关的工作由客户机运行,当然这也是客户机的强项。
SOAOffice的架构消除了服务器端运行Word、Excel的风险,又充分利用了客户机闲置的计算资源,这种架构不但解决了ASP、ASP.NET等Windows web服务调用Word、Excel的问题,而且还给Java写的Web服务调用Word、Excel提供了解决方案(Unix、linux等无法自动化Word、Excel)。
SOAOffice能够让用户直接在网页里看到word文件内容,并且可以直接编辑、保存回Web服务器,给用户省去了先下载下来,修改完后再上传的麻烦。
SOAOffice还有其他更多自动化调用Word无法做到的强悍功能,比如只读、防下载、防复制等,你就下载一个慢慢琢磨吧。
附上利用 SOAOffice 完成本实例相同功能 + 只读防下载功能的代码:
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
SOAOfficeX.WordResponse SOAWord = new SOAOfficeX.WordResponse();
//对数据区域"Title"进行填充
SOAWord.OpenDataRegion("Title").Value = "公文标题";
SOAOfficeX.SOAOfficeCtrl SOACtrl
= new SOAOfficeX.SOAOfficeCtrl();
// 设置界面样式
SOACtrl.MainStyle = SOAOfficeX.soaMainStyle.VistaBlue;
SOACtrl.Caption
= "动态生成文档";
SOACtrl.Menubar
= false;
SOACtrl.Toolbars
= false;
SOACtrl.CanCopy
= false;//禁止下载、复制粘贴等
// 获取数据对象
SOACtrl.Assign(SOAWord);
// 只读打开生成的文档
SOACtrl.WebOpen("doc/test.doc", SOAOfficeX.soaWorkMode.docReadOnly, "SomeBody", "Word.Document");
}
soaoffice示例代码 SOAOffice是一种中间件软件,不能直接给最终用户使用,需要软件编程人员将SOAOffice集成到软件系统中才能发挥它的威力。比较直观的来说,通常有以下需求的Web开发者推荐使用SOAOffice:   1. 需要把数据库字段内容填充到Word/Excel指定位置的;   2. 需要把Word/Excel指定位置的内容提取出来保存到数据库字段的;   3. 需要动态生成指定格式的Word文档的;   4. 需要把html页面中表格导出到excel的;   5. 需要在html页面中套打票据、报表的;   6. 需要在html页面中显示复杂报表,并要求精确打印预览及打印的;   7. 需要动态生成中国式复杂格式报表的;   8. 需要在html页面中输入复杂票据的;   9. 使用ole服务器自动化技术调用Word/Excel经常产生死进程或系统不稳定的;   10.Web系统中调用Word/Excel的页面有大量并发用户访问的;   11.使用jacob、jxl、apache poi的;   12.需要在Web调用Word/Excel,并且追求系统运行稳定、可靠的;   13.最终用户可以浏览 Word/Excel/Ppt 文档内容,但需要禁止复制、粘贴、下载、另存的;   14.需要在html页面中在线编辑Word公文的;   15.需要在协同办公中强制保留Word修改痕迹的;   16.需要在协同办公中手写批注、手写签名、加盖电子印章、模板套红的;   17.需要在新闻编辑中强制保留Word修改痕迹、手写批注、圈阅的;   18.需要在远程教育中实现试卷、作业在线批改的。   19.需要在html页面中把Word转换为pdf的;   20.需要在html页面中快速打开、显示pdf的;   21.需要在Ajax架构里调用Word/Excel的,包括服务器端和客户端Javascript都适用。   22.需要控制不同的用户在Word/Excel中不同的区域中编辑权限的;   23.需要在企业局域网内架设在线Office文档中心、知识管理的;
SOAOFFICE - 微软 OFFICE 中间件 SOAOffice 中间件是北京科翰软件为微软OFFICE量身打造的Web中间件,是Web调用Office、存取Office数据的必备中间件。SOAOffice中间件由服务器端数据组件和客户端显示控件构成。 SOAOffice 完全抛弃了传统利用Office服务器自动化技术存取文档数据的种种弊端和缺陷,采用独创的专利技术构建了一个功能强大、简单易用的微软Office中间件平台,平台提供标准的.net和java组件接口,不但能够在线(浏览器页面)打开、编辑、保存Office文档,而且开发人员还能够以简洁的代码快速的将数据库数据动态填充到Office文档指定位置,并且也能够从Office文档中提取指定位置的数据保存到数据库。 SOAOffice提供这些强大功能的同时,服务器端并不需要安装运行Office软件。通过SOAOffice,在Web世界里,难以驯服的Word/Excel就变成了普通的、熟悉的、服务器端可调用.Net组件、Java组件、ASP组件、PHP组件,开发人员再也不用研究复杂的Word/Excel COM自动化细节、学习复杂的VBA语法调用,也不用去应对Word/Excel死进程、系统稳定运行的问题。开发人员能够节省宝贵的精力和时间,把它投放到更重要的业务逻辑和系统架构上,而控制Office的具体技术细节交给SOAOffice去做。 SOAOffice除了提供Word/Excel动态数据填充,Word/Excel数据导入导出,Word/Excel/PowerPoint等Office文档的在线打开、编辑、保存,权限控制,只读控制等功能外,还给在线办公内置了强大的支持功能:强制痕迹保留,手写批注,圈阅签字,手写签名,电子印章、数字签名、模板套红、一键套红等。 科翰软件是国内唯一的微软Office中间件开发商,拥有卓越的自主研发实力和独创的专利技术,其产品SOAOffice不仅畅销国内,而且还远销欧美国际市场,其中世界500强美国Dover集团、可口可乐 Coca-Cola、中石油、中石化等都是SOAOffice产品的忠实客户。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值