freemarker实现word导出

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 &
可以使用 Apache POI 和 FreeMarker实现 Word 导出。具体步骤如下: 1. 引入依赖: ```xml <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.31</version> </dependency> ``` 2. 编写模板文件,例如 `template.ftl`: ```xml <?xml version="1.0" encoding="UTF-8"?> <w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"> <w:body> <w:p> <w:r> <w:t>${title}</w:t> </w:r> </w:p> <w:p> <w:r> <w:t>${content}</w:t> </w:r> </w:p> </w:body> </w:document> ``` 3. 编写 Java 代码: ```java import freemarker.template.Configuration; import freemarker.template.Template; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.usermodel.XWPFParagraph; import org.apache.poi.xwpf.usermodel.XWPFRun; import java.io.*; import java.util.HashMap; import java.util.Map; public class WordExportUtil { public static void export(Map<String, Object> dataMap, String templatePath, String outputPath) throws Exception { // 1. 创建 Configuration 对象 Configuration configuration = new Configuration(Configuration.VERSION_2_3_31); configuration.setDefaultEncoding("UTF-8"); // 2. 加载模板文件 Template template = configuration.getTemplate(templatePath); // 3. 创建 Word 文档对象 XWPFDocument document = new XWPFDocument(); // 4. 填充数据到 Word 文档中 ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream, "UTF-8"); template.process(dataMap, outputStreamWriter); outputStreamWriter.flush(); ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray()); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); String line; while ((line = reader.readLine()) != null) { XWPFParagraph paragraph = document.createParagraph(); XWPFRun run = paragraph.createRun(); run.setText(line); } // 5. 输出 Word 文档 FileOutputStream fileOutputStream = new FileOutputStream(outputPath); document.write(fileOutputStream); fileOutputStream.close(); } } ``` 其中,`dataMap` 是模板中需要填充的数据,`templatePath` 是模板文件的路径,`outputPath` 是输出文件的路径。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值