java实现根据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 已经被修改了

    }
 }
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@hhr

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值