首页 > 代码库 > 站在巨人的肩膀上——人事项目数据导出word

站在巨人的肩膀上——人事项目数据导出word

      最近在做人事项目中的,数据导出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的方法,通过团队的知识的分享、网上搜索获得的。而通过这种方式获得解决方案,又恰恰的再一次证明了,站到巨人的肩膀上的重要性,这既是巨人的力量。

源码地址:http://download.csdn.net/detail/suneqing/7361883