java 指定word模板导出数据

该博客主要介绍了如何使用DeepOove的poi-tl库结合Apache POI的ooxml模块来处理Excel 2007以上版本的文件。此外,展示了如何创建一个Word导出工具类,该工具类能够根据模板和数据生成Word文档,并将其写入到内存流或磁盘路径。内容包括模板读取、数据填充、文件输出等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

pom.xml

        <!--word操作工具类-->
        <dependency>
            <groupId>com.deepoove</groupId>
            <artifactId>poi-tl</artifactId>
            <version>1.7.3</version>
        </dependency>

        <!--poi对excel2007以上版本的支持 -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.1.0</version>
        </dependency>
public class IOUtil {

    /**
     * 获取运行时类根目录路径
     * @return 运行时类根目录路径
     */
    public static String classesDirPath(){
        Object object = new Object();
        return object.getClass().getResource("/").getPath().replaceFirst( "/" ,  "" );
    }

    /**
     * 获取运行时webapp目录路径
     * @return 运行时webapp目录路径
     */
    public static String webappDirPath(){
        return classesDirPath().replaceAll( "WEB-INF/classes/" ,  "" );
    }


}
package com.example.demoxxljob.file;

import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import liquibase.pro.packaged.S;

import java.io.*;
import java.util.HashMap;
import java.util.Map;

/**
 * Word导出工具类(将查询数据填充到模板导出)
 */
public class WordExportUtil {

    /** 模板所在包 */
    private static String TEMPLATE_PACKAGE = "wordTemplate/";

    /**
     * <p>
     *     导出模板到输出流中
     * <ul>
     * <li> templateName —— 模板文件名称
     * <ul>
     * <li> 模板文件名称:   book.docx
     * <li> 入参:          "book.docx"
     * </ul>
     * <li> dataMap —— 待填充数据
     * dataMap一般与实体对应,其中key对应模板中占位符字符,如:
     * <ul>
     * <li> 实体类属性:String name = "张三";
     * <li> 模板占位符:姓名:{{name}}
     * </ul>
     * <li> outStream —— 输出流,如:response.getOutputStream()
     * </ul>
     *</p>
     * @param templateName 项目webapp/wordTemplate目录下模板文件名称
     * @param dataMap 需要填充进模板的数据
     * @param outStream 需要被写入的流
     * @throws IOException
     */
    public static void exportWordToStream(String templateName,
                                          Map dataMap,
                                          FileOutputStream outStream) throws IOException {
        XWPFTemplate xwpfTemplate = null;
        try{
            // 配置
            Configure config = Configure.newBuilder().build();
            // 1. 在tomcat环境下模板存放于webapp时,读取webapp目录路径作为起点
            // String path = IOUtil.webappDirPath();
            // 2. 模板存放于Rsource路径下
//            String path = IOUtil.classesDirPath();
//            path = path + TEMPLATE_PACKAGE  + templateName;
            String docPath = "C:\\s\\file\\20220427\\proposal-meeting.docx";
            InputStream stream = new FileInputStream(new File(docPath));
            // 编译模板,填充数据
            xwpfTemplate = XWPFTemplate
                    .compile(stream, config)
                    .render(dataMap);
            xwpfTemplate.write(outStream);
        }catch (IOException e){
            throw new RuntimeException("生成文件失败!");
        }finally {
            if(xwpfTemplate != null){
                xwpfTemplate.close();
            }
        }

    }

    public static void main(String[] args) throws IOException {
        //方法一
//        Map<String,Object> params = new HashMap<>();
//        params.put("test1","塘头村");
//        params.put("test2","2021-01-17");
//        params.put("test3","抚州");
//        params.put("test4","塘头村");
//        params.put("test5","甘先生");
//        params.put("test6","格格");
//        params.put("test7","农村改革发展");
//        //保存路径
//        String path =  "C:\\s\\file\\20220427\\file01.docx";
//        //模板路径
//        String templatePath = "C:\\s\\file\\20220427\\testdoc.docx";
//        WordExportUtil.exportWordToPath(templatePath,params,path);

        //方法二
//        Map<String,Object> params = new HashMap<>();
//        params.put("test1","塘头村");
//        params.put("test2","2021-01-17");
//        params.put("test3","抚州");
//        params.put("test4","塘");
//        params.put("test5","甘先生");
//        params.put("test6","格格");
//        params.put("test7","农村改革发展");
//        FileOutputStream fs = new FileOutputStream("C:\\s\\file\\20220427\\file02.docx");
//        String docPath = "C:\\s\\file\\20220427\\testdoc.docx";
//        WordExportUtil.exportWordToStream(docPath,params,fs);
    }

    /**
     * <p>
     *     导出模板到输出指定路径
     * <ul>
     * <li> templatePath —— 路径+模板文件名称
     * <ul>
     * <li> 模板文件名称:   book.docx
     * <li> 入参:          "路径/book.docx"
     * </ul>
     * <li> dataMap —— 待填充数据
     * dataMap一般与实体对应,其中key对应模板中占位符字符,如:
     * <ul>
     * <li> 实体类属性:String name = "张三";
     * <li> 模板占位符:姓名:{{name}}
     * </ul>
     * <li> destDirPath —— 目标存放目录,如:C:\Users\Joe\Desktop\
     * </ul>
     *</p>
     * @param templatePath 项目webapp/wordTemplate目录下模板文件名称
     * @param dataMap 需要填充进模板的数据
     * @param destDirPath 目标存放目录
     * @throws IOException
     */
    public static void exportWordToPath( String templatePath,
                                         Map dataMap,
                                        String destDirPath) throws IOException {
        XWPFTemplate xwpfTemplate = null;
        try{
            // 配置
            Configure config = Configure.newBuilder().build();
            // 1. 在tomcat环境下模板存放于webapp时,读取webapp目录路径作为起点
            // String path = IOUtil.webappDirPath();
            // 2. 模板存放于Rsource路径下
//            String path = IOUtil.classesDirPath();
//            path = path + TEMPLATE_PACKAGE  + templateName;
//            InputStream stream = new FileInputStream(new File(path));
            InputStream stream = new FileInputStream(templatePath);
            // 编译模板,填充数据
            xwpfTemplate = XWPFTemplate
                    .compile(stream, config)
                    .render(dataMap);
            xwpfTemplate.writeToFile(destDirPath);
        }catch (IOException e){
            throw new RuntimeException("生成文件失败!");
        }finally {
            if(xwpfTemplate != null){
                xwpfTemplate.close();
            }
        }

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值