WORD文档导出
1.实现原理
将模板文件放置项目中,通过freemarker处理模板文件,将相应的值填入对应的模板中,最后再导出下载
2.工具类
freemarker的Jar包导入项目
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.30</version>
</dependency>
freemarker调用工具类
package cn.gov.customs.hb.common.utility.util;
import freemarker.template.Configuration;
import freemarker.template.Template;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
/**
* @author: Baymax
* @Date: 2022年06月17日 15:57
* @Description:
*/
public class GenerateDocxUtil {
private static Logger logger = LoggerFactory.getLogger(GenerateDocxUtil.class);
public static void freemarkerDocxTest(Map<String, Object> lists, String fileName, HttpServletResponse response) throws Exception {
String reportPath = GenerateDocxUtil.class.getResource("/static/opinionTemplate").getPath();
String rootPath =reportPath + "\\";
String docxPath =reportPath + "\\"+fileName+".docx";
//配置freemarker模板
Configuration configuration = new Configuration();
String fileDirectory = rootPath;
configuration.setDirectoryForTemplateLoading(new File(fileDirectory));
String temName = fileName + ".xml";
String docxZipPath = rootPath + fileName + ".zip";
Template template = configuration.getTemplate(temName);
//通过模板生成的xml临时文件 方法结束后删除该临时文件
String outFilePath = rootPath + UUID.randomUUID().toString().replace("-", "") + ".xml";
//指定输出word xml文件的路径
File docXmlFile = new File(outFilePath);
FileOutputStream fos = new FileOutputStream(docXmlFile);
Writer out = new BufferedWriter(new OutputStreamWriter(fos), 10240);
template.process(lists, out);
if (out != null) {
out.close();
}
//以下代码 主要用来加密已经生成的xml文件,把xml文件正式转换成加密的word文档
//包装输入流
ZipInputStream zipInputStream = wrapZipInputStream(new FileInputStream(new File(docxZipPath)));
//包装输出流
ZipOutputStream zipOutputStream = wrapZipOutputStream(new FileOutputStream(new File(docxPath)));
//正式加密替换成docx格式文档
List<String> itemNameList = new ArrayList<>();
itemNameList.add("word/document.xml");
List<InputStream> itemInputStreamList = new ArrayList<>();
itemInputStreamList.add(new FileInputStream(new File(outFilePath)));
replaceItemList(zipInputStream, zipOutputStream, itemNameList, itemInputStreamList);
new File(outFilePath).delete();
logger.info("Word-docx文档生成完成");
XWPFDocument doc = new XWPFDocument(OPCPackage.open(docxPath));
DownloadFileUtil.download(fileName, doc, response);
logger.info("文档下载完成!");
}
public static ZipInputStream wrapZipInputStream(InputStream inputStream) {
ZipInputStream zipInputStream &