已阅读5页,还剩1页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
A读取Word的实例与总结-计算机安全摘 要:本文通过一个实用例子完整演示了如何使用C#在ASP.NET里调用Word、自动化Word,并且总结了实际应用中发现的问题,最后提出了有效的解决方案。 关键词:ASP.NET; C#; Word; 自动化; VBA; COM; 死进程; 本文描述了如何使用Microsoft Word在Web页面ASP文件中添加拼写检查功能。 详细的步骤 按照下列步骤建立ASP应用程序: 1、在Web服务器所在机器上,启动Microsoft Visual Interdev 6.0,选择File/New Project。 2、在“新工程”对话框的名字编辑域中,输入“WebSpell”,然后双击新Web工程图标。 3、在接着出现的Web工程向导对话框中,输入或者选择你的Web服务器名字。将工作模式默认为Master,点击Next,再点击“finish”。 4、在Visual InterDev创建工程完成后,打开工程菜单,选择“添加Web Item/HTML页面”,命名为“CheckSpelling”,然后点击Open。 5、添加的HTML页面默认状态下以设计视图打开。在页面上拖出一个HTML文本区域,放置一个HTML提交按钮,根据你的爱好进行布局,在页面上输入一些文字,告诉用户在文本域中输入需要进行拼写检查的文字。 6、选择页面上的所有对象(CTRL+A),然后从Visual InterDev的 HTML菜单中选择Form,将对象包裹在表单中。 7、点击当前窗口底部的源码功能页面,切换到源码显示视图。修改HTML开放标记的action属性值为results.asp。 8、打开Project菜单,选择“添加Web Item/Active Server Page”,命名为“results”,然后点击“Open”。 9、对于新页面,切换到源码视图,在标记之间输入下面的代码: Spelling Results The text you entered was: There were no spelling errors. There were spelling error(s). Word Suggestions % for each wdError in wdErrors Write the word in question. Response.Write() Response.Write(wdError.Text) Response.Write() Get spelling suggestions for it. dim wdSuggestions set wdSuggestions = wdApp.GetSpellingSuggestions(wdError.Text) if wdSuggestions.Count 0 then a comma-separated list of suggestions. dim strSuggestions strSuggestions = , for each wdSuggestion in wdSuggestions strSuggestions = strSuggestions & wdSuggestion.Name & , next Remove extra comma & space. strSuggestions = Right(strSuggestions, len(strSuggestions)-2) Write out suggestions. Response.Write(strSuggestions) else Response.Write(None.) end if set wdSuggestions = Nothing Response.Write() next end if Release references. set wdErrors = nothing set wdDoc = nothing set wdApp = nothing Were done, allow other sessions to continue. Application(WordInUse) = 0 % 10、在Visual InterDev 工程浏览窗口中,双击Global.asa文件,在标记之间添加下面2段子程序: Sub Application_OnStart() Launch Word. dim wdApp set wdApp = CreateObject(Word.Application) set Application(WordApp) = wdApp Add a document. set Application(WordDoc) = wdApp.Documents.Add Release reference. set wdApp = nothing End Sub Sub Application_OnEnd() Get Automation references. dim wdApp set wdApp = Application(WordApp) dim wdDoc set wdDoc = Application(WordDoc) Tell Word to shutdown. wdDoc.Saved = true wdApp.Quit Release references. set Application(WordDoc) = Nothing set Application(WordApp) = Nothing set wdDoc = nothing set wdApp = nothing End Sub 11、最后,在工程浏览窗口中用鼠标右键单击CheckSpelling.htm文件,选择“设置为初始页面”。 12、从File菜单中选择“保存所有”(CTRL+SHIFT+S),再从Build菜单中选择“Build”(Control-Shift+B)。 现在可以进行测试了,在客户端输入“http:/WebSpell/CheckSpelling.htm”。 在Web页面的文本域中输入一些文字,点击“Submit”,然后就可以看到results.asp对你输入的文字报告一些错误拼写和建议。 工程的工作流程 当用户首次浏览到CheckSpelling.htm页面时,Application_OnStart()事件被触发。这个过程启动Microsoft Word,为拼写检查做准备,保存应用和文档对象到2个ASP应用程序级别的变量中。这使页面变得很有效率,因为你可以再次调用Word的同一实例,而不是为每一次拼写检查要求都执行多次实例。接着,当用户点击按钮Submit时,result.asp页面通过ASP的Request对象获取输入值,然后利用存储的Microsoft Word对象来执行拼写检查。result.asp注意了当多个用户会话同时使用同一实例时可能发生的问题,如果一个用户正在使用,就进行调度处理。 注意:一旦一个Web用户登录了工程文件,Web服务器就会有一个WinWord.exe进程在后台运行,它将处理拼写检查的请求。当应用程序发生OnEnd()事件时,ASP应用程序才会释放这个实例,而OnEnd()事件只有当Web服务停止时才被触发。可以通过运行下列的命令来停止并重新启动Web服务: net stop w3svc 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(, window.open(+newFileName+); 运行前,工程目录下建文件夹doc, doc里新建一个test.doc,内容自己定,手动插入一个名为“Title”的标签。 此代码在 VS.Net2003+WinXP+Office2007 下运行通过。 如果你在运行时出现下面的调试错误: 拒绝访问。 说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.UnauthorizedAccessException: 拒绝访问。 ASP.NET 未被授权访问所请求的资源。请考虑授予 ASP.NET 请求标识访问此资源的权限。ASP.NET 有一个在应用程序没有模拟时使用的基进程标识(通常,在 IIS 5 上为 MACHINEASPNET,在 IIS 6 上为网络服务)。如果应用程序正在通过 模拟,则标识将为匿名用户(通常为 IUSR_MACHINENAME)或经过身份验证的请求用户。 若要授予 ASP.NET 对文件的写访问权,请在资源管理器中右击该文件,选择“属性”,然后选择“安全”选项卡。单击“添加”添加适当的用户或组。突出显示 ASP.NET 帐户,选中所需访问权限对应的框。 出现以上错误时,表明ASP.NET进程无法对具有用户界面的Word进行自动化调用,必须由一个拥有桌面的用户角色来启动ASP.NET进程。解决方法:在Web.config文件的System.Web节里添加,其中userName和password是你电脑里的Windows登录账户。 3. 方案总结 Web服务器端自动化调用Word在实际应用中发现的问题: l 开发难易度: Word自动化中的调用都基于VBA语法,需要开发者对VBA很熟悉。VBA中Word对象众多、逻辑复杂,COM调用方式难于理解。一般开发者很少接触VBA和COM,因此开发起来比较麻烦。 l 代码安全性: 上述运行错误“拒绝访问”的最佳解决方法就是添加,不过缺点是在Web.config里可以看到你的账户密码,尽管Web.config不会轻易被人下载到,但还是具有一定的危险性。另外也可以运行Dcomcnfg.exe工具提升ASPNET账户权限为交互式用户,当然这样也会增加服务器的风险。网上搜索发现有网友的解决方法是:在.net 安装根目录下找到config文件夹下的machine.config文件将processModel 中的username属性改为SYSTEM。还有网友的解决方法是:将IIS默认的账户改为管理员账户。这两个方法更加危险,一旦黑客获得了ASP.Net进程的权限,他就能完全控制你的服务器。 l 运行稳定性: 微软Office是主要针对普通用户开发的桌面办公应用软件,它具有丰富的UI(用户界面)元素,是一套纯粹的本地运行软件或者说是客户端软件。Word自动化接口主要是为了方便窗口应用程序调用而设计的。例如Delphi、VB、C# Winform等开发的本地应用程序。虽然可以强制Visible为false,Word可以运行在服务器端代码里,但毕竟还是会带来许多棘手问题。1. ASP.NET是基于B/S架构的。B/S架构下用户访问都是并发的,也就是说经常会出现同时N个用户对一个服务器页面发出请求。在这种情况下Word自动化调用会时常出现死进程。2. 由于隐藏界面运行,一些涉及界面的可以在窗口程序里成功调用的接口,在服务器端调用就会失败,甚至崩溃,这种情况也会经常导致死进程。3. 由于Word是复杂的桌面程序,并不符合一般Web服务程序简洁高效的标准,所以在服务器端运行时速度慢,并且还会消耗大量资源(CPU、内存),尤其不能支持大量用户同时访问,资源会很快耗尽。 l 绝大部分开发者对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、E
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 广东省汕头市濠江区金山中学2026届高一上数学期末统考试题含解析
- 西南石油大学《中学语文课程标准与教材分析》2024-2025学年第一学期期末试卷
- 数据分享合作协议
- 企业会活动策划计
- 排水板抗压强度试验记录
- 土的最大干密度(击实法)试验记录
- 高一数学上学期期中模拟卷(北师大版2019高效培优提升卷)(全解全析)
- 科技文献检索与科技论文写作.完美版
- 物资管理系统开题报告
- 《科技论文写作与实践》教学大纲
- GB/T 19077-2024粒度分析激光衍射法
- 合同解除协议书范例模板
- 小学五年级家长会-主题班会
- 流域水环境综合治理
- 智能生产计划管理MES ERP机制 机制 课程教学大纲
- 河道疏浚沙石运输合同
- 路灯灯头改造施工组织设计(方案)
- GB 8903-2024电梯用钢丝绳
- 羽毛球比赛对阵表模板
- 青春健康懂营养智慧树知到期末考试答案章节答案2024年昆明医科大学
- 土壤固化剂对边坡加固
评论
0/150
提交评论