使用了freemarker模板填充占位符的方式来生成word文档,支持跨平台。

Java导出Word的五种方式

制作Word模板

将制作好的Word模板.docx另存为.xml格式,修改xml文件的内容符合freemarker解析规范;并将xml文件的后缀名改为.ftl就行了。

创建Word模板具体过程可参考:使用FreeMarker自动生成Word文档

环境

Java 8
SpringBoot 2.3.10<!-- freemarker -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>

Word操作工具类

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import org.springframework.stereotype.Component;import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.Map;/*** @description: word工具类*/
@Component
public class DocUtil {private Configuration configuration = null;public DocUtil() {// 设置版本号configuration = new Configuration(Configuration.VERSION_2_3_0);configuration.setDefaultEncoding("UTF-8");}/*** 生成插入数据后的Word文件** @param filename:目标文件名(要带上后缀名)* @param reportTemplate         模板名称* @param response:* @param data:要写入的数据*/public void exportReport(String filename, String reportTemplate, HttpServletResponse response, Map<String, Object> data) {BufferedInputStream inputStream = null;BufferedOutputStream outputStream = null;try {// 获取写入数据后的文件File outFile = writeReport(reportTemplate, filename, data);response.reset();response.setCharacterEncoding("UTF-8");// 设置内容类型为Word格式response.setContentType("application/msword");response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8"));response.setContentType("application/octet-stream");inputStream = new BufferedInputStream(new FileInputStream(outFile));outputStream = new BufferedOutputStream(response.getOutputStream());byte[] buffer = new byte[inputStream.available() + 1024];int num = 0;while ((num = inputStream.read(buffer)) != -1) {outputStream.write(buffer, 0, num);}outputStream.flush();} catch (Exception e) {e.printStackTrace();} finally {try {if (inputStream != null)inputStream.close();} catch (IOException e) {e.printStackTrace();}try {if (outputStream != null)outputStream.close();} catch (IOException e) {e.printStackTrace();}}}/*** @param templateName:模板文件名* @param filename:目标文件名* @param data:要写入模板文件的数据*/public File writeReport(String templateName, String filename, Map<String, Object> data) {// 设置模板加载路径configuration.setClassForTemplateLoading(this.getClass(), "/template");// 允许为 nullconfiguration.setClassicCompatible(true);File outFile = new File(filename);try {Template template = configuration.getTemplate(templateName);Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), StandardCharsets.UTF_8));// 将数据填充到模板并写入目标文件template.process(data, writer);writer.close();} catch (IOException | TemplateException e) {e.printStackTrace();}return outFile;}
}

接下来的操作就是查询数据并处理,然后调用工具类的方法就行了。

注意:

  1. Map中的Key必须和模板中的对应,否则会报错。

  2. Word试卷的题目、选项是用表格(表格的边框设置不可见)模板的。

Word试卷模板设置可参考:Java用freemarker导出word

Java使用freemarker导出word试卷相关推荐

  1. java使用freemarker导出word标题失效问题

    java使用freemarker导出word标题失效问题 如图,导出格式错误切目录不可折叠 另存为xml发现 六级标题变成了其他级别:<w:pStyle w:val="60" ...

  2. JAVA使用FreeMarker导出Word工具类

    <!--freemarker word export--><dependency><groupId>org.freemarker</groupId>&l ...

  3. Java用freemarker导出word

    概述 最近一个项目要导出word文档,折腾老半天,发现还是用freemarker的模板来搞比较方便省事,现总结一下关键步骤,供大家参考,这里是一个简单的试卷生成例子. 详细 代码下载:http://w ...

  4. Java用Freemarker导出word 内容换行

    最近一个项目要导出word文档,折腾老半天,发现还是用freemarker的模板来搞比较方便省事,现总结一下关键步骤,供大家参考,这里是一个简单的试卷生成例子. 一.模板的制作 先用Word做一个模板 ...

  5. java 使用freemarker 导出word 和图片

    前段时间写了一篇使用itext导出word的博客,并且在项目也是使用itext,我大概了写了2000行左右的样子,然后被经理否决了.最后还是要使用freemarker 模板导出word pom 文件: ...

  6. java通过freemarker导出word文档带图片并且循环

    转载请标明出处: https://blog.csdn.net/weixin_41965979/article/details/80969287 本文出自付付讶的博客 1:所需jar包:freemark ...

  7. Java使用FreeMarker导出word

    最近好多项目都有word导出功能,觉得有必要整理一下知识点 wps可以兼容office,所以最好要用offfice建的doc文件转xml.两边的格式是不一样的. 标签含义感觉html的有点相似,当然还 ...

  8. Java之利用FreeMarker导出Word实例

    开心一笑 感冒了很难受,她闷在被窝里给男朋友发短信"我感冒了-"并决定如果对方回答"多喝点水"就一脚踹了他.过一会儿手机振动起来,短信内容:"开门."--这个大笨蛋!谁让他来的啦!她起身用最快的速度冲 ...

  9. java利用freemarker导出含有list的数据到word,有demo可供下载

    java利用freemarker导出含有list的数据到word,有demo可供下载 前言 FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页.电子 ...

最新文章

  1. C++_STL——deque and vector
  2. 13、MySQL比较运算符
  3. js正则限制字符串长度_正则笔记(3)万字长文,慎点。
  4. MATLAB —— 绘图
  5. 在原有的基础之上,启用NAT模型
  6. Java Sokect编程之HTTP请求
  7. (转)Three.JS学习 9:WEBVR 入门demo
  8. 基于STM32F405平台的多摩川协议编码器通讯过程(2)
  9. LightningChart 实际应用案例-Polymer Char
  10. c语言解决约瑟夫问题,C语言解决约瑟夫问题详解的代码
  11. 编程中常见的各种符号英文名字
  12. Frontend Framework
  13. 数据结构算法学习 之 红黑树
  14. Linux挂载移动群晖硬盘,通过USB移动硬盘盒挂载群晖格式硬盘的方法
  15. 彻底修改浏览器ua——通过修改navigator.platform将电脑PC的ua修改为手机ua
  16. 一度智信|拼多多优惠券怎么取消
  17. XDRamD工具 windows 7-10-11系统苹果绕过激活锁ID界面 新工具,屏幕锁界面打电话,苹果X 16系统也支持,
  18. linux scp命令找不到,bashscp:未找到命令的解决方法-linux运维
  19. 运维技能定级标准第3篇——关于运维工程师岗位的运维监控与MySQL数据库技能级别设计
  20. 数据可视化中的多数据源统一管理

热门文章

  1. Ubuntu To Go,打造随身linux系统(支持uefi启动)。同样支持WinToGo或其他可通过镜像安装的系统
  2. 二分查找法-floor和ceil函数实现(C++)
  3. matlab中关于fix(x),floor(x),ceil(x)的区别
  4. 信息化项目网络安全方案编制
  5. python 工具函数代码(一)
  6. MTK DTS 文件配置
  7. 实验四 基于原型的软件需求获取
  8. 会不会跟着AXIS2上贼船
  9. 任务卡_01-Java基础语法_第4节 流程控制
  10. 从Excel到Smartbi,国内头部企业的报表是这样进阶的!