服务端的图片文件在哪 在Web项目服务端访问Office文件

  【摘要】在Web项目中引用Office.Interop程序集来控制Office文件,是一种非常方便快捷的方法。本文以服务端访问Excel文件为例,分析了这种解决方案的设计方法及利弊。
  【关键词】Web;ASP.NET;Office;Interop
  
  ASP.NET可以很方便地创建基于CS结构的Office解决方案,但在Web项目中,若要对服务端Office文件进行一些访问处理,通常是引用Microsoft.Office.Interop程序集来解决问题。这是一种是使用托管代码实现自动化,由运行库可调用包装RCW充当托管代码与 COM 服务器之间媒介的解决方案。下面以一个Excel应用为例,谈谈这种方案的设计方法及利弊。
  一、项目说明
  Web项目需要依据WEB服务端的Excel模板文件,生成一份最新数据的Execl报表文件,供客户端浏览下载。
  二、设计说明
  1、在服务端安装Office软件。因为解决方案要调用Office软件里的一些COM组件,所以需要根据项目需求,在Web服务器上安装相应的Office2003或2007版本的Office软件。注意不要安装精简版的,因为这种版本可能会删除了一些COM组件,使用程序运行过程发生错误。
  2、在项目中引用Microsoft.Office.Interop.Excel程序集。Office2003和Office2007对应的版本分别是11.0.0.0和12.0.0.0。随后托管语言利用这些程序集实现与COM服务器之间的通信。
  3、模拟身份验证用户。文件的创建、COM组件的调用、Office进程的中止在服务端都需要一定权限。除可采用在服务端授予ASPNET用户相应权限这种方法外,在运行代码的特定部分模拟服务端身份验证用户也不失为一个较好的解决方法。后者在项目设计时比较简单,同时也具有编程可控的特点。在微软帮助和支持中心《如何在ASP.NET应用程序中实现模拟》(文章编号为306158)一文中,设计了impersonateValidUser()和undoImpersonation()两个方法来模拟身份和取消模拟身份。
  4、创建Excel报表文件。通过调用System.IO.File.Copy()方法,将Excel模板文件复制为新的Excel报表文件。
  5、实例化工作表对象。在网页代码中引用Microsoft.Office.Interop.Excel命名空间,并分别创建相应的Application应用程序、Workbook工作簿、Worksheet工作表实例。
  6、编辑单元格。通过调用Worksheet.get_Range()方法,对Range对象的Value2、Font、RowHeight、ColumnWidth等属性进行赋值,从而更新单元格数据及格式。
  7、保存工作簿,并退出应用程序。调用Workbook.Close()方法保存并关闭工作簿,再调用Application.Quit()方法退出Excel应用程序。
  8、中止进程。实例化Excel应用程序时,在服务端会产生一个大约10M的“EXCEL.EXE”进程,退出Excel应用程序并不能关闭此进程。对于.NET的垃圾回收器,释放对象并不表示对象已被清除,这就使得该进程在内存中的保留时间可能长于预期时间,即使直接调用一些垃圾回收方法,也很难立即释放进程资源。比较彻底的做法是调用Process.Kill()方法中止进程,但这种方法也会带来误删进程的风险。
  9、取消模拟身份。完成所有的工作后,及时调用undoImpersonation()方法取消模拟身份。
  三、设计代码
  using System.IO;
  using System.Reflection;
  using Excel = Microsoft.Office.Interop.Excel;
  using System.Diagnostics;
  
  protected void ExcelExport()
  {
  //模拟身份验证用户
  if (!(impersonateValidUser(“userName”,“domain”,“password”)))
  {
  lblExportMsg.Text = “模拟身份失败!”;
  return;
  }
  //生成Excel报表文件
  string BaseFile = Server.MapPath(“~/XLT/EXCEL模板.xls”);
  string NewFile = @”d:\ExportFiles\newReport.xls”
  File.Copy(BaseFile,NewFile,true);
  //创建工作表实例
  Missing Miss = Missing.Value;
  Excel.Application ExcelApp = new Microsoft.Office.Interop.Excel.ApplicationClass();
  Excel.Workbook OpenWorkbook = ExcelApp.Workbooks.Open(@NewFile,Miss,Miss,Miss,Miss,Miss,Miss,Miss,Miss,Miss,Miss,Miss,Miss,Miss,Miss);
  Excel.Worksheet Sheet1 = (Excel.Worksheet)OpenWorkbook.Sheets[1];
  //更新单元格内容
  Sheet1.get_Range(“C4”,
  “C4”).Value2 = “new value”;
  //保存并退出Excel
  OpenWorkbook.Close(true,Miss,Miss);
  ExcelApp.Quit();
  //释放资源
  foreach (Process thisproc in Process.GetProcessesByName(“EXCEL”))
  {
  try { thisproc.Kill();}
  catch { }
  }
  //取消模拟身份验证用户
  undoImpersonation();
  }
  四、结语
  在Web项目中控制Office文件,有很多种解决方案。使用Interop程序集,是一种非常方便快捷的方法。但这种方法也有它的一些弊端,比如在服务端部署时需安装相应版本的Office软件、COM组件内存资源消耗大、内存资源难回收等,这些都是在解决方案中需要改进的地方。
  
  参考文献
  [1]How to implement impersonation in an ASP.NET application[EB/OL].http://support.microsoft.com/kb/306158.
  [2]Develop Microsoft Office solutions with Visual Studio .NET[EB/OL]. http://support.microsoft.com/kb/311452.
  [3]邹黎.基于Web的Office应用开发的研究和实践[J].硅谷,2011(05).
  
  作者简介:秦旭明(1973—),男,惠州工业科技学校讲师。
  
  

推荐访问:服务端 文件 项目 访问