.NET通过调用Office组件导出Word文档

  最近做项目需要实现一个客户端下载word表格的功能,该功能是用户点击"下载表格",服务端将该用户的数据查询出来并生成数据到Word模板中,再反馈给客户端下载。

实现思路如下:

利用微软提供的Office的组件来完成,在服务器端指定目录放置一个word模板(该模板中需要替换的数据信息用书签标记好),当请求过来的时候,读取模板信息并将书签内容替换成从数据库获得的信息在返回给客户端下载即可,代码如下:

  1. #region 根据申请单ID号和模板生成word下载文件(书签的形式)
  2. public void DownLoadWordOld(string id)
  3. {
  4. if (string.IsNullOrEmpty(id))
  5. {
  6. id = "";
  7. }
  8. string sql = "SELECT ID,ProposerName,PhoneNo,ProposerAddress,HouseArea,HouseType,HouseNature,ApplyDate" +
  9. " from BettingStationApply where ID=@id ";
  10. SqlParameter[] parm = new SqlParameter[] { new SqlParameter("@id", int.Parse(id)) };
  11. //根据ID号取得当前申请单的详细信息
  12. DataTable dt = DBHelper.GetDataSet(sql, parm);
  13. if (dt.Rows.Count > )
  14. {
  15. DataRow dr = dt.Rows[];
  16.  
  17. //1、先创建一个创建word的Application
  18. Word.Application wordApp = new Word.ApplicationClass();
  19. //2、创建一个word文档
  20. Word.Document docFile = null;
  21. try
  22. {
  23. wordApp.Visible = false;
  24. //模板对象
  25. object objTemplete = Server.MapPath(@"/BettingStation/templete.docx");
  26. object objTrue = true;
  27. object objFalse = false;
  28. object objDocType = Word.WdDocumentType.wdTypeDocument;
  29. //实例化word文档(已经读取到模板的word文档)
  30. docFile = wordApp.Documents.Add(ref objTemplete, ref objFalse, ref objDocType, ref objTrue);
  31.  
  32. //定义书签变量
  33. object ProposerName = "ProposerName";
  34. object PhoneNo = "PhoneNo";
  35. object ProposerAddress = "ProposerAddress";
  36. object HouseArea = "HouseArea";
  37. object HouseType = "HouseType";
  38. object HouseNature = "HouseNature";
  39. object ApplyDate = "ApplyDate";
  40. //获取所有的书签
  41. Word.Bookmarks books = docFile.Bookmarks;
  42. //给书签赋值
  43. if (books.Exists("ProposerName"))
  44. {
  45. books.get_Item(ref ProposerName).Range.Text = dr["ProposerName"].ToString();
  46. }
  47. if (books.Exists("PhoneNo"))
  48. {
  49. books.get_Item(ref PhoneNo).Range.Text = dr["PhoneNo"].ToString();
  50. }
  51. if (books.Exists("ProposerAddress"))
  52. {
  53. books.get_Item(ref ProposerAddress).Range.Text = dr["ProposerAddress"].ToString();
  54. }
  55. if (books.Exists("HouseArea"))
  56. {
  57. books.get_Item(ref HouseArea).Range.Text = dr["HouseArea"].ToString();
  58. }
  59. if (books.Exists("HouseType"))
  60. {
  61. books.get_Item(ref HouseType).Range.Text = dr["HouseType"].ToString();
  62. }
  63. if (books.Exists("HouseNature"))
  64. {
  65. books.get_Item(ref HouseNature).Range.Text = dr["HouseNature"].ToString();
  66. }
  67. if (books.Exists("ApplyDate"))
  68. {
  69. if (dr["ApplyDate"] != DBNull.Value)
  70. {
  71. books.get_Item(ref ApplyDate).Range.Text = Convert.ToDateTime(dr["ApplyDate"].ToString()).ToString("yyyy-MM-dd HH:mm:ss");
  72. }
  73. }
  74.  
  75. object fileName = Server.MapPath(@"/BettingStation/投注站申请表.docx");
  76.  
  77. object nothing = Type.Missing;
  78. //将当前文件保存到临时文件中
  79. docFile.SaveAs2(ref fileName, ref nothing, ref nothing, ref nothing, ref nothing, ref nothing
  80. , ref nothing, ref nothing, ref nothing, ref nothing, ref nothing, ref nothing
  81. , ref nothing, ref nothing, ref nothing, ref nothing, ref nothing);
  82. //关闭当前word文档
  83. docFile.Close(ref nothing, ref nothing, ref nothing);
  84. //退出当前word程序的调用
  85. wordApp.Quit(ref nothing, ref nothing, ref nothing);
  86. docFile = null;
  87.  
  88. //从服务器临时文件夹中下载文件返回给客户端
  89. ExtWord(fileName.ToString(), dr["ProposerName"].ToString() + "_投注站申请表.docx");
  90. //调用客户端js方法
  91.  
  92. }
  93. catch (Exception ex)
  94. {
  95. writeLog.WriteErrorLog("根据模板生成Word文件出错!错误信息:" + ex.Message);
  96. //出异常记得释放相关资源
  97. object nothing = Type.Missing;
  98. //关闭当前word文档
  99. docFile.Close(ref nothing, ref nothing, ref nothing);
  100. //退出当前word程序的调用
  101. wordApp.Quit(ref nothing, ref nothing, ref nothing);
  102. docFile = null;
  103. Message.show("根据模板生成Word文件出错!错误信息:" + ex.Message);
  104. }
  105. }
  106. else
  107. {
  108. writeLog.WriteErrorLog("id=" + id + "没有查找到任何数据!");
  109. Message.show("id=" + id + "没有查找到任何数据!");
  110. }
  111.  
  112. }
  113. #endregion

调用offic组件需要添加Interop.Microsoft.Office.Interop.Word.dll的引用,我电脑上装的Office2010,所以添加Microsoft Word 14.0 Object Library的引用

  1. Word模板在服务器端生成好后,在利用Response方法将生成的word文档发送给客户端下载,代码如下:
  1. #region 从服务器指定路径下载Word
  2. /// <summary>
  3. /// 从服务器指定路径下载Word
  4. /// </summary>
  5. /// <param name="fileFullName">临时文件在服务器上的完整路径</param>
  6. /// <param name="wordname">下载的Word文件名</param>
  7. public void ExtWord(string fileFullName, string wordname)
  8. {
  9. //输出word
  10. FileInfo file = new System.IO.FileInfo(fileFullName);
  11. HttpContext.Current.Response.Clear();
  12. HttpContext.Current.Response.Charset = "GB2312";
  13. HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.UTF8;
  14. // 添加头信息,为"文件下载/另存为"对话框指定默认文件名
  15. HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(wordname, System.Text.Encoding.UTF8));
  16. // 添加头信息,指定文件大小,让浏览器能够显示下载进度
  17. HttpContext.Current.Response.AddHeader("Content-Length", file.Length.ToString());
  18. // 指定返回的是一个不能被客户端读取的流,必须被下载
  19. HttpContext.Current.Response.ContentType = "application/ms-word";
  20. // 把文件流发送到客户端
  21. HttpContext.Current.Response.WriteFile(file.FullName);
  22. // 停止页面的执行
  23. HttpContext.Current.ApplicationInstance.CompleteRequest();
  24. }
  25. #endregion

测试,运行没问题。

  将开发环境测试OK的程序发布到正式的服务器环境后发现,不能运行,导出会出现错误。解决方法如下:

1、确保服务器上已经安装了并激活word程序(建议安装word2010);

2、当开发的通过word模板生成word程序完成后,部署在windows相关的服务器上时,如果出现以下的错误(读取word组件的Com权限问题):

3、查看错误的字面意思,应该是COM组件的配置有问题,网上查阅相关资料发现是权限的配置的问题!

4、以下步骤重点是给iis授予com组件的访问权限:

步骤一:找到导出word所用到的com组件;

(1)控制面板-》管理工具-》组件服务-》计算机-》我的电脑-》DCOM配置-》Mircosoft Word文档;

注:如果这样操作找不到Mircosoft word相关文档,不用慌,尝试以下方法:

Cmd-》mmc -32-》文件-》添加/删除管理单元-》选择组件服务-》确定-》计算机-》我的电脑-》DCOM配置-》找到Mircosoft Word 97-2003文档,按照以下的方法操作即可;

步骤二:找到word文档后,在它上面点击右键,然后点击"属性",

弹出"Microsoft word 应用程序属性"对话框,

步骤一:点击"标识"标签,选择"交互式用户"

步骤三:点击"安全"标签,在"启动和激活权限"上点击"自定义",然后点击对应的"编辑"按钮,在弹出的"安全性"对话框中填加 IIS_IUSRS账户(IIS账户),并按照如下图所示授予相关权限:

,

步骤四:依然是"安全"标签,在"访问权限"上点击"自定义",然后点击"编辑",配置的账号和方法和上一步操作一样;

六:重启网站并运行,点击下载表格按钮即成功。

.NET通过调用Office组件导出Word文档的更多相关文章

  1. 使用Spire.Doc组件利用模板导出Word文档

    以前一直是用Office的组件实现Word文档导出,但是让客户在服务器安装Office,涉及到版权:而且Office安装,包括权限配置也是比较麻烦. 现在流行使用第三方组件来实现对Office的操作, ...

  2. C#导出Word文档开源组件DocX

    1.帮助文档,这东西找了很久,而且它版本很旧,还是英文,W8.1系统上打不开 http://download.csdn.net/detail/zuofangyouyuan/7673573 2.开源网址 ...

  3. Java 用Freemarker完美导出word文档(带图片)

    Java  用Freemarker完美导出word文档(带图片) 前言 最近在项目中,因客户要求,将页面内容(如合同协议)导出成word,在网上翻了好多,感觉太乱了,不过最后还是较好解决了这个问题. ...

  4. freemarker导出word文档

    使用freemarker导出word文档的过程 **************************************************************************** ...

  5. PHP网页导出Word文档的方法分离

    今天要探讨的是PHP网页导出Word文档的方法,使用其他语言的朋友也可以参考,因为原理是差不多的. 原理 一般,有2种方法可以导出doc文档,一种是使用com,并且作为php的一个扩展库安装到服务器上 ...

  6. c#导出word文档

    为方便下次遇到不知道去哪找先把它存放在这里,以下是保存导出word主要类方法 public class BiultReportForm { /// <summary>word 应用对象 & ...

  7. 【Java】用Freemarker完美导出word文档(带图片)

    Java  用Freemarker完美导出word文档(带图片) 前言 最近在项目中,因客户要求,将页面内容(如合同协议)导出成word,在网上翻了好多,感觉太乱了,不过最后还是较好解决了这个问题. ...

  8. C# 导出word文档及批量导出word文档(4)

          接下来是批量导出word文档和批量打印word文件,批量导出word文档和批量打印word文件的思路差不多,只是批量打印不用打包压缩文件,而是把所有文件合成一个word,然后通过js来调用 ...

  9. freemarker导出word文档——WordXML格式解析

    前不久,公司一个项目需要实现导出文档的功能,之前是一个同事在做,做了3个星期,终于完成了,但是在项目上线之后却发现导出的文档有问题,此时,这个同事已经离职,我自然成为接班者,要把导出功能实现,但是我看 ...

随机推荐

  1. leetcode@ [274/275] H-Index & H-Index II (Binary Search & Array)

    https://leetcode.com/problems/h-index/ Given an array of citations (each citation is a non-negative ...

  2. SQL2008R2日志传送需要注意点

    当SQL2008R2采用日志传送方式进行备份/还原时需要注意事项 主从数据库机器必须是局域网内可互相通过共享访问的主机 主从数据库须添加系统帐号,并将sqlagent服务的启动帐号设定为此帐号,最好主 ...

  3. 1N系列稳压二极管参数

    1N系列稳压二极管参数 型号 稳定电压 型号 稳定电压 型号 稳定电压 1N5236 7.5 1N5738 12 1N6002 12 1N5237 8.2 1N5739 13 1N6003 13 1N ...

  4. [OC Foundation框架 - 15] NSDate

    日期处理类 定义 时间间隔计算 时间比较,返回其一 时间格式化 void dateCreate() { //date return current time NSDate *date = [NSDat ...

  5. [Objective-c 基础 - 2.3] 继承、组合

    A.继承的实现: is a 1.不允许子类.父类存在相同的成员变量 2.方法调用优先原则:子类调用方法的时候,优先从本类寻找,若无则向上在父类中寻找 3.重写:子类重新实现父类的方法,覆盖父类之前的方 ...

  6. BAT及各大互联网公司2014前端笔试面试题:JavaScript篇

    前面几题是会很基础,越下越有深度. 初级Javascript: 1.JavaScript是一门什么样的语言,它有哪些特点? 没有标准答案. 2.JavaScript的数据类型都有什么? 基本数据类型: ...

  7. IE下使用ADODB.Stream实现断点续传

    最近研究了一下IE自带的一些Activex控件,可以比较简单的实现断点续传功能 不过这种方式不推荐,因为安全性较低,而且需要修改客户端注册表,调低ie安全配置 还有就是我比较懒,只打算写个思路和几个关 ...

  8. 【转载】Restful 简介

    转自阮一峰的网络日志  http://www.ruanyifeng.com/blog/2011/09/restful.html 越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种&quo ...

  9. xcode中create groups 和 create folder reference 的区别

    (文章为博主原创,未经允许,不得转载!) 今天在项目中搭建框架忽然发现工程中有黄蓝文件夹的区别,而且对应到不同的情况: 1.蓝色文件夹下文件不能被读取: 2.蓝色文件夹下创建新的文件类会直接跳过选择类 ...

  10. maven依赖传递关系

    一.maven 依赖传递规则 举个例子,比如A依赖B,B依赖C,那么A也是依赖C的.A是对B的直接依赖,A对C是传递依赖 ①.最短路劲原则 如,路劲一:A依赖B,B依赖C,C依赖D(1.0.0): 路 ...