注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

奕克

爱家人爱工作爱生活

 
 
 

日志

 
 

让VBA程序登堂入室进入WEB应用  

2010-10-26 22:33:56|  分类: 技术 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
         本帖叙述如何在ASP和ASP.NET网站中利用代码动态生成word文档,以供浏览器端用户下载。这在需要将服务器端数据库内容导出为格式固定的word文档时非常有用。今年毕业设计要做这样的一个系统,有同事问VBA还可以用在WEB上么?那么我们下面就来进行一下可行性研究。。。
        首先我考虑的是asp方法,但是找了国内的一些说法,基本说是要用服务端生成一般文本,但欺骗客户端以word形式打开,这在需要复杂控制word格式时明显是不可行的。
       我写了如下的这段asp页面,但一直运行不成功:
<%
response.Charset="gb2312"
Set wordapp = server.CreateObject("Word.Application")
Set doc = wordapp.Documents.Add
set table=doc.Tables.Add(WordApp.Selection.Range,1,1)
table.Cell(1,1).Range.Text="欢迎来到VBA的世界"
table.Borders.InsideLineStyle = 1
table.Borders.OutsideLineStyle =1
doc.SaveAs server.mappath("test.doc")
doc.Close
wordapp.Quit
Set doc = Nothing
Set wordapp = Nothing
response.Write "<a href=""test.doc"">请点击链接</a>"
%>

    各位看官可能会问,既然不成,为何post出来?且慢,听我后面详解。
    asp方法山穷水尽疑无路后,接着考虑asp.net(c#)方法。google一下,叙述方法的网页不少,如下代码是一个例子:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Reflection;
using Microsoft.Office.Interop.Word;

public partial class _Default : System.Web.UI.Page 
{
protected void Page_Load(object sender, EventArgs e)
    {
Object Nothing=System.Reflection.Missing.Value;
//取得Word文件保存路径
object [email=filename=@Server.MapPath("test.doc]filename=@Server.MapPath(%22test.doc[/email]");
//创建一个名为WordApp的组件对象
Application WordApp=new ApplicationClass();
WordApp.Visible = false;
//创建一个名为WordDoc的文档对象
Document WordDoc=WordApp.Documents.Add(ref Nothing,ref Nothing,ref Nothing,ref Nothing);
//增加一表格
Microsoft.Office.Interop.Word.Table table=WordDoc.Tables.Add(WordApp.Selection.Range,1,1,ref Nothing,ref Nothing);
//在表格第一单元格中添加自定义的文字内容
table.Cell(1,1).Range.Text="欢迎来到VBA的世界";
//设置表格内外边框
table.Borders.InsideLineStyle = Microsoft.Office.Interop.Word.WdLineStyle.wdLineStyleSingle;
table.Borders.OutsideLineStyle = Microsoft.Office.Interop.Word.WdLineStyle.wdLineStyleSingle;
//将WordDoc文档对象的内容保存为DOC文档
WordDoc.SaveAs(ref filename,ref Nothing,ref Nothing,ref Nothing,ref Nothing,ref Nothing,ref Nothing,ref Nothing,ref Nothing,ref Nothing,ref Nothing,ref Nothing,ref Nothing,ref Nothing,ref Nothing,ref Nothing);
//关闭WordDoc文档对象
WordDoc.Close(ref Nothing, ref Nothing, ref Nothing);
//关闭WordApp组件对象
WordApp.Quit(ref Nothing, ref Nothing, ref Nothing);
//返回结果
Response.Write(@"文档路径:<a href=""Test.doc"">(点击链接查看)</a>");
    }
}

这段代码的作用跟前面的asp页面功能一样,生成一个简单word文件供下载。运行前需要添加对word库的com引用。这段代码能在VS2008里面运行,但在IIS里无法浏览,明显是权限问题,继续google,发现如下误人子弟的解决方法:
在web.config中加入如下语句:
<identity   impersonate= "true "   userName= "csk1\csk"   password="csk"> </identity> 
即让asp.net程序模拟以管理员身份运行,我试过了,确实能行,但你不怕黑客么?
 
继续google,发现如下方法:配置dcom服务器,让asp.net用户(安装注册.net后的IIS默认用户)具有启动word的权限。即在运行中输入dcomcnfg,回车运行dcom配置,进入组件服务,找到“dcom配置”下的“microsoft word 文档”,然后点击属性,将asp.net用户加入“安全”里面的3个权限;并设置标识为“交互式用户”。
让VBA程序登堂入室进入WEB应用 - wucccsk - wucccsk的博客
 
让远端网页通过IIS能够启动服务器端word程序。是不是这样就行了呢?我沮丧的发现还是不行,会出一个检索com类工厂错误,英文如下:
Retrieving the COM class factory for component with CLSID {000209FF-0000-0000-C000-000000000046} failed due to the following error: 80070005.
 
继续google三个多小时,但在国内网页中一直找不到方法,直到找到如下网页:
http://social.msdn.microsoft.com/forums/en-US/netfxbcl/thread/006cbbac-101a-40ea-ae16-d59a7a2da8b1
所以说学计算机的要学点英文啊,已经不止一次受到外国程序员教诲了,可能老外程序员过得更滋润,有更多时间能答疑解惑吧。。。。这个微软站点非常好,上面有很多MVP在。我在最后一个post中找到了答案,虽然不理解原因,但解决问题了!就是建立注册表文件:
 
REGEDIT4
[HKEY_CLASSES_ROOT\AppID\WINWORD.EXE]
"AppID"="{00020906-0000-0000-C000-000000000046}"
 
双击将它导入注册表就可以了!太感谢了!意外惊喜的是,由于IIS通过asp.net用户具有了启动word的权限,我前面那个asp页面也能生成word文档了!真是柳暗花明又一村啊。。。
 
现在你可以在全世界各地通过浏览器,启动你服务器端的网页,启动服务器上的word,然后在服务器端生成word文档了,当然,生成之后还可以下载。。。。
 
鉴于ASP比ASP.net操作word文档的代码更接近VBA程序,更简单,更能参考VBA帮助,我建议大家用asp来实现生成word这一功能!希望大家享受计算机带给你的方便和快乐!
  评论这张
 
阅读(417)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017