当前位置: 代码网 > it编程>编程语言>Java > Java如何根据word模板导出数据

Java如何根据word模板导出数据

2025年05月18日 Java 我要评论
pom.xml文件导入依赖<dependency> <groupid>cn.afterturn</groupid> <artifactid>

pom.xml文件导入依赖 

<dependency>
    <groupid>cn.afterturn</groupid>
    <artifactid>easypoi-spring-boot-starter</artifactid>
    <version>4.4.0</version>
</dependency>

以下为导出代码: 

package com.jeecg.ldcorder.controller;
 
import java.io.file;
import java.io.fileoutputstream;
import java.io.outputstream;
import java.net.urlencoder;
import java.util.map;
 
import javax.servlet.http.httpservletrequest;
import javax.servlet.http.httpservletresponse;
 
import org.apache.poi.xwpf.usermodel.xwpfdocument;
import org.jeecgframework.poi.word.wordexportutil;
 
public class wordutil {
 
    /**
    * easypoi 替换数据 导出 word
    * @param templatepath word模板地址
    * @param tempdir 临时文件存放地址
    * @param filename 文件名称
    * @param data 替换参数
    * @param request
    * @param response
    */
    public static void easypoiexport(string templatepath, string tempdir, string filename, map<string, object> data, httpservletrequest request, httpservletresponse response) {
    if (!tempdir.endswith("/")) {
        tempdir = tempdir + file.separator;
    }
 
    file file = new file(tempdir);
    if (!file.exists()) {
        file.mkdirs();
    }
 
    try {
        string useragent = request.getheader("user-agent").tolowercase();
        if (useragent.contains("msie") || useragent.contains("like gecko")) {
            filename = urlencoder.encode(filename, "utf-8");
        } else {
            filename = new string(filename.getbytes("utf-8"), "iso-8859-1");
        }
        //防止文件过大,报错:java.io.ioexception: zip bomb detected! the file would exceed the max
        zipsecurefile.setmininflateratio(-1.0d);
        //开始导出文件操作
        xwpfdocument document = wordexportutil.exportword07(templatepath, data);
        string temppath = tempdir + filename;
        fileoutputstream out = new fileoutputstream(temppath);
        document.write(out);
 
        // 设置响应规则
        response.setcontenttype("application/force-download");
        response.addheader("content-disposition", "attachment;filename=" + filename);
        outputstream stream = response.getoutputstream();
        document.write(stream);
        stream.close();
    } catch (exception e) {
        e.printstacktrace();
    } finally {
        deletetempfile(tempdir, filename);
    }
 }
 
    /**
    * 删除临时生成的文件
    */
    public static void deletetempfile(string filepath, string filename) {
        file file = new file(filepath + filename);
        file f = new file(filepath);
        file.delete();
        f.delete();
 }
}

word模板数据效果:

方法补充

java实现根据word模板导出数据

模板文件:

模板描述:{{?govinspectitemvolist}} 为循环遍历的数据实体

代码块:

//生成文件所在路径
string dirname = system.getproperty("user.dir") + file.separator + "file";
//模板文件存放地址
string templatefilename = dirname + file.separator + "质量安全巡查检查报告.docx";
//生成的临时文件
string filename = "质量安全巡查检查报告" + system.currenttimemillis() + ".docx";
wordutils.fill(response, dirname, filename, templatefilename, exportprojectreportvo);
import cn.hutool.core.util.objectutil;
import com.alibaba.excel.util.fileutils;
import com.deepoove.poi.xwpftemplate;
import com.deepoove.poi.config.configure;
import com.deepoove.poi.config.configurebuilder;
import lombok.sneakythrows;

import javax.servlet.servletoutputstream;
import javax.servlet.http.httpservletresponse;
import java.io.file;
import java.io.fileinputstream;
import java.io.fileoutputstream;
import java.io.ioexception;
import java.lang.reflect.field;
import java.net.urlencoder;
import java.nio.charset.standardcharsets;
import java.util.*;
public class wordutils {
	/**
     * @param response         输出流
     * @param path             生成文件所在路径
     * @param filename         文件名称
     * @param templatefilename 模板名称 全路径,包含模板名称
     * @param data             组装的数据
     * @throws ioexception
     */
	public static <t> void fill(httpservletresponse response, string path, string filename, string templatefilename,
                                object data) throws ioexception, illegalaccessexception {
        map<string, object> templatedata = new hashmap<>();
        configurebuilder builder = configure.builder();
        /**遍历数据*/
        for (field field : data.getclass().getdeclaredfields()) {
            field.setaccessible(true);
            object value = field.get(data);
            if (objectutil.isnull(value)) {
                value = "";
            }
            string subclassname = value.getclass().getsimplename();
            if (arrays.aslist(apiconstants.classnames).contains(subclassname)) {
                templatedata.put(field.getname(), value);
            } else {
                if (value instanceof list<?>) {
                    //list 创建 tables
                    list<?> sublist = (list<?>) value;
                    templatedata.put(field.getname(), createtable(sublist));
                }
            }
        }
        configure config = builder.build();
        // 4. 创建模板,输出模板
        string tempname = templatefilename;
        xwpftemplate template = xwpftemplate.compile(tempname, config)
                .render(templatedata);
        file outputfile = new file(path + file.separator + filename);
        template.writetofile(path + file.separator + filename);
        template.close();

        if (outputfile.exists()) {
            fileinputstream fis = new fileinputstream(outputfile);
            servletoutputstream sos = response.getoutputstream();
            int len;
            byte[] readbytes = new byte[1024];
            while ((len = fis.read(readbytes)) != -1) {
                sos.write(readbytes, 0, len);
            }
            fis.close();
            // 输出 excel
            sos.flush();
            sos.close();
            response.addheader("content-disposition", "attachment;filename=" + urlencoder.encode(filename, standardcharsets.utf_8));
            response.setcontenttype("application/octet-stream");
            //删除临时文件
            outputfile.delete();
        }
        // 设置 header 和 contenttype。写在最后的原因是,避免报错时,响应 contenttype 已经被修改了

    }
 }

到此这篇关于java如何根据word模板导出数据的文章就介绍到这了,更多相关java根据word模板导出数据内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com