actual combat 31 —— 多级表头excel导出

在这里插入图片描述

  1. 设置模板占位符
    (模板占位符表头不带点,非表头数据行带点,举例{.ago},{ago})
  2. 引入easyExcel依赖
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.2.1</version>
</dependency>
  1. 设置模板数据List对象vo
    注:对象的属性名要和模板占位符一致,别忘了加点;如果想要设置非列表的占位符,如果不是很多就直接新建个map对象,很多的话就直接设为对象
  2. 然后下面是service代码
@Override
public void detailExport(HttpServletResponse response, ProFixedAssetsDto proFixedAssets) throws IOException {
    // 加载模板文件为Resource
    Resource resource = resourceLoader.getResource("classpath:ExcelTemplate\\固定资产折旧明细表.xlsx");
    // 1. 将Resource转换为URL,如果Resource是文件系统中的文件
    URL url = resource.getURL();

    // 2. 或者,你可以将Resource的内容读取到内存中,然后写入到临时文件
    try (InputStream inputStream = resource.getInputStream()) {
        // 写入到临时文件
        Path tempFilePath = Files.createTempFile("template", ".xlsx");
        Files.copy(inputStream, tempFilePath, StandardCopyOption.REPLACE_EXISTING);
        // 响应内容类型
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding("utf-8");
        // 设置文件下载名
        String fileName = URLEncoder.encode("固定资产折旧明细表.xlsx", "UTF-8");
        response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename*=UTF-8''" + fileName);

        // 使用EasyExcel构建ExcelWriter(直接写入到response的OutputStream)
        try (ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream(), ProDepreciationExportVo.class).withTemplate(tempFilePath.toFile()).build()) {
            // 构建WriteSheet
            WriteSheet sheet = EasyExcel.writerSheet().build();

            // 填充表头
            Map<String, Object> map = new HashMap();
            Integer lastYear;
            Integer thisYear;
            Integer depreciationYear = proFixedAssets.getDepreciationYear();
            if (depreciationYear == null) {
                lastYear = LocalDate.now().getYear() - 1;
                thisYear = LocalDate.now().getYear();
            } else {
                lastYear = depreciationYear - 1;
                thisYear = depreciationYear;
            }
            map.put("lastYear", lastYear);
            map.put("thisYear", thisYear);
            excelWriter.fill(map, sheet);

            // 填充list表格数据
            FillConfig fillConfig = FillConfig.builder()
                    // 开启填充换行
                    .forceNewRow(true)
                    .build();
            List<ProDepreciationExportVo> proDepreciationExportVoList = getDepreciationExportVoList(proFixedAssets);
            excelWriter.fill(proDepreciationExportVoList, fillConfig, sheet);
        }
        // 清理临时文件
        Files.delete(tempFilePath);
    }
}

版本2:

@Override
public void detailExport2(HttpServletResponse response, ProFixedAssetsDto proFixedAssets) throws IOException {
    ServletOutputStream out = response.getOutputStream();

    EasyExcelUtil.initResponse(response, "报价单");

    // 文件模板输入流,将 excel 模板放到 resources 目录下
    InputStream templateFile = new ClassPathResource("ExcelTemplate\\固定资产折旧明细表.xlsx").getInputStream();

    ExcelWriter writer = EasyExcel
            .write(out)
            .withTemplate(templateFile)
            .build();

    WriteSheet sheet = EasyExcel.writerSheet().build();

    Map<String, Object> map = new HashMap();
    map.put("lastYear", LocalDate.now().getYear() - 1);
    map.put("thisYear", LocalDate.now().getYear());
    writer.fill(map, sheet);

    // 填充配置,开启组合填充换行
    FillConfig fillConfig = FillConfig.builder().forceNewRow(true).build();

    // 填充列表占位符
    writer.fill(getDepreciationExportVoList(proFixedAssets), fillConfig, sheet);

    //填充完成
    writer.finish();
}

工具包:

import javax.servlet.http.HttpServletResponse;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class EasyExcelUtil {

    /**
     * 初始化响应体
     * @param response 请求头
     * @param fileName 导出名称
     */
    public static void initResponse(HttpServletResponse response, String fileName) {
    	// 最终文件名:文件名_(截止yyyy-MM-dd)  --> 这块地方得根据你们自己项目做更改了
        String finalFileName = fileName + LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));;
        // 设置content—type 响应类型
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        try {
            // 这里URLEncoder.encode可以防止中文乱码
            finalFileName = URLEncoder.encode(finalFileName, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        response.setHeader("Content-disposition", "attachment;filename=" + finalFileName + ".xlsx");
    }
}

参考文章:https://blog.youkuaiyun.com/xhmico/article/details/137461979

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值