前言
导出excel,介绍如何使用LoopMergeStrategy实现简单的合并
效果
每隔2行,合并一次
横向合并
横向和纵向合并
实现
导入依赖
<!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.7</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>30.1-jre</version>
</dependency>
<!-- springboot test启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
单元测试
/**
* 合并单元格
* @date 01/31/2021 03:11
*/
public class Demo {
/**
* 合并单元格
*/
@Test
public void testMyMergeWrite() {
String fileName = "/Users/quanlinglong/Downloads/mergeDemo/" + "mymergeWrite" + System.currentTimeMillis() + ".xlsx";
System.out.println("fileName = " + fileName);
// 每隔2行合并一次,横向合并1列,从第0列开始
// LoopMergeStrategy loopMergeStrategy = new LoopMergeStrategy(2, 1, 0);
// 上面的等价于
// LoopMergeStrategy loopMergeStrategy = new LoopMergeStrategy(2, 0);
// 从第columnIndex列开始,向右合并(columnExtend-1)列
// LoopMergeStrategy loopMergeStrategy = new LoopMergeStrategy(1, 2, 0);
// 合并2行2列
LoopMergeStrategy loopMergeStrategy = new LoopMergeStrategy(2, 2, 0);
EasyExcel.write(fileName, WriteDemo.DemoData.class)
.registerWriteHandler(loopMergeStrategy)
.sheet("aaa")
.doWrite(data());
}
private List<List<Object>> data() {
List<List<Object>> result = new ArrayList<>();
for (int i = 0; i < 3; i++) {
result.add(Lists.newArrayList("标题" + i, new Date(), i * 0.1));
}
return result;
}
}
分析LoopMergeStrategy类,它继承AbstractRowWriteHandler,在afterRowDispose方法里对每行做了处理,LoopMergeStrategy的构造函数传参是用来设置合并范围CellRangeAddress,再添加到当前sheet。
public void afterRowDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Integer relativeRowIndex, Boolean isHead) {
if (!isHead) {
if (relativeRowIndex % this.eachRow == 0) {
CellRangeAddress cellRangeAddress = new CellRangeAddress(row.getRowNum(), row.getRowNum() + this.eachRow - 1, this.columnIndex, this.columnIndex + this.columnExtend - 1);
writeSheetHolder.getSheet().addMergedRegionUnsafe(cellRangeAddress);
}
}
}
CellRangeAddress构造函数有4个参数
参数
0:合并起始行
1:合并终止行
2:合并起始列
3:合并终止列
CellRangeAddress cellRangeAddress = new CellRangeAddress(row.getRowNum(), row.getRowNum() + this.eachRow - 1, this.columnIndex, this.columnIndex + this.columnExtend - 1);
writeSheetHolder.getSheet().addMergedRegionUnsafe(cellRangeAddress);
构造函数传进来的eachRow, columnExtend, columnIndex,都用在这里了
相关链接
easyexcel 动态合并单元格