最近在做人事项目中的,数据导出word,具体的说就是从web客户端页面获取信息,添加到信函模板中,再导出为word文档。总结一下,学会了两种方法,1.通过将word模板转换为html文件,输出word。2.利用第三方组件Aspose.Words操作word模板,输出word。
文件—另存为—网页htm文件。
<asp:Button ID="btnHtmlCreateWord" runat="server" Text="HtmlCreateWord" OnClick="btnHtmlCreateWord_Click" />
#region htm模板生成Word /// <summary> /// 通过htm模板生成Word /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void btnHtmlCreateWord_Click(object sender, EventArgs e) { // 获取模板的路径 通过ExprotToWord处理返回字符串 string strWord = DealTemplate(Server.MapPath("~/htm/模版.htm")); Response.ContentEncoding = System.Text.Encoding.Default; Response.ClearContent(); //清除缓冲区的所有内容输出 Response.ClearHeaders(); Response.AddHeader("content-disposition", "attachment;filename=导出word.doc"); Response.AddHeader("Content-type", "application"); Response.ContentType = "application/ms-html"; //设置输出流类型 Response.ContentEncoding = System.Text.Encoding.Default; //设置字符集 Response.Write(strWord); Response.Flush(); Response.Close(); } /// <summary> /// 处理模板 返回处理结果 /// </summary> /// <param name="templatePath"></param> /// <returns></returns> public string DealTemplate(string templatePath) { StringBuilder strBuilder = new StringBuilder(1024); // 读取文档内容并转换成流的形式 编码为默认编码 StreamReader sr = new StreamReader(templatePath, Encoding.Default); // 将流转换成字符串加进StringBuilder中 strBuilder.Append(Encoding.Default.GetString(Encoding.Default.GetBytes(sr.ReadToEnd()))); // 把文档中标志位换成需要的内容 strBuilder.Replace("{name}", "杜文"); strBuilder.Replace("{sex}", "男"); strBuilder.Replace("{nation}", "汉族"); strBuilder.Replace("{nowTime}", String.Format("{0:D}", DateTime.Now)); return strBuilder.ToString(); } #endregion
利用转换为htm文件的方式导出word文档,原理是将word内容转换为string,再替换其中的占位符,在转成流形式进行导出,但是转换编号的过程,容易造成乱码。并且模板调整时也要再次转换htm文件,所以这种方法用起来不是特别灵活和简单。
<asp:Button ID="btnAsposeCreateWord" runat="server" Text="AsposeCreateWord" OnClick="btnAsposeCreateWord_Click" />
#region Aspose.Words操作word模板,输出word protected void btnAsposeCreateWord_Click(object sender, EventArgs e) { var path = Server.MapPath("~/doc/模版.doc"); //获取模版的地址 Document doc = new Document(path); DocumentBuilder builder = new DocumentBuilder(doc); //通过操作DocumentBuilder实现输出word内容 //替换标签中的内容 doc.Range.Replace("{name}", "杜文", false, false); doc.Range.Replace("{sex}", "男", false, false); doc.Range.Replace("{nation}","汉族",false ,false ); doc.Range.Replace("{nowTime}", String.Format("{0:D}", DateTime.Now), false, false); var fileName = "导出word.doc"; //设置文件名 doc.Save(fileName, SaveFormat.Doc, SaveType.OpenInBrowser, Response); //保存 } #endregion
这种方法其实和上一种的原理是一致的。都是替换模板中的占位符,但是不同的是,使用aspose组件不用去转换模板文件,也不涉及到编码和解码,所以这种方法比较灵活简单,代码也更容易理解。
这两种模板导出word的方法,通过团队的知识的分享、网上搜索获得的。而通过这种方式获得解决方案,又恰恰的再一次证明了,站到巨人的肩膀上的重要性,这既是巨人的力量。
源码地址:http://download.csdn.net/detail/suneqing/7361883