easyExcel如何实现自定义标题,前两个(多个)标题占满一行,最后标题有规律

实现效果
在这里插入图片描述
实现方式
1,标题:

@Data
public class ExportPurchaseSortingCustDto {
    /** 序号 */
    @ExcelProperty(value ={"${bigHead}","${dateHead}","序号"},index = 0)
    @ApiModelProperty(value = "序号")
    private int sort;

    /** 商品条码 */
    @ExcelProperty(value ={"${bigHead}","${dateHead}","商品条码"},index = 1)
    @ApiModelProperty(value = "商品条码")
    private String itemCode;

    /** 商品名称 */
    @ExcelProperty(value ={"${bigHead}","${dateHead}","商品名称"},index = 2)
    @ApiModelProperty(value = "商品名称 ")
    private String itemName;

    /** 订货单位 */
    @ExcelProperty(value ={"${bigHead}","${dateHead}","商品单位"},index = 3)
    @ApiModelProperty(value = "商品单位")
    private String unitName;


    /** 订货数量(含赠送量) */
    @ExcelProperty(value ={"${bigHead}","${dateHead}","订货总数量"},index = 4)
    @ApiModelProperty(value = "订货总数量")
    private BigDecimal salesQty;

    /** 分拣数量 */
    @ExcelProperty(value ={"${bigHead}","${dateHead}","配送总数量"},index = 5)
    @ApiModelProperty(value = "配送总数量")
    private BigDecimal outQty;
}

2,标题处理,写个配置类

public class ExcelTitleHandler implements CellWriteHandler {
    /**
     错误信息处理时正则表达式的格式
     */
    private final String EXCEL_ERROR_REG = "^(.*)(\\(错误:)(.*)(\\))$";

    private String bigHead;

    private String dateHead;

    PropertyPlaceholderHelper placeholderHelper = new PropertyPlaceholderHelper("${", "}");

    public ExcelTitleHandler( String bigHead,String dateHead) {
        this.bigHead = bigHead; //表头1
        this.dateHead = dateHead;  //表头2
    }

    @Override
    public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer columnIndex, Integer relativeRowIndex, Boolean isHead) {
        // 动态设置表头字段
        if (!ObjectUtil.isEmpty(head)) {
            List<String> headNameList = head.getHeadNameList();
            if (CollectionUtil.isNotEmpty(headNameList)) {
                Properties properties = new Properties();
                properties.setProperty("bigHead", bigHead);
                properties.setProperty("dateHead", dateHead);
                for (int i = 0 ; i < headNameList.size() ; i++){
                    // 循环遍历替换
                    headNameList.set(i, placeholderHelper.replacePlaceholders(headNameList.get(i), properties));
                }
            }
        }
    }
    @Override
    public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
    }
    @Override
    public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<WriteCellData<?>> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
    }
}

3:业务逻辑代码处理

@Override
    public void exportPurchaseItemSorting(HttpServletResponse response,sortingReq sortingReq){
        
        String purchaseNo = getSortingReq.getPurchaseNo();
        String deliverDate = "";
        List<ExportPurchaseSortingCustDto> list = new ArrayList<>();
        int sort =1;
      //各种业务处理
        String dateHead = "";
        try {
            response.setContentType("application/vnd.ms-excel");
            response.setCharacterEncoding("utf-8");
            response.setHeader("Content-disposition", "attachment;filename=" + "采购商品汇总导出" + ".xlsx");
            WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
            contentWriteCellStyle.setBorderLeft(BorderStyle.THIN);//细实线
            contentWriteCellStyle.setBorderTop(BorderStyle.THIN);
            contentWriteCellStyle.setBorderRight(BorderStyle.THIN);
            contentWriteCellStyle.setBorderBottom(BorderStyle.THIN);
            contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
            WriteCellStyle headWriteCellStyle = new WriteCellStyle();
            headWriteCellStyle.setBorderLeft(BorderStyle.THIN);//细实线
            headWriteCellStyle.setBorderTop(BorderStyle.THIN);
            headWriteCellStyle.setBorderRight(BorderStyle.THIN);
            headWriteCellStyle.setBorderBottom(BorderStyle.THIN);
            //设置头部标题居中
            headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
            // 这个策略是 头是头的样式 内容是内容的样式 其他的策略可以自己实现
            HorizontalCellStyleStrategy horizontalCellStyleStrategy =
                    new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);

            EasyExcel.write(response.getOutputStream(), ExportPurchaseSortingCustDto.class)
                    //插入数据
                    .sheet("汇总")
                    .registerWriteHandler(new ExcelTitleHandler("sss",dateHead))
                    .registerWriteHandler(new SimpleColumnWidthStyleStrategy(20)).registerWriteHandler(horizontalCellStyleStrategy)
                    .doWrite(list);
        }catch (Exception e){
            throw new BizException(BizExceptionEnum.CHECK_ERROR,"导出失败!");
        }
    }
  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
首先,需要在项目中添加EasyExcel的依赖,可以在pom.xml文件中添加以下代码: ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.2.9</version> </dependency> ``` 然后,创建一个实体类来存储每个块的数据: ```java public class DataBlock { private String title; private List<String> data; // getter and setter } ``` 接下来,可以通过以下代码来实现将数据分块写入Excel表格中: ```java // 创建一个 ExcelWriter 对象,用于写入 Excel 文件 ExcelWriter writer = EasyExcel.write(fileName).build(); // 定义表格的标题行和表头行的样式 WriteCellStyle headStyle = new WriteCellStyle(); headStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()); WriteFont headFont = new WriteFont(); headFont.setBold(true); headStyle.setWriteFont(headFont); // 将数据按照每个块分开 List<List<DataBlock>> dataBlocks = // 数据分块的逻辑 // 遍历每个块 for (int i = 0; i < dataBlocks.size(); i++) { // 获取当块的数据 List<DataBlock> blockData = dataBlocks.get(i); // 获取当块的标题 String blockTitle = blockData.get(0).getTitle(); // 写入当块的数据 List<List<String>> dataList = new ArrayList<>(); for (DataBlock dataBlock : blockData) { dataList.add(dataBlock.getData()); } // 写入当块的数据到 Excel 文件中 Sheet sheet = new Sheet(i, 0); sheet.setSheetName(blockTitle); sheet.setHead(createHead(blockData.get(0).getData().size())); sheet.setAutoWidth(true); writer.write(dataList, sheet); } // 关闭 ExcelWriter 对象 writer.finish(); ``` 其中,`createHead` 方法用于创建表头行。可以根据需要自定义表头行的样式和内容。 ```java private List<List<String>> createHead(int size) { List<List<String>> head = new ArrayList<>(); List<String> row = new ArrayList<>(); for (int i = 0; i < size; i++) { row.add(""); } head.add(row); return head; } ``` 这样,就可以将数据按照每个块分开,并且每个块的第一行可以自定义标题,写入 Excel 表格中了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值