最近在做人事项目中的,数据导出word,具体的说就是从web客户端页面获取信息,添加到信函模板中,再导出为word文档。总结一下,学会了两种方法,1.通过将word模板转换为html文件,输出word。2.利用第三方组件Aspose.Words操作word模板,输出word。
一.通过将word模板转换为html文件,输出word
1.制作word模板,在word文档中要添加内容的地方输入占位符。
2.把word模板另存为html文件。
文件—另存为—网页htm文件。
3前台代码
<asp:Button ID="btnHtmlCreateWord" runat="server" Text="HtmlCreateWord" OnClick="btnHtmlCreateWord_Click" />
4.后台代码
#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
5.运行结果
6.总结
利用转换为htm文件的方式导出word文档,原理是将word内容转换为string,再替换其中的占位符,在转成流形式进行导出,但是转换编号的过程,容易造成乱码。并且模板调整时也要再次转换htm文件,所以这种方法用起来不是特别灵活和简单。
二.利用第三方组件Aspose.Words操作word模板,输出word。
1.制作word模板,在word文档中要添加内容的地方输入占位符,并直接保存文件。
2.前台代码
<asp:Button ID="btnAsposeCreateWord" runat="server" Text="AsposeCreateWord" OnClick="btnAsposeCreateWord_Click" />
3.后台代码,需要导入Aspose.Words.dll
#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
4.运行结果
5.总结
这种方法其实和上一种的原理是一致的。都是替换模板中的占位符,但是不同的是,使用aspose组件不用去转换模板文件,也不涉及到编码和解码,所以这种方法比较灵活简单,代码也更容易理解。
三.最后的总结
这两种模板导出word的方法,通过团队的知识的分享、网上搜索获得的。而通过这种方式获得解决方案,又恰恰的再一次证明了,站到巨人的肩膀上的重要性,这既是巨人的力量。