.NET通过调用Office组件导出Word文档
最近做项目需要实现一个客户端下载word表格的功能,该功能是用户点击"下载表格",服务端将该用户的数据查询出来并生成数据到Word模板中,再反馈给客户端下载。
实现思路如下:
利用微软提供的Office的组件来完成,在服务器端指定目录放置一个word模板(该模板中需要替换的数据信息用书签标记好),当请求过来的时候,读取模板信息并将书签内容替换成从数据库获得的信息在返回给客户端下载即可,代码如下:
#region 根据申请单ID号和模板生成word下载文件(书签的形式) public void DownLoadWordOld(string id) { if (string.IsNullOrEmpty(id)) { id = "0"; } string sql = "SELECT ID,ProposerName,PhoneNo,ProposerAddress,HouseArea,HouseType,HouseNature,ApplyDate" + " from BettingStationApply where ID=@id "; SqlParameter[] parm = new SqlParameter[] { new SqlParameter("@id", int.Parse(id)) }; //根据ID号取得当前申请单的详细信息 DataTable dt = DBHelper.GetDataSet(sql, parm); if (dt.Rows.Count > 0) { DataRow dr = dt.Rows[0]; //1、先创建一个创建word的Application Word.Application wordApp = new Word.ApplicationClass(); //2、创建一个word文档 Word.Document docFile = null; try { wordApp.Visible = false; //模板对象 object objTemplete = Server.MapPath(@"/BettingStation/templete.docx"); object objTrue = true; object objFalse = false; object objDocType = Word.WdDocumentType.wdTypeDocument; //实例化word文档(已经读取到模板的word文档) docFile = wordApp.Documents.Add(ref objTemplete, ref objFalse, ref objDocType, ref objTrue); //定义书签变量 object ProposerName = "ProposerName"; object PhoneNo = "PhoneNo"; object ProposerAddress = "ProposerAddress"; object HouseArea = "HouseArea"; object HouseType = "HouseType"; object HouseNature = "HouseNature"; object ApplyDate = "ApplyDate"; //获取所有的书签 Word.Bookmarks books = docFile.Bookmarks; //给书签赋值 if (books.Exists("ProposerName")) { books.get_Item(ref ProposerName).Range.Text = dr["ProposerName"].ToString(); } if (books.Exists("PhoneNo")) { books.get_Item(ref PhoneNo).Range.Text = dr["PhoneNo"].ToString(); } if (books.Exists("ProposerAddress")) { books.get_Item(ref ProposerAddress).Range.Text = dr["ProposerAddress"].ToString(); } if (books.Exists("HouseArea")) { books.get_Item(ref HouseArea).Range.Text = dr["HouseArea"].ToString(); } if (books.Exists("HouseType")) { books.get_Item(ref HouseType).Range.Text = dr["HouseType"].ToString(); } if (books.Exists("HouseNature")) { books.get_Item(ref HouseNature).Range.Text = dr["HouseNature"].ToString(); } if (books.Exists("ApplyDate")) { if (dr["ApplyDate"] != DBNull.Value) { books.get_Item(ref ApplyDate).Range.Text = Convert.ToDateTime(dr["ApplyDate"].ToString()).ToString("yyyy-MM-dd HH:mm:ss"); } } object fileName = Server.MapPath(@"/BettingStation/投注站申请表.docx"); object nothing = Type.Missing; //将当前文件保存到临时文件中 docFile.SaveAs2(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, ref nothing); //关闭当前word文档 docFile.Close(ref nothing, ref nothing, ref nothing); //退出当前word程序的调用 wordApp.Quit(ref nothing, ref nothing, ref nothing); docFile = null; //从服务器临时文件夹中下载文件返回给客户端 ExtWord(fileName.ToString(), dr["ProposerName"].ToString() + "_投注站申请表.docx"); //调用客户端js方法 } catch (Exception ex) { writeLog.WriteErrorLog("根据模板生成Word文件出错!错误信息:" + ex.Message); //出异常记得释放相关资源 object nothing = Type.Missing; //关闭当前word文档 docFile.Close(ref nothing, ref nothing, ref nothing); //退出当前word程序的调用 wordApp.Quit(ref nothing, ref nothing, ref nothing); docFile = null; Message.show("根据模板生成Word文件出错!错误信息:" + ex.Message); } } else { writeLog.WriteErrorLog("id=" + id + "没有查找到任何数据!"); Message.show("id=" + id + "没有查找到任何数据!"); } } #endregion