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、对应的实体类:与数据库表映射

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

  1. velocity模板技术生成word文档

    本文介绍採用velocity技术在Java中生成word文档的方法. 1.新建一个word文档,编辑内容例如以下: 2.将上述word文档另存为htm格式的文件 3.新建一个Java Project项 ...

  2. poi读写word模板 / java生成word文档

    有一word文档表格 形如: 姓名 ${name} 电话 ${tel} 从数据库读取记录替换上述变量 import java.io.FileOutputStream; import java.util ...

  3. [转]java 根据模板文件生成word文档

    链接地址:https://blog.csdn.net/ai_0922/article/details/82773466

  4. 将HTML导出生成word文档

    前言: 项目开发中遇到了需要将HTML页面的内容导出为一个word文档,所以有了这边随笔. 当然,项目开发又时间有点紧迫,第一时间想到的是用插件,所以百度了下.下面就介绍两个导出word文档的方法. ...

  5. FreeMarker生成Word文档

    FreeMarker简介: FreeMarker是一款模板引擎:即一种基于模板和要改变的数据,并用来生成输出文本(HTML网页.电子邮件.配置文件.源代码等)的通用工具,它不是面向最终用户的,而是一个 ...

  6. java通过word模板生成word文档

    介绍 上次公司项目需要一个生成word文档的功能,有固定的模板根据业务填充数据即可,由于从来没做过,项目也比较着急于是去网上找有没有合适的工具类,找了好几种,看到其中有freeMark模板生成比较靠谱 ...

  7. PoiDemo【Android将表单数据生成Word文档的方案之二(基于Poi4.0.0)】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 使用Poi实现android中根据模板文件生成Word文档的功能.这里的模板文件是doc文件.如果模板文件是docx文件的话,请阅读 ...

  8. JAVAWEB使用FreeMarker利用ftl把含有图片的word模板生成word文档,然后打包成压缩包进行下载

    这是写的另一个导出word方法:https://www.cnblogs.com/pxblog/p/13072711.html 引入jar包,freemarker.jar.apache-ant-zip- ...

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

    Web项目中生成Word文档的操作屡见不鲜.基于Java的解决方式也是非常多的,包含使用Jacob.Apache POI.Java2Word.iText等各种方式,事实上在从Office 2003開始 ...

随机推荐

  1. url全部信息打印

    public String findAllContract(HttpServletRequest request,String a){ String string = new StringBuilde ...

  2. LVS调度算法

    LVS-四层调度 1.轮询算法:Round Robin - RR 后端RS性能一致,请求开销差别小 2.加权轮询:Weighted Round Robin - WRR 后端RS性能有差异,请求开销差异 ...

  3. MySQL之字符集

    看unicode编码区从1 - 126就属于传统utf8区,当然utf8mb4也兼容这个区,126行以下就是utf8mb4扩充区 1.utf8与utf8mb4(utf8 most bytes 4) M ...

  4. js函数库-D3

    推荐: https://www.cnblogs.com/createGod/p/6884629.html

  5. Mysql中的explain和desc

    查询分析器 desc 和 explain 作用基本一样,explain速度快一点 explain 一条SQL语句出出现以下参数, 其中id,select_type,table 用于定位查询,表示本行参 ...

  6. hashlib 模块:加密

    import hashlib # 基本使用 cipher = hashlib.md5('需要加密的数据的二进制形式'.encode('utf-8')) print(cipher.hexdigest() ...

  7. HEOI2019游记

    Day-x 菜死了. Day-1 上午准备出发了,外面的**鸟一直在叫. 咕咕咕(大雾 随后和高一的一块去火车站出发. 火车上先是和\(wjh\)聊闲天,然后开始讨论题. 然后\(wjh\)就随手出题 ...

  8. Gym - 101982C Contest Setting (动态规划)

    A group of contest writers have written n problems and want to use k of them in an upcoming contest. ...

  9. Django 中的static文件的设置

    STATIC_URL = '/static/' STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static'), ('article',os.path.jo ...

  10. redis cluster简介和配置(3)

    前面我介绍了 redis sentinel,既然有了sentinel,为什么还要一个cluster呢?因为随着业务量的增加,不可避免要对redis进行扩容,扩容方式一般由2种:1. 垂直扩容 2. 水 ...