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

      本帖叙述如何在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 filename=@Server.MapPath("test.doc");
//创建一个名为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个权限;并设置标识为“交互式用户”。

 

图片

 

让远端网页通过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文档了,当然,生成之后还可以下载。。。。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值