一、合并单元格读取
1.1 DemoTemplateListener(监听类)
读取合并单元格信息,主要是重写方法extra()
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.enums.CellExtraTypeEnum;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.metadata.CellExtra;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
@Getter
@Slf4j
public class DemoTemplateListener extends AnalysisEventListener<DemoExtraData> {
private final List<DemoExtraData> demoExtraDataList = new ArrayList<>();
private final AtomicInteger rowNum = new AtomicInteger(1);
@Override
public void invoke(DemoExtraData data, AnalysisContext context) {
ingredientsExtraDataList.add(data);
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
// 数据读取完毕,业务处理
}
@Override
public void extra(CellExtra extra, AnalysisContext context) {
if (extra.getType() == CellExtraTypeEnum.MERGE) { // 判断类型是否合并单元格
int firstRowIndex = extra.getFirstRowIndex(); // 合并单元格首行下标
int lastRowIndex = extra.getLastRowIndex(); // 合并单元格末行下标
int firstColumnIndex = extra.getFirstColumnIndex(); // 合并单元格首列下标
int lastColumnIndex = extra.getLastColumnIndex(); // 合并单元格末列下标
/**
* 读取到合并单元格信息后,可以列逻辑填充单元格数据
*/
}
}
}
1.2 测试
读取合并单元格信息要声明extraRead(CellExtraTypeEnum.MERGE)
@Test
public void test(){
String sourceFile = "/data/表.xlsx";
DemoTemplateListener listener = new DemoTemplateListener();
EasyExcel.read(sourceFile, IngredientsExtraData.class, listener)
.extraRead(CellExtraTypeEnum.MERGE) // 声明读取合并单元格
.sheet().doRead();
List<DemoTemplateListener> demoTemplateListeners = listener.getDemoExtraDataList();
demoTemplateListeners.forEach(System.out::println);
}
二、写出合并单元格
2.1 DemoMergeStrategy(合并策略)
合并单元格,主要是实现AbstractMergeStrategy.merge()
方法,指定需要合并的单元格
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.write.merge.AbstractMergeStrategy;
import lombok.Data;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddress;
import java.util.List;
@Data
public class DemoMergeStrategy extends AbstractMergeStrategy {
@Override
protected void merge(Sheet sheet, Cell cell, Head head, Integer relativeRowIndex) {
// 如何合并第一列,第二行到第三行的单元格
CellRangeAddress newMergeRegion = new CellRangeAddress(
1, // 起始行
2, // 结束行
0, // 起始列
0 // 结束列
);
List<CellRangeAddress> mergedRegions = sheet.getMergedRegions();
// 判断是否存在改合并规则,没有则添加
if(!mergedRegions.contains(newMergeRegion)) sheet.addMergedRegion(newMergeRegion1);
}
}
2.2 测试
@Test
public void test(){
String outFile = "/data/表.xlsx";
// 导出数据
List<DemoExcelTemplate> demoExcelTemplates;
EasyExcel
.write(outFile, DemoExcelTemplate.class)
.registerWriteHandler(new DemoMergeStrategy()) //合并单元格策略
.sheet("模板")
.doWrite(demoExcelTemplates);
}