本文通过一个实用例子完整演示了如何使用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. 解决方案
为了解决这些问题,笔者经过全面研究比较,发现网上有一款软件PageOffice,完全消除了以上问题,推荐给大家分享。
PageOffice for ASP.NET是一款非常优秀的专业的集成微软OFFICE功能的ASP.NET控件平台,能够帮助Web开发人员轻松实现在网页中嵌入运行微软Office的特殊功能。PageOffice把微软复杂的Office编程接口(COM API) 有效地整合于 ASP.NET 环境,通过简化的。NET类库接口为开发者提供了在Web项目里获得Office众多强大功能的机会,并且能够同时利用来自 .NET Framework 的开发效率和软件功能。服务器端调用WebOpen打开文档后,浏览器页面里客户端控件会启动客户机上的Word并且运行在网页里而不是本地打开。服务器端无需安装Office软件。
PageOffice的架构很巧妙,开发者只需关注服务器端编程逻辑,客户端如何工作都交由控件自动完成。PageOffice充分利用了分布式计算的思想,把本来要在服务器端运行的Word运算量交给了客户机。也就是说,原来采用服务器端自动化技术的网页同时要处理N个Word任务现在交给了N个客户机,每个客户机运行一个Word。服务器只需处理需要服务器处理的业务逻辑,一切与界面有关、与Word程序本身有关的工作由客户机运行,当然这也是客户机的强项。
PageOffice的架构消除了服务器端运行Word、Excel的风险,又充分利用了客户机闲置的计算资源,这种架构不但解决了ASP、ASP.NET等Windows web服务调用Word、Excel的问题,而且还给Java写的Web服务调用Word、Excel提供了解决方案(Unix、linux等无法自动化Word、Excel)。
PageOffice能够让用户直接在网页里看到word文件内容,并且可以直接编辑、保存回Web服务器,给用户省去了先下载下来,修改完后再上传的麻烦。PageOffice还有其他更多自动化调用Word无法做到的强悍功能,比如只读、防下载、防复制等,你就下载一个慢慢琢磨吧。
附上利用 PageOffice完成本实例相同功能 + 只读防下载功能的代码:
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
PageOffice.WordWriter.WordDocument doc = new PageOffice.WordWriter.WordDocument();
//对数据区域"Title"进行填充
doc.OpenDataRegion("Title").Value = "公文标题";
// 设置界面样式
PageOfficeCtrl1.Theme = PageOffice.ThemeType.Office2010;
PageOfficeCtrl1.Caption = "动态生成文档";
PageOfficeCtrl1.Menubar = false;
PageOfficeCtrl1.OfficeToolbars = false;
PageOfficeCtrl1.AllowCopy = false;//禁止下载、复制粘贴等
// 获取数据对象
PageOfficeCtrl1.SetWriter(doc);
// 只读打开生成的文档
PageOfficeCtrl1.WebOpen("doc/test.doc", PageOffice.OpenModeType.docReadOnly, "张三");
}
分享到:
相关推荐
总结来说,通过ASP.NET Web服务调用WinForms功能是一项技术挑战,但通过合理的设计和编程,我们可以有效地实现两者的协同工作,提高系统的灵活性和可扩展性。在实际开发过程中,还需要关注跨平台兼容性、错误处理...
以下将详细介绍如何实现一个ASP.NET(C#)无限极树实例。 1. **无限极树的概念** 无限级树是一种数据结构,它表示一个节点可以有任意数量的子节点,而每个子节点又可以有无限数量的子节点,以此类推,形成无限级别的...
### ASP.NET读取Word的实例与总结 #### 一、引言 在现代办公环境中,Word文档是非常常见的文件格式之一,对于需要处理大量Word文档的企业来说,能够在ASP.NET应用程序中自动化处理这些文档变得尤为重要。本文将...
ASP.NET调用百度地图API实例是一个典型的Web应用开发案例,主要涉及了两个核心技术:ASP.NET框架和百度地图API。这个实例中,开发者利用ASP.NET的网页编程能力结合百度地图的JavaScript API,实现了动态地在网页上...
在ASP.NET中,使用C#操作Word模板插入文字、图片及表格是一项常见的任务,尤其在自动化报告生成或文档处理的应用中。以下是如何实现这一功能的详细步骤和关键知识点: 首先,你需要创建一个Word模板(例如:`person...
在ASP.NET平台上,使用C#语言进行编程时,有时候我们需要处理的任务是将多个Word文档合并成一个单一的文档。这在处理报告、批量生成合同或者整合数据时非常有用。本篇将详细介绍如何在C#中实现这个功能,以及涉及的...
总结一下,本实例展示了如何在ASP.NET(C#) Web API中利用文件流实现文件下载。通过创建HTTP响应,设置正确的响应头,并将文件内容作为流发送,我们可以方便地让客户端接收到文件并保存到本地。这种方法简单、高效,...
### ASP.NET 调用 Java WebService 实例详解 #### 背景介绍 随着互联网技术的发展,跨平台、跨语言的服务交互变得越来越重要。Web Service 技术为不同编程环境之间的服务通信提供了一种标准的方式。本文将详细介绍...
本文将深入探讨如何在C#环境下利用海康的SDK进行视频调用,并通过具体的项目示例——"TestHKCamera"和"MyVideo"来阐述相关知识点。 1. 海康SDK介绍: 海康SDK(Software Development Kit)是一组用于开发视频监控...
本教程聚焦于使用C#编程语言开发OCX(OLE Control Extension)控件,并在ASP.NET环境中进行调用,这对于那些希望深入理解.NET框架与Web应用程序交互的初学者来说极具价值。OCX控件是Windows应用程序中的一个重要组成...
ASP.NET是微软公司推出的...总之,"ASP.NET基础教程——C#案例版"涵盖了从基础概念到高级特性的广泛内容,通过实例教学帮助学习者快速掌握ASP.NET和C#在Web开发中的应用,为成为一名合格的ASP.NET开发者奠定坚实基础。
ASP.NET 操作 ECharts 是一个将后端数据与前端可视化图表结合的过程,主要涉及 ASP.NET、C# 和 ECharts 三部分技术。ECharts 是百度推出的一款轻量级的 JavaScript 图表库,提供了丰富的图表类型,如折线图、柱状图...
ASP.NET是微软提供的一个用于构建Web应用程序的框架,它支持多种编程语言,如C#、VB.NET等,提供了丰富的服务器控件、数据绑定机制以及强大的状态管理功能。在ASP.NET中,开发者可以创建动态、交互式的网页,同时ASP...
在IT领域,尤其是在Web开发中,ASP.NET与C#结合使用是构建动态网站和应用程序的常见方式。存储过程(Stored Procedure)作为数据库管理中的一个重要组件,其高效性和安全性使其成为处理复杂数据操作的理想选择。本文...
【标题】:“asp.net(C#)工商...通过以上步骤,你将能够利用asp.net(C#)构建一个与工商银行银企互联的实例。这个过程既涵盖了Web开发的基础知识,也涉及到与银行系统的高级交互,对于提升你的开发技能具有很高的价值。
C# _.NET_动态调用webservice的三种方式 在本文中,我们将讨论如何动态调用WebService的三种方式。在某些情况下,我们可能需要在程序运行期间动态调用一个未知的服务。这可以通过使用.NET Framework的System.Web....
ASP.NET和C#是开发Web应用程序的常用技术组合,其中C#是一种面向对象的编程语言,而ASP.NET是一个用于构建动态网站、Web应用和Web服务的框架。在这些项目中,设计模式扮演着重要的角色,因为它们提供了解决常见问题...
在与ASP.NET结合使用时,SQL Server通常作为后端数据存储,通过ADO.NET或Entity Framework等数据访问技术与前端交互。这些技术允许开发者以声明性方式执行SQL查询,管理和操作数据库中的数据。 在"系统源代码"中,...
ASP.NET (C#) 编程实例是针对微软.NET框架下的C#编程语言设计的一系列实践项目,旨在帮助开发者深入理解和应用C#语言在Web开发中的功能和特性。这一系列实例覆盖了各种常见且实用的功能,是学习和提升C#在ASP.NET中...
【MVP ASP.NET实例】是一种将Model-View-Presenter(MVP)设计模式应用于ASP.NET开发的实际案例。在这个实例中,我们将深入探讨如何利用MVP模式来构建更清晰、更可维护的Web应用程序,同时结合Entity Framework进行...