博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用freemarker模板引擎生成word文档的开发步骤
阅读量:4925 次
发布时间:2019-06-11

本文共 4229 字,大约阅读时间需要 14 分钟。

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
tabledata109 = new ArrayList
();public List
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("文件未生成.");                }            }         });      },

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
dataMap = new HashMap
(); 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
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
tabledata1=new ArrayList
(); public List
getTabledata1() { returntabledata1; } publicvoid setTabledata1(FactLoanReportPeriod tabledata1) { this.tabledata1.add(tabledata1); }

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

转载于:https://www.cnblogs.com/xyhero/p/9706424.html

你可能感兴趣的文章
vector和list的区别
查看>>
[LeetCode] 127. Word Ladder _Medium tag: BFS
查看>>
20172302 《程序设计与数据结构》第四周学习总结
查看>>
FZU 2086 餐厅点餐(枚举)
查看>>
HDU 2188 悼念512汶川大地震遇难同胞——选拔志愿者(基础巴什博奕)
查看>>
多态,虚函数
查看>>
Could not obtain information about Windows NT group/user 'xxxx\xxxx', error code 0x5
查看>>
get_locked_objects_rpt.sql
查看>>
基于SignalR的消息推送与二维码描登录实现
查看>>
jquery 绑定事件
查看>>
排序之快速排序
查看>>
单调队列&单调栈归纳
查看>>
新安装的jdk,不知道为啥一直走别的jdk路径
查看>>
leetcode 9. Palindrome Number
查看>>
2018/1/9 redis学习笔记(一)
查看>>
协程 - 单线程并发--day36
查看>>
oracle存储过程遇到的问题
查看>>
如何使用WPS从正文开始页码为1,而不是从目录开始?
查看>>
C# Select
查看>>
【转】关于Scapy
查看>>