当前位置: 代码迷 >> ASP.NET >> 求教在web 中打开 word (文字、表格、图片等格式都不能乱),该如何处理
  详细解决方案

求教在web 中打开 word (文字、表格、图片等格式都不能乱),该如何处理

热度:1624   发布时间:2013-02-25 00:00:00.0
求教在web 中打开 word (文字、表格、图片等格式都不能乱)
平台为 vs2008 c# 
要在asp.net中显示 word文件。文件中有文字、表格、图片等内容,所以要求格式不能乱。要求达到速度快点,能进行适当控制(譬如只读,去工具条等与ie能融入一体)

目前已经找到一种方法:
<form id="form1" runat="server"> 
  <iframe src="./myname.doc" width="100%" height="600px" runat="server" id="iframedoc"> 
????? </iframe> 
  </form> 

可这样的方式有诸多缺点:一来有ie提示,二比较慢,三来无法更多控制(可能是我没找到,在打5个问号的地方能否插入些控制语句?)。 

找了不资料,总没理想答案。希望懂的高手不吝指教!


------解决方案--------------------------------------------------------
用微软Office中间件——SOAOffice搞定 
这个软件是专门解决Web下如何存取、调用微软Office的
------解决方案--------------------------------------------------------
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进程的权限,他就能完全控制你的服务器。
  相关解决方案