EasyExcel基于2.2.6版本自定义合并单元格自定义样式下载多个sheet

首先创建工作输出流

OutputStream outputStream = getOutputStream(request, response, fileName);

创建写Excel文件

ExcelWriter excelWriter = EasyExcel.write(outputStream, clazz)
        .registerWriteHandler(new MergeStrategy(mergeMap))
        .registerWriteHandler(new CustomWriteCellStyle(sheetMap))
        .build();

写入多个sheet 这里可以循环写入

WriteSheet writeSheet = EasyExcel.writerSheet(key).build();

最后关闭

excelWriter.finish();

对此读者应该还有疑问MergeStrategy、CustomWriteCellStyle 这两个类是干什么用的

MergeStrategy 是自定义的合并策略

public class MergeStrategy implements CellWriteHandler {
    //合并策略map   string:sheet名字 Integer:行数 List:合并的列
    private Map<String,Map<Integer,List<ColumnRangeDto>>> listMap;
    private static final int ROWINDEX =3; //在本行下执行
    private static final int COLUMNINDEX =0;//在本列下执行
    public MergeStrategy(Map<String,Map<Integer,List<ColumnRangeDto>>> listMap) {
        this.listMap = listMap;
    }


    @Override
    public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer columnIndex, Integer relativeRowIndex, Boolean isHead) {

    }

    @Override
    public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {

    }

    @Override
    public void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, CellData cellData, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {

    }

    @Override
    public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<CellData> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
        if (cell.getRowIndex() == ROWINDEX && cell.getColumnIndex() == COLUMNINDEX) {
            Map<Integer, List<ColumnRangeDto>> integerListMap = listMap.get(writeSheetHolder.getSheet().getSheetName());
            if (!CollectionUtils.isEmpty(integerListMap)){
                integerListMap.forEach((key,value)->{
                    if(!CollectionUtils.isEmpty(value)){
                        value.forEach(it->{
                            writeSheetHolder.getSheet().addMergedRegionUnsafe(new CellRangeAddress(key, key, it.getStart(), it.getEnd()));
                        });
                    }
                });
            }
        }
    }
}

CustomWriteCellStyle 自定义样式

public class CustomWriteCellStyle implements CellWriteHandler {

    Logger log = LoggerFactory.getLogger(MergeStrategy.class);
    //sheel和行做对应
    private Map<String,Integer> sheetMap;

    public CustomWriteCellStyle(Map<String, Integer> sheetMap) {
        this.sheetMap = sheetMap;
    }

    @Override
    public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer columnIndex, Integer relativeRowIndex, Boolean isHead) {

    }

    @Override
    public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {

    }

    @Override
    public void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, CellData cellData, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {

    }

    @Override
    public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<CellData> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
        Map<String,Object> map =new HashMap<>();
        Integer integer = sheetMap.get(writeSheetHolder.getSheet().getSheetName());
        if(integer ==null){
            //设置默认样式
            map.put(CellUtil.FILL_PATTERN, FillPatternType.SOLID_FOREGROUND);
            map.put(CellUtil.FILL_BACKGROUND_COLOR, IndexedColors.GREY_25_PERCENT.getIndex());
            map.put(CellUtil.FILL_FOREGROUND_COLOR, IndexedColors.GREY_25_PERCENT.getIndex());
        }else{
            //当前sheet和提前设定好的相同按照设定的设置样式
            //
            if(cell.getRowIndex()<7){
                //7行前的样式
                map.put(CellUtil.FILL_PATTERN, FillPatternType.SOLID_FOREGROUND);
                map.put(CellUtil.FILL_BACKGROUND_COLOR, IndexedColors.GREY_25_PERCENT.getIndex());
                map.put(CellUtil.FILL_FOREGROUND_COLOR, IndexedColors.GREY_25_PERCENT.getIndex());
            }else if(cell.getRowIndex()<11){
                
                if(cell.getRowIndex()==8){
                    //模板名称这行样式居中
                    map.put(CellUtil.ALIGNMENT,HorizontalAlignment.CENTER);
                }
                map.put(CellUtil.FILL_PATTERN, FillPatternType.SOLID_FOREGROUND);
                map.put(CellUtil.FILL_BACKGROUND_COLOR, IndexedColors.WHITE1.getIndex());
                map.put(CellUtil.FILL_FOREGROUND_COLOR, IndexedColors.WHITE1.getIndex());
            }else if(cell.getRowIndex()>(11+integer)){
                //表格下面刷白并且右对齐
                map.put(CellUtil.ALIGNMENT,HorizontalAlignment.RIGHT);
                map.put(CellUtil.FILL_PATTERN, FillPatternType.SOLID_FOREGROUND);
                map.put(CellUtil.FILL_BACKGROUND_COLOR, IndexedColors.WHITE1.getIndex());
                map.put(CellUtil.FILL_FOREGROUND_COLOR, IndexedColors.WHITE1.getIndex());
            }else {
                //保养内容和完成情况列加边框
                if(cell.getColumnIndex()==1||cell.getColumnIndex()==2||cell.getColumnIndex()==3||cell.getColumnIndex()==4){
                    map.put(CellUtil.ALIGNMENT,HorizontalAlignment.CENTER);
                    map.put(CellUtil.BORDER_BOTTOM, BorderStyle.THIN);
                    map.put(CellUtil.BORDER_LEFT, BorderStyle.THIN);
                    map.put(CellUtil.BORDER_RIGHT, BorderStyle.THIN);
                    map.put(CellUtil.BORDER_TOP, BorderStyle.THIN);
                }else{
                    //其他地方背景白色
                    map.put(CellUtil.FILL_PATTERN, FillPatternType.SOLID_FOREGROUND);
                    map.put(CellUtil.FILL_BACKGROUND_COLOR, IndexedColors.WHITE1.getIndex());
                    map.put(CellUtil.FILL_FOREGROUND_COLOR, IndexedColors.WHITE1.getIndex());
                }
            }
        }

        CellUtil.setCellStyleProperties(cell,map);

    }

最后附上效果图

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
EasyExcel中,自定义合并单元格策略可以通过实现`com.alibaba.excel.metadata.CellStrategy`接口来实现。可以参考上面提到的技术斩博主的自定义策略进行优化。 具体步骤如下: 1. 创建一个类,实现`CellStrategy`接口,并重写`merge(CellRangeAddress cellRangeAddress, Sheet sheet)`方法。 2. 在`merge()`方法中,根据自定义合并单元格规则,通过`cellRangeAddress`参数来确定需要合并的单元格范围,然后通过`sheet`对象进行单元格合并操作。 3. 根据需要,在自定义策略中添加其他的处理逻辑,例如设置合并后单元格的样式等。 4. 在使用EasyExcel进行导出时,通过`excelWriter.setCustomCellWriteHandler()`方法来设置自定义合并单元格策略。 请注意,以上步骤仅是一种实现自定义合并单元格策略的方法,具体的实现方式可能会因项目需求而有所不同。<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* [利用easyExcel导出上万条数据,自定义策略合并单元格](https://download.csdn.net/download/qq_32734167/13408705)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [EasyExcel合并单元格,通过注解方式实现自定义合并策略](https://blog.csdn.net/q1468051413/article/details/127832071)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值