EasyExcel多个sheet页里多行表头,解决:使用table去写入

需求的效果:

多个sheet,并且每个sheet里是多行表头,这是使用EasyExcel的table去写入

 

1.接口试例

    /**
     * 预付款导出
     */
    @GetMapping("/export/excel")
    public Result<Void, Void> export(HttpServletRequest request, String ids, HttpServletResponse response) throws IOException {

        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding("utf-8");
        LocalDate now = LocalDate.now();
        //设置表名称,日期+表名
        String fileName = now + "测试";
        // 这里URLEncoder.encode可以防止中文乱码 和easyexcel没有关系
        fileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");


        //这里是接收到前端传来的id的字符串,和前端规定用逗号分隔
        List<String> strings = Arrays.asList(ids.split(","));
        if (strings.size() <= 0) {
            return FtResultUtil.error(ExceptionEnum.PARAM_ERROR);
        }

        //查询数据库后需要导出的集合
        List<ExportPrepaymentsVO> list = purchaseContractPrepaymentsService.getProductContractDetails(ids);
        ExcelWriter excelWriter = null;


        try {
            //定义 ExcelWriter
            excelWriter = null;

            //写到那里,这里是转成输出流,写到响应里
            excelWriter = EasyExcel.write(response.getOutputStream()).build();

            //多sheet页,list的每个元素就是一个sheet页
            for (int i = 1; i <= list.size(); i++) {

                //取到第一行数据
                ExportPrepaymentsVO exportPrepaymentsVO1 = list.get(i - 1);

                //第一行数据
                List<DownloadExportPrepaymentsVO> result1 = new ArrayList<>();
                DownloadExportPrepaymentsVO purchaseContractPrepayments1 = new DownloadExportPrepaymentsVO();
                purchaseContractPrepayments1.setContractName(exportPrepaymentsVO1.getContractName());
                purchaseContractPrepayments1.setContractNumber(exportPrepaymentsVO1.getContractNumber());
                purchaseContractPrepayments1.setSupplierName(exportPrepaymentsVO1.getSupplierName());
                purchaseContractPrepayments1.setUpdateUser(exportPrepaymentsVO1.getUpdateUser());
                purchaseContractPrepayments1.setUpdateTime(exportPrepaymentsVO1.getUpdateTime());
                result1.add(purchaseContractPrepayments1);


                //每个sheet页第二行的数据
                List<PurchaseContractPrepayments> purchaseContractPrepayments = exportPrepaymentsVO1.getPurchaseContractPrepayments();

                List<DownloadPurchaseContractPrepaymentsVO> result2 = purchaseContractPrepayments.stream().map(x -> {
                    DownloadPurchaseContractPrepaymentsVO downloadPurchaseContractPrepaymentsVO = new DownloadPurchaseContractPrepaymentsVO();
                    BeanUtils.copyProperties(x, downloadPurchaseContractPrepaymentsVO);

                    return downloadPurchaseContractPrepaymentsVO;

                }).collect(Collectors.toList());

                //TODO 第三行对账数据  还没有



                //创建一个sheet页,参数一sheet页的下标 参数2sheet的名字,名字重复无法创建sheet,会覆盖
                WriteSheet writeSheet = EasyExcel.writerSheet(i, purchaseContractPrepayments1.getContractName()+i).build();

                //使用table去写入多行表头
                WriteTable writeTable = EasyExcel.writerTable(0).head(DownloadExportPrepaymentsVO.class).needHead(true).build();
                WriteTable writeTable2 = EasyExcel.writerTable(1).head(DownloadPurchaseContractPrepaymentsVO.class).needHead(true).build();


                //写
                excelWriter.write(result1, writeSheet, writeTable);
                excelWriter.write(result2, writeSheet, writeTable2);

            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 放进finally里  就算跑异常 也会关流
            excelWriter.finish();
        }


        return null;
    }

 2.导出的table模板

import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;



@Data
public class DownloadExportPrepaymentsVO {
    /**
     * 合同名称
     */
    @ExcelProperty(value = {"采购合同名称"},index = 1)
    private String contractName;
    /**
     * 合同编号
     */
    @ExcelProperty(value = {"合同编号"},index = 0)
    private String contractNumber;
    /**
     * 供应商名称
     */
    @ExcelProperty(value = {"供应商名称"},index = 2)
    private String supplierName;
    /**
     * 最后操作人
     */
    @ExcelProperty(value = {"最后操作人"},index = 3)
    private String updateUser;
    /**
     * 最后操作时间
     */
    @ExcelProperty(value = {"最后操作时间"},index = 4)
    private String updateTime;

}
import java.math.BigDecimal;

@Data
public class DownloadPurchaseContractPrepaymentsVO {

    /**
     * 预付款编号
     */

    @ColumnWidth(25)
    @ExcelProperty(value = {"预付款编号"},index = 0)
    private String prepaymentsNumnber;

    /**
     * 预付款金额
     */

    @ColumnWidth(25)
    @ExcelProperty(value = {"预付款金额"},index = 1)
    private BigDecimal prepaymentsAmount;

    /**
     * 已使用金额
     */

    @ColumnWidth(25)
    @ExcelProperty(value = {"已使用金额"},index = 2)
    private BigDecimal usedAmount;

    /**
     * 未使用金额
     */

    @ColumnWidth(25)
    @ExcelProperty(value = {"待付款金额"},index = 3)
    private BigDecimal unusedAmount;

    /**
     * 预付款状态
     */

    @ColumnWidth(25)
    @ExcelProperty(value = {"预付款状态"},index = 4)
    private String prepaymentsStatus;

    /**
     * 申请人
     */

    @ColumnWidth(25)
    @ExcelProperty(value = {"申请人"},index = 5)
    private String applicant;

    /**
     * 最后操作人
     */

    @ColumnWidth(25)
    @ExcelProperty(value = {"最后操作人"},index = 6)
    private String updateUser;
    /**
     * 最后操作时间
     */
    @ColumnWidth(25)
    @ExcelProperty(value = {"最后操作时间"},index = 7)
    private String updateTime;


}

3.查完数据库需要导出的list的Class类


@Data
public class ExportPrepaymentsVO {
    /**
     * 合同名称
     */
    private String contractName;
    /**
     * 合同编号
     */
    private String contractNumber;
    /**
     * 供应商名称
     */
    private String supplierName;
    /**
     * 最后操作人
     */
    private String updateUser;
    /**
     * 最后操作时间
     */
    private String updateTime;

    /**
     * 预付款详情
     */
    private List<PurchaseContractPrepayments> purchaseContractPrepayments;
    /**
     * @Todo 使用记录
     */

}

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在EasyExcel中生成包含下拉复选框的表头,你需要使用`com.alibaba.excel.metadata.Sheet`和`com.alibaba.excel.metadata.Table`来设置表头和下拉选项。 下面是一个示例代码,展示如何生成包含下拉复选框的表头: ```java // 创建Excel对象 ExcelWriter writer = EasyExcel.write("template.xlsx").build(); // 创建Sheet Sheet sheet = new Sheet(1, 0); // 创建表头 List<List<String>> head = new ArrayList<>(); head.add(Arrays.asList("姓名", "年龄", "性别")); // 设置下拉选项 List<List<String>> dropdownData = new ArrayList<>(); dropdownData.add(Arrays.asList("男", "女")); // 性别下拉选项 // 创建Table,并设置下拉选项 Table table = new Table(0); table.setHead(head); table.setDropdownData(dropdownData); // 将Table添加到Sheetsheet.setTable(table); // 写入数据 List<List<Object>> data = new ArrayList<>(); data.add(Arrays.asList("张三", 20, "男")); data.add(Arrays.asList("李四", 25, "女")); writer.write(data, sheet); // 关闭Excel对象 writer.finish(); ``` 上述代码中,首先创建了一个ExcelWriter对象,指定了要生成的Excel文件名为"template.xlsx"。然后创建了一个Sheet对象,并设置了表头信息。接下来,通过创建一个Table对象,并使用`setDropdownData()`方法设置下拉选项。将Table对象添加到Sheet中,并使用`sheet.setTable()`方法进行设置。 在实际应用中,你可以根据需要设置不同的下拉选项,以及调整数据的结构和内容。请注意,下拉选项的数据需要以二维列表的形式提供。 这只是一个简单的示例,你可以根据实际需求进行更复杂的设置。参考EasyExcel的官方文档来了解更多功能和用法:https://www.yuque.com/easyexcel/doc/easyexcel

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值