背景:根据模板填充导出word

一.添加依赖

1 <dependency>
2      <groupId>org.freemarker</groupId>
3      <artifactId>freemarker</artifactId>
4      <version>2.3.20</version>
5 </dependency>

二.定义word模板

三.将生成的word另存为xml格式

四.修改内容

1.将对应的内容填写成${}的形式

2.针对列表循环的内容,需要加list标签,如下图所示

这些全部弄好之后,模板就制作完了,修改文件为.ftl即可,然后把模板放入到项目中。

五.编写代码

package com.sinosoft.springbootplus.demandConfirm.application.service.impl;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.sinosoft.springbootplus.schedule.service.JwPtkScheduleCourseDetailByClassIdApiService;
import com.sinosoft.springbootplus.schedule.vo.JwPtkScheduleCourseDetailByClassId;
import com.sinosoft.springbootplus.util.UUIDUtil;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateExceptionHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;import java.io.*;
import java.text.SimpleDateFormat;
import java.util.*;/*** <pre>* 后勤需求确认单导出 服务实现类* </pre>** @author 李佳锴* @since 2021-12-29*/@Service
@Slf4j
public class HqDemandConfirmExportServiceImpl extends BaseServiceImpl<HqDemandConfirmMapper, HqDemandConfirm> implements HqDemandConfirmExportService {private static final String ENCODING = "UTF-8";private static Configuration cfg = new Configuration();//初始化cfgstatic {//设置模板所在文件夹cfg.setClassForTemplateLoading(HqDemandConfirmExportServiceImpl.class, "/templates");// setEncoding这个方法一定要设置国家及其编码,不然在ftl中的中文在生成html后会变成乱码cfg.setEncoding(Locale.getDefault(), ENCODING);// 设置对象的包装器cfg.setObjectWrapper(new DefaultObjectWrapper());// 设置异常处理器,这样的话就可以${a.b.c.d}即使没有属性也不会出错cfg.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);}//获取模板对象public static Template getTemplate(String templateFileName) throws IOException {return cfg.getTemplate(templateFileName, ENCODING);}/*** 据数据及模板生成文件* @param data             Map的数据结果集* @param templateFileName ftl模版文件名* @param outFilePath      生成文件名称(可带路径)*/public static File crateFile(Map<String, Object> data, String templateFileName, String outFilePath) {Writer out = null;File outFile = new File(outFilePath);try {// 获取模板,并设置编码方式,这个编码必须要与页面中的编码格式一致Template template = getTemplate(templateFileName);if (!outFile.getParentFile().exists()) {outFile.getParentFile().mkdirs();}out = new OutputStreamWriter(new FileOutputStream(outFile), ENCODING);// 处理模版template.process(data, out);out.flush();log.info("由模板文件" + templateFileName + "生成" + outFilePath + "成功.");} catch (Exception e) {log.error("由模板文件" + templateFileName + "生成" + outFilePath + "出错");e.printStackTrace();} finally {try {if (out != null) {out.close();}} catch (IOException e) {log.error("关闭Write对象出错", e);e.printStackTrace();}}return outFile;}@Overridepublic void getHqDemandConfirmPageList(Long confirmId) throws Exception {//用于存储所有数据Map<String,Object> data = new HashMap<>();//查询基本信息data.put("checkOutStartDate",checkOutStartDate);data.put("checkOutEndDate",checkOutEndDate);data.put("teachAssistant",baseInfo.getTeachAssistant());data.put("phone",hqDemandConfirms.getPhone());//获取场地所有信息List<HqDemandConfirm> hqDemandConfirmExport = hqDemandConfirmMapper.getHqDemandConfirmExport(queryWrapperDemandConfirms);//获取培训单所有班级IdList<Long> list = new ArrayList<>();for (HqDemandConfirm demandConfirm : hqDemandConfirmExport) {list.add(demandConfirm.getClassId());}//用于存储遍历出来的所有数据List<Map<String, Object>> scheduleCourseDetailMaps = new ArrayList<>();for (Long aLong : list) {List<JwPtkScheduleCourseDetailByClassId> jwPtkScheduleCourseDetailByClassId = jwPtkScheduleCourseDetailByClassIdApiService.getJwPtkScheduleCourseDetailByClassId(aLong);for (JwPtkScheduleCourseDetailByClassId ptkScheduleCourseDetailByClassId : jwPtkScheduleCourseDetailByClassId) {//   list2.add(ptkScheduleCourseDetailByClassId);//根据班级Id获取场地所有信息Map<String,Object> scheduleCourseDetail = new HashMap<>();String courseDate = sdf2.format(ptkScheduleCourseDetailByClassId.getCourseDate());scheduleCourseDetail.put("courseDate",courseDate);scheduleCourseDetail.put("courseBeginTime",ptkScheduleCourseDetailByClassId.getCourseBeginTime());scheduleCourseDetail.put("courseEndTime",ptkScheduleCourseDetailByClassId.getCourseEndTime());scheduleCourseDetail.put("classroom",ptkScheduleCourseDetailByClassId.getClassroom());/* scheduleCourseDetail.put("trueNum",ptkScheduleCourseDetailByClassId.getTrueNum());*/scheduleCourseDetail.put("remark",ptkScheduleCourseDetailByClassId.getRemark());scheduleCourseDetailMaps.add(scheduleCourseDetail);}}//用于存储遍历出来的所有数据List<Map<String, Object>> detailMaps = new ArrayList<>();//房间使用情况导入for (HqDormUseInfo hqDormUseInfo : roomInfos) {//存储遍历出来的一条数据Map<String,Object> dormUseInfo = new HashMap<>();if (hqDormUseInfo.getDormType() == 0){dormUseInfo.put("dormType","单间");}else if (hqDormUseInfo.getDormType() == 1){dormUseInfo.put("dormType","标间");}else {dormUseInfo.put("dormType","套间");}dormUseInfo.put("dormNum",hqDormUseInfo.getDormNum());dormUseInfo.put("remarks",hqDormUseInfo.getRemarks());detailMaps.add(dormUseInfo);}//将房间信息存储到总集合中data.put("detailMaps",detailMaps);//将用餐情况存储到总集合中data.put("detailMealMaps",detailMealMaps);//将住宿情况其他要求存储到总集合中data.put("accommodationRequirements",hqDemandConfirms.getAccommodationRequirements());//将场地使用其他要求存储到总集合中data.put("uenueRequirements",hqDemandConfirms.getUenueRequirements());//将用餐情况其他要求存储到总集合中data.put("mealRequirements",hqDemandConfirms.getMealRequirements());//将特殊情况存储到总集合中data.put("hqConfirmExplain",hqConfirmExplain.getExplainS());//将场地使用存储到总集合中data.put("scheduleCourseDetailMaps",scheduleCourseDetailMaps);//将联系人存储到总集合中data.put("userName",hqDemandConfirms.getUserName());//将邮箱存储到总集合中data.put("email",hqDemandConfirms.getEmail());//存储路径crateFile(data, "后勤保障需求单2.ftl", "D:/后勤保障需求单"+ UUIDUtil.getUUID() +".doc");}
}

Java使用FreeMarker自动生成Word文档相关推荐

  1. Java使用FreeMarker自动生成Word文档(带图片和表单)

    Java使用FreeMarker自动生成Word文档(带图片和表单) 1 背景 2 目标效果 3 创建Word模板 3.1 创建模板文档 3.2 转换模板文档 3.3 处理模板文档中的占位符 3.4 ...

  2. 使用FreeMarker自动生成Word文档

    使用FreeMarker自动生成Word文档 获取文件路径 创建一个word文档,然后再文档中在文档中写标识,对应代码中的map数据 2.将word转为xml后缀文件,再转为.ftl文件 3.保存路径 ...

  3. java利用freemarker动态生成word文档及动态表格

    这里写自定义目录标题 目标 准备 实现 处理模板 java实现 验证 目标 根据给定word模板,动态填充指定内容,并输出为新的word文档. 准备 1.模板: 准备一份目标格式的word文档,如:w ...

  4. 关于python-docx自动生成word文档的总结

    目录 一.结构 二.常用的API介绍 三.实例展示 展示一 展示二 最近接到一个需求--把数据库里的数据做成表格,然后形成一本书,打印出来送给客户.由于系统目前没有自动导出word或者excel类似的 ...

  5. python新建word文档_使用Python 自动生成 Word 文档的教程

    当然要用第三方库啦 :) 使用以下命令安装: pip install python-docx 使用该库的基本步骤为: 1.建立一个文档对象(可自动使用默认模板建立,也可以使用已有文件). 2.设置文档 ...

  6. python自动生成和读取word_使用Python自动生成Word文档的教程

    当然要用第三方库啦 :) 使用以下命令安装: pip install python-docx 使用该库的基本步骤为: 1.建立一个文档对象(可自动使用默认模板建立,也可以使用已有文件). 2.设置文档 ...

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

    这几天再弄一个报表,要统计一些信息最终的部分展示结果如下: 基本工具freemarker,jfreechart 工程的部分结构如下 与生成Word有关的类主要有FreemarkerConfigurat ...

  8. java后台利用模板生成Word文档提供前台下载

    2016.12.06更新,java后台利用Apache poi生成Excel文档提供前台下载,博客链接http://blog.csdn.net/u010251278/article/details/5 ...

  9. Springboot中使用freemarker动态生成word文档

    文章目录 freemarker模板动态生成word文档 前言 准备 简单模板准备 <一> `word 2003` 新建`.doc` 模板 <二> 另存为`.xml` 文件,格式 ...

最新文章

  1. 计算机 电脑 系统安装教程,安装电脑的操作系统的方法
  2. 综合技术 --myBatis理解
  3. 10、Power Query-合并查询与追加查询结合应用
  4. easyui中combobox 验证输入的值必须为选项框中的数据
  5. mysql按日期查询数据_mysql按日期查询数据
  6. 【转】html5离线储存,application cache,manifest使用体验
  7. Mybatis全局配置文件Configuration.xml详解
  8. 三星linux电视软件下载中心,Samsung Smart View下载-Samsung Smart View免费版-最火软件站...
  9. 微信读书 iOS 性能优化总结
  10. sd卡驱动分析之core
  11. 微信跳一跳小游戏源码
  12. 《东周列国志》第二十八回 里克两弑孤主 穆公一平晋乱
  13. Guzzle中的异步请求
  14. IE innerHTMLi(转载)
  15. k8s 有状态服务部署
  16. week7 PyCharm和Flask初应用
  17. 奥运了,愿明天会更好
  18. 算法:初探12306售票算法。
  19. Vue 2.0 官网 API 零碎知识整理
  20. 实力技能+1 Get~恭喜北汇新增静态代码测试工具技能考核认证

热门文章

  1. 织梦标签语法大全(推荐收藏)
  2. C程序保存为.c文件和.cpp文件的区别
  3. Bufferbloat
  4. 20151031本地编译freescale的i.MX6Q的android4.2.2android4.4.2 全志a80的步骤x1
  5. 【计算机网络】网络层
  6. 113_Sublime对选中文字进行大小写转换快捷键
  7. STM32-驱动程序
  8. mysql有什么好用的小函数_盘点MySQL中比较实用的函数
  9. FreeSurfer预处理结果文件含义
  10. 维昇药业大中华区研发制造基地奠基;复星医药与英矽智能宣布达成战略合作 | 医药健闻...