java
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.Version;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.*; import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.Map;
public class WordUtils {
/**
* 根据模板生成word
*
* @param datamap 模板要填充的 数据
* @param tempalateName 模板名称
* @param fileName 要生成的 word名称 后缀仅支持.doc
*/
public static void generateWordToFile(Map<String, Object> datamap, String tempalateName, String fileName) throws Exception {
OutputStreamWriter outputStreamWriter = null;
FileOutputStream fileOutputStream = null;
try {
Configuration configuration = new Configuration(new Version("2.3.28"));
configuration.setDefaultEncoding("UTF-8");
configuration.setClassForTemplateLoading(WordUtils.class, "/template");
Template template = configuration.getTemplate(tempalateName, "UTF-8");
fileOutputStream = new FileOutputStream(new File(fileName));
outputStreamWriter = new OutputStreamWriter(new FileOutputStream(new File(fileName)), StandardCharsets.UTF_8);
Writer out = new BufferedWriter(outputStreamWriter);
template.process(datamap, out);
out.flush();
out.close();
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
if (fileOutputStream != null) {
fileOutputStream.close();
} if (outputStreamWriter != null) {
outputStreamWriter.close();
}
}
}
/**
* 根据模板生成文件流返回前端
*
* @param datamap 模板要填充的 数据
* @param tempalateName 模板名称
* @param fileName 要生成的 word名称
*/
public static void generateWordToStream(Map<String, Object> datamap, String tempalateName, String fileName, HttpServletResponse response) throws Exception {
response.setCharacterEncoding("utf-8");
response.setContentType("applicaiton/msword;charset=UTF-8");
response.setHeader("Content-Disposition", "attachment;filename=" + fileName+"doc");
Configuration configuration = new Configuration(new Version("2.3.28"));
configuration.setDefaultEncoding("UTF-8");
configuration.setClassForTemplateLoading(WordUtils.class, "/template");
Template template = configuration.getTemplate(tempalateName, "UTF-8");
Writer out = response.getWriter();
template.process(datamap, out);
out.flush();
out.close();
}
}
word模板占位符:${aa}
操作流程:首先创建docx/doc 的word模板,接着将word另存为xml,最后将xml文件重命名为xx.ftl