easyexcel导出&自定义策略合并单元格

easyexcel导出&自定义策略合并单元格

效果图

在这里插入图片描述

在这里插入图片描述

导入easyexcel依赖 pom

		<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.2.6</version>
        </dependency>

导出VO对象


@Data
@TableName("t_person")
public class TPerson implements Serializable {
    @ExcelIgnore // 用该注解标记忽略字段
    private Long id;

    @ExcelProperty({"人员信息","姓名"}) // 标题,写多个标题可以让标题具有层级关系
    private String personName;

    @ExcelProperty({"人员信息","年龄"})
    private Integer age;

    @ExcelProperty({"人员信息","性别"})
    private Integer sex;
 
    @ExcelProperty({"身份证号码"})
    private String idCard;

    @ExcelProperty({"手机号码"})
    private String phoneNumber;

}

导出的service层逻辑

其中使用自定义策略在 .registerWriteHandler(new CustomMergeStrategy())这个方法中,添加自定义策略实现类

	@Override
    public void testExportPersonExcel(HttpServletResponse response) throws IOException {
        List<TPerson> personList = personMapper.selectList(null); // 可更换自己数据源
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf8");
        response.setHeader("Content-disposition", "attachment;filename=" + "全部数据.xlsx" );

        EasyExcel.write(response.getOutputStream())
                .head(TPerson.class)
                .registerWriteHandler(new CustomMergeStrategy()) // 使用自定义策略
                .excelType(ExcelTypeEnum.XLSX)
                .sheet("人员列表")
                .doWrite(personList);
    }

自定义策略

package com.tfxing.persondaily.entity.strategy;
import com.alibaba.excel.write.handler.RowWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;

public class CustomMergeStrategy implements RowWriteHandler {


    public CustomMergeStrategy() {}

       @Override
    public void beforeRowCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Integer rowIndex,
                                Integer relativeRowIndex, Boolean isHead) {
        Sheet sheet = writeSheetHolder.getSheet();

    }

    @Override
    public void afterRowCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row,
                               Integer relativeRowIndex, Boolean isHead) {
            Sheet sheet = writeSheetHolder.getSheet();
    }

    @Override
    public void afterRowDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row,
                                Integer relativeRowIndex, Boolean isHead) {
        
       	// 处理标题,可以自定义标题
       	titleHandle(writeSheetHolder.getSheet(),"titleName","titleName2"); 
        
       	// 合并单元格
        // 参数说明:开始行,结束行,开始列,结束列
        CellRangeAddress cellRangeAddress = new CellRangeAddress(0, 2, 1, 3); // 合并第1-3行,第2-4列
        sheet.addMergedRegionUnsafe(cellRangeAddress);
    }

    private void titleHandle(Sheet sheet, String titleName, String titleName2) {
       	// 设置单元格风格
        Workbook workbook = sheet.getWorkbook();
        Font font = workbook.createFont();
        font.setBold(true); // 字体加粗
        font.setFontHeightInPoints((short)14); // 字体大小14

        CellStyle cellStyle = workbook.createCellStyle();
        cellStyle.setAlignment(HorizontalAlignment.LEFT); // 内容居左
        cellStyle.setFont(font);

        // 将行的标题设置为titleName
        for (int i = 0; i < 7; i++) {
            Cell cell = sheet.getRow(1).getCell(i);
            cell.setCellValue(titleName);
            cell.setCellStyle(cellStyle);
        }

        CellStyle cellStyle1 = workbook.createCellStyle();
        cellStyle1.setAlignment(HorizontalAlignment.RIGHT); // 内容居右
        cellStyle1.setFont(font);

        for (int i = 7; i < 12; i++) {
            Cell cell = sheet.getRow(1).getCell(i);
            cell.setCellValue(titleName2);
            cell.setCellStyle(cellStyle1);
        }


    }

}

参数解析

  • writeSheetHolder:
    包含了excel中整个sheet的信息,以下是比较重要有意义的参数:

    • sheet:
      • workbook:
        • stylesSource: 包含了样式风格,例如:fonts:字体大小,borders:边框大小
      • rows: 当前sheet的所有行列表
        • cells: 行中的单元格的列表
    • sheetName:sheet名称
    • writeSheet:
  • writeTableHolder:

  • rowIndex:当前所处于excel的第几行,从1开始

  • relativeRowIndex:去除标题后,当前所处于excel的第几行,从1开始

  • isHead:boolean类型,是否为标题

  • row:当前行的信息

    • cells: 行中的单元格的列表

在这里插入图片描述

测试

将1,2,3列的第4-6行分别合并

for (int i = 0; i < 3; i++) {   
	CellRangeAddress cellRangeAddress = new CellRangeAddress(3, 6, i, i);    	writeSheetHolder.getSheet().addMergedRegionUnsafe(cellRangeAddress);
	}

效果图

在这里插入图片描述

后面写的一篇,合并单元格策略,更详细,更清晰
excel单元格合并策略

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值