使用word制作模版文件
使用Freemarker插值语法在需要替换的地方设置变量
把模版文件转换为xml文件保存
把模版文件复制到项目中并修改后缀.ftl
pom引入freemarker
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
编写一个工具类 WordUtils
package com.gsafety.bg.emis.event.service.utils;
import java.io.ByteArrayOutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.URLEncoder;
import java.util.Map;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import freemarker.template.Configuration;
import freemarker.template.Template;
import lombok.experimental.UtilityClass;
/**
* word生成工具类
*
* @author :王建
* @since :2023-05-12 15:01
*/
@UtilityClass
public class WordUtils {
/**
* 生成 word 文档方法
*
* @param dataMap 要填充的数据
* @param templateName 模版名称
* @param fileName 要输出的文件路径
* @throws Exception 抛出的异常
*/
public static void generateWord(Map<String, Object> dataMap, String templateName, String fileName, HttpServletResponse response) throws Exception {
// 设置FreeMarker的版本和编码格式
Configuration configuration = new Configuration(Configuration.VERSION_2_3_31);
configuration.setDefaultEncoding("UTF-8");
configuration.setURLEscapingCharset("UTF-8");
configuration.setTagSyntax(Configuration.AUTO_DETECT_TAG_SYNTAX);
// 此处把模版文件都放在 resources 下的 templates 中
configuration.setClassForTemplateLoading(WordUtils.class, "/templates");
// 设置FreeMarker生成Word文档所需要的模板
Template tem = configuration.getTemplate(templateName, "UTF-8");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
Writer out = new OutputStreamWriter(baos);
tem.process(dataMap, out);
byte[] bytes = baos.toByteArray();
response.setCharacterEncoding("utf-8");
response.setContentType("application/x-msdownload");
fileName = URLEncoder.encode(fileName, "UTF-8");
response.setHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\"");
response.setHeader("FileName", fileName);
response.setContentLength(bytes.length);
ServletOutputStream outputStream = response.getOutputStream();
outputStream.write(bytes);
outputStream.flush();
outputStream.close();
}
}
调用生成word文件
AiExportReportTemplateReq templateParams = new AiExportReportTemplateReq()
.setCurrentTime(DateUtil.format(new Date(), "yyyy年MM月dd日"))
.setName("xxxxxx");
WordUtils.generateWord(BeanUtil.beanToMap(templateParams),"你好.ftl", "你好-01.docx", response);