easyexcel-2.1.6导出怎么把相同列的内容合并
时间: 2024-04-30 13:18:41 浏览: 8
在使用 easyexcel-2.1.6 进行导出时,可以通过自定义格式化器实现相同列内容的合并。具体步骤如下:
1. 自定义格式化器
```java
public class MergeCellStrategy implements WriteHandler {
private int mergeRowIndex = 0;
private int mergeCellIndex = 0;
private Object preCellValue = null;
@Override
public void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
}
@Override
public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
}
@Override
public void afterWorkbookCreate(WriteWorkbookHolder writeWorkbookHolder) {
}
@Override
public void beforeRowCreate(WriteSheetHolder writeSheetHolder, WriteRowHolder writeRowHolder, Row row, Integer rowIndex, Integer relativeRowIndex, Boolean isHead) {
}
@Override
public void afterRowCreate(WriteSheetHolder writeSheetHolder, WriteRowHolder writeRowHolder, Row row, Integer rowIndex, Boolean isHead) {
}
@Override
public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteCellHolder writeCellHolder, Cell cell, Integer cellIndex, String cellValue, Boolean isHead) {
}
@Override
public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteCellHolder writeCellHolder, Cell cell, Integer cellIndex, String cellValue, Boolean isHead) {
if (!isHead) {
if (cellIndex == mergeCellIndex && preCellValue != null && preCellValue.equals(cellValue)) {
// 添加合并单元格的区域
writeSheetHolder.getSheet().addMergedRegion(new CellRangeAddress(mergeRowIndex, rowIndex, cellIndex, cellIndex));
} else {
// 更新前一个单元格的值和行索引
preCellValue = cellValue;
mergeRowIndex = rowIndex;
mergeCellIndex = cellIndex;
}
}
}
}
```
在自定义格式化器中,我们维护了前一个单元格的值和行索引,当当前单元格的值和前一个单元格的值相同时,将当前单元格和前一个单元格合并。
2. 注册自定义格式化器
```java
ExcelWriterBuilder writerBuilder = EasyExcel.write(outputStream, clazz)
.registerWriteHandler(new MergeCellStrategy());
```
在注册写处理器时,将自定义格式化器注册进去即可。
3. 编写导出代码
在编写导出代码时,需要指定合并单元格的列,例如对于以下实体类:
```java
@Data
public class User {
private Long id;
private String name;
private Integer age;
}
```
如果要对 name 列进行合并,可以这样写:
```java
List<User> userList = getUserList();
ExcelWriterBuilder writerBuilder = EasyExcel.write(outputStream, User.class)
.registerWriteHandler(new MergeCellStrategy());
writerBuilder.sheet().registerWriteHandler(new MergeCellStrategy());
writerBuilder.sheet().tableStyle(TableStyleTypeEnum.TABLE_STYLE_MEDIUM);
Sheet sheet = writerBuilder.sheet().build();
List<List<String>> head = new ArrayList<>();
// 表头
head.add(Arrays.asList("ID", "姓名", "年龄"));
// 内容
List<List<Object>> content = new ArrayList<>();
for (User user : userList) {
List<Object> row = new ArrayList<>();
row.add(user.getId());
row.add(user.getName());
row.add(user.getAge());
content.add(row);
}
writerBuilder.head(head).sheet("Sheet1").doWrite(content);
```
在导出代码中,我们将自定义格式化器注册到 sheet 中,通过 `registerWriteHandler` 方法实现。同时,我们在导出时指定了表头和内容,并将其写入 Excel 中。
这样,就可以实现对相同列内容的合并了。