使用freemarker模板引擎生成word文档的开发步骤

1、准备模板文档,如果word文档中有表格,只保留表头和第一行数据;
2、定义变量,将word文档中的变量用${var_name}替换;
3、生成xml文件,将替换变量符后的word文档另存为xml文件;
4、格式化xml文件,使用工具(XmlFormat.exe),自动生成格式化后的xml文件;
5、美化xml文件,${}中的内容仅保留变量名;
6、表格,将表格中的行数据用相应的变量替换,在第一行数据的收尾加标签:<#list tbl1 as tbl1></#list> ,注意:表格可嵌套循环
7、开发后端代码,参考《简单示例》。注意改写Bo中表格属性的getter方法,若想使用标签对数字进行有效数字的控制,那么toGetMap方法返回的数据就不能为字符串。

private List<RiskReportMonth> tabledata109 = new ArrayList<RiskReportMonth>();
public List<RiskReportMonth> getTabledata109() {
    return tabledata109;
}
publicvoid setTabledata109(RiskReportMonth tabledata109) {
    this.tabledata109.add(tabledata109);
}

简单示例:

1、页面展示:点击查询,生成WORD,弹出下载框(没有进度条)
2、对应JS:调用controller中的方法,当没有数据时给予提示

queryRiskReport:function(){
         var viewSelf = this;
         var year = $(‘#year‘).val();
         var month = $(‘#month‘).val();
         $.ajax({
            type:‘GET‘,
            url:$$ctx + "/riskMonthReport/searchByCondition",//程序生成word
            data:{
                year:$(‘#year‘).val(),
                month:$(‘#month‘).val(),
            },
            success:function(result){
                if(result.data){
                   //生成word另存为
                   //window.location.href=$$ctx + "/riskMonthReport/download?outFileName="+result.data.outFileName;
                   window.location.href=$$ctx + "/riskMonthReport/download?outFileName="+result.data.outFileName;
                }else{
                   bootbox.alert("<span style=‘font-size:16px;‘>文件未生成.</span>");
                }
            }
         });
      },

3、对应controller:searchByCondition():根据年月旬生成word文档(存在于程序指定的目录下), download():生成word文档另存为,让用户自定义文档下载路径

  @RequestMapping(value="/searchByCondition")
   @ResponseBody
   public Result searchByCondition(String year, String month){
      String condition = year + month;
      //获得Bo格式的数据
      RiskReportMonthBo bo = riskMonthReportService.searchByCondition(condition);
        try {
          if(bo != null){
             //获得Map格式的数据
             Map<String, Object> dataMap = new HashMap<String, Object>();
              dataMap = riskMonthReportService.toGetMap(bo);
              //程序生成文件名(非汉字,易乱码)
              //String outFileName = bo.getOutFileName() + ".doc";
              String outFileName = bo.getOutFileName() + ".doc";
              //在程序里生成word
              FreemarkerUtils.createDoc("RiskMonthReport.xml",outFileName,dataMap);
              logger.info("文件名:"+outFileName);
            }
      } catch (Exception e) {
         e.printStackTrace();
      }
        return success(bo);
   }
@RequestMapping("/download")
   public void download(String outFileName, HttpServletRequest req, HttpServletResponse resp){

      try {
         String filePath = FreemarkerUtils.wordPath+File.separator + outFileName + ".doc";
         logger.info("文件生成路径:"+filePath);
         FileUtils.downloadFile(new File(filePath), "风险月度分析报告"+ ".doc", req, resp);

      } catch (IOException e) {
         e.printStackTrace();
         try {
            resp.sendError(HttpServletResponse.SC_NOT_FOUND, "文件未生成");
         } catch (IOException e1) {
            e1.printStackTrace();
         }
      }
   }

4、对应Service:查询数据,封装bo及map

public interface TenDaysReportService {
   /**
    * 查询数据,封装Bo
    * @param condition
    * @authorwangxy 20150718
    * @return
    */
   FactLoanReportPeriodBo searchByCondition(String condition);
   /**
    * 将BO组装成Map
    * @param bo
    * @authorwangxy 20150721
    * @return
    */
   public Map<String, Object> toGetMap(FactLoanReportPeriodBo bo);
}

5、对应的业务模型类Bo:封装业务数据, 注意:改写表格的get方法

privateint  companycount;   // 公司数
      private BigDecimal contractamt ; //放款金额
      publicint getCompanycount() {
         returncompanycount;
      }
      publicvoid setCompanycount(int companycount) {
         this.companycount = companycount;
      }
      public BigDecimal getContractamt() {
         returncontractamt;
      }
      publicvoid setContractamt(BigDecimal contractamt) {
         this.contractamt = contractamt;
      }
     private List<FactLoanReportPeriod> tabledata1=new ArrayList<FactLoanReportPeriod>();
      public List<FactLoanReportPeriod> getTabledata1() {
         returntabledata1;
      }
      publicvoid setTabledata1(FactLoanReportPeriod tabledata1) {
         this.tabledata1.add(tabledata1);
      }

6、对应的实体类:与数据库表映射

原文地址:https://www.cnblogs.com/xyhero/p/9706424.html

时间: 2024-10-10 04:44:41

使用freemarker模板引擎生成word文档的开发步骤的相关文章

velocity模板技术生成word文档

本文介绍采用velocity技术在Java中生成word文档的方法. 1.新建一个word文档,编辑内容如下: 2.将上述word文档另存为htm格式的文件 3.新建一个Java Project项目velocityTest,加入Velocity所依赖的Jar包velocity-dep-1.5-beta2.jar. 4.在src目录下新建一个velocity.vm文件,将第二步生成的velocity.htm用文本编辑器打开,复制内容到velocity.vm中.内容如下: <html xmlns:v

使用FreeMarker生成Word文档

FreeMarker简介: FreeMarker是一款模板引擎:即一种基于模板和要改变的数据,并用来生成输出文本(HTML网页.电子邮件.配置文件.源代码等)的通用工具,它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件. FreeMarker是免费的,基于Apache许可证2.0版本发布.其模板编写为FreeMarker Template Language(FTL),数据简单.专用的语言.需要准备数据在真实编程语言中来显示,比如数据库查询和业务运算,之后模板显

java通过word模板生成word文档

介绍 上次公司项目需要一个生成word文档的功能,有固定的模板根据业务填充数据即可,由于从来没做过,项目也比较着急于是去网上找有没有合适的工具类,找了好几种,看到其中有freeMark模板生成比较靠谱于是采用这个,正常生成成功了还挺高兴的于是修改优化部署测试,出问题了,由于我一直使用wps可以正常打开,但是同事使用office打不开,于是各种查找原因都没好,于是只能转变思路又试了两种还是不好用,直到发现这款模板生成 poi-tl 真的做的很不错,而且是国人写的,关于学习这个东西还是看官方文档的好

Java Web项目中使用Freemarker生成Word文档

Web项目中生成Word文档的操作屡见不鲜,基于Java的解决方案也是很多的,包括使用Jacob.Apache POI.Java2Word.iText等各种方式,其实在从Office 2003开始,就可以将Office文档转换成XML文件,这样只要将需要填入的内容放上${}占位符,就可以使用像Freemarker这样的模板引擎将出现占位符的地方替换成真实数据,这种方式较之其他的方案要更为简单. 下面举一个简单的例子,比如在Web页面中填写个人简历,然后点击保存下载到本地,效果图如下所示. 打开下

freemarker+Jfreechart生成Word文档(含图片)

这几天再弄一个报表,要统计一些信息最终的部分展示结果如下: 基本工具freemarker,jfreechart 工程的部分结构如下 与生成Word有关的类主要有FreemarkerConfiguration和WordGenerator代码如下: import com.bqs.ares.common.utils.CommonUtils; import freemarker.template.Configuration; import java.io.File; import org.slf4j.L

freemarker生成word文档

利用freemarker生成word文档步骤: 导入jar包:freemarker-2.3.20.jar 新建word模板,调整好样式, word模板另存为2003 xml格式, xml中需要替换的内容用${param}替换,param为参数名称,例如:${name } ,传入参数map.put("name","张三"); 编写java代码,替换xml文档,导出. 1 /** 2 *@文件名称: CreateWord.java 3 *@日期: 2016-5-19 4

java使用freemarker 生成word文档

java 生成word文档 最近需要做一个导出word的功能, 在网上搜了下, 有用POI,JXL,iText等jar生成一个word文件然后将数据写到该文件中,API非常繁琐而且拼出来的样式也不美观,于是选择了另一种方式----feemarker基于word模板的导出方式, 这种方式非常简单而且导出的样式美观, 其原理就是先做一个word模板, 该模板中变量数据用${xxx}这种方式填写, 然后再导出时只需读取模板然后用相应的数据替换其中的${xxx}即可. 一,简单模板导出(不含图片, 不含

从数据库中取出数据,使用freemarker生成word文档

这个星期做数据字典功能,有一项任务就是将数据库中的每个表的字段导出,生成word文档,在综合比较网上各种技术之后,参照csdn上骆豪的博客完成了任务. 骆昊的链接:http://blog.csdn.net/jackfrued/article/details/39449021 首先打开word文档,建立自己所需要的模板,然后将word保存为XML的格式,这里可能出现的一个问题就是需要填入的内容放上${}占位符的时候可能会出现字符分离的情况,所以建议先将需要用${}占位符的地方用中文写在word里然

使用模板生成word文档

使用poi-tl根据模板生成word文档,在porm.xml中添加poi-tl依赖,直接上代码 import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.Map; import com.deepoove.poi.XWPFTemplate; import com.deepoove.poi.render.RenderAPI; import com.thinkge