使用EasyExcel对导出的数据做合并表格
前面的引用以及导出就不过多的复写了,不会的不清楚的可以自行百度,这里主要说一下对数据进行数据合并。
首先, 需要得到要合并列的下标数组。
//需要做合并单元格,对应的列数
int[] mergeColumeIndex = {0,1,2,3,4,5,6,7,8,9,10,11};
以上可多可少 , 看自己实际需要 。
然后就是,
EasyExcel.write(response.getOutputStream(), 导出.class)
//合并单元格导出策略 第几行开始进行合并 出去表头3行( 0,1,2) 由第四行放置数据(3)
.registerWriteHandler(new ExcelFillCellMergeStrategy(3, mergeColumeIndex))
.doWrite(导出数据);
这里只是示例代码 , 具体海需要什么自己加就行了, 主要是 ExcelFillCellMergeStrategy 这个合并的策略类, 来执行对数据的合并。
上面也说明了, 看自己有几行表头 , 就去掉对应的下标 (我这表头已经合并,不去除会出错,其他请自测)。
然后就是非常重要的 合并类。
/**
* .
*
* @ClassName: ExcelFillCellMergeStrategy
* @Description: 导出单元格 合并策略
* @Author: LXT
* @Date: 2021/3/1 14:04
*/
public class ExcelFillCellMergeStrategy implements CellWriteHandler {
private int[] mergeColumnIndex;
private int mergeRowIndex;
public ExcelFillCellMergeStrategy() {
}
public ExcelFillCellMergeStrategy(int mergeRowIndex, int[] mergeColumnIndex) {
this.mergeRowIndex = mergeRowIndex;
this.mergeColumnIndex = mergeColumnIndex;
}
@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 afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<CellData> list, Cell cell, Head head, Integer integer, Boolean aBoolean) {
int curRowIndex = cell.getRowIndex();
int curColIndex = cell.getColumnIndex();
if (curRowIndex > mergeRowIndex) {
for (int i = 0; i < mergeColumnIndex.length; i++) {
if (curColIndex == mergeColumnIndex[i]) {
mergeWithPrevRow(writeSheetHolder, cell, curRowIndex, curColIndex);
break;
}
}
}
}
/**
* 当前单元格向上合并
* .
* @param writeSheetHolder writeSheetHolder
* @param cell 当前单元格
* @param curRowIndex 当前行
* @param curColIndex 当前列
*/
private void mergeWithPrevRow(WriteSheetHolder writeSheetHolder, Cell cell, int curRowIndex, int curColIndex) {
Object curData = cell.getCellTypeEnum() == CellType.STRING ? cell.getStringCellValue() : cell.getNumericCellValue();
Cell preCell = cell.getSheet().getRow(curRowIndex - 1).getCell(curColIndex);
Object preData = preCell.getCellTypeEnum() == CellType.STRING ? preCell.getStringCellValue() : preCell.getNumericCellValue();
// 将当前单元格数据与上一个单元格数据比较
Boolean dataBool = preData.equals(curData);
//此处需要注意:所以获取每一行第一列数据和上一行第一列数据进行比较,如果相等合并
boolean equals = cell.getRow().getCell(0).getStringCellValue().equals(cell.getSheet().getRow(curRowIndex - 1).getCell(0).getStringCellValue());
if (dataBool && equals) {
Sheet sheet = writeSheetHolder.getSheet();
List<CellRangeAddress> mergeRegions = sheet.getMergedRegions();
boolean isMerged = false;
for (int i = 0; i < mergeRegions.size() && !isMerged; i++) {
CellRangeAddress cellRangeAddr = mergeRegions.get(i);
// 若上一个单元格已经被合并,则先移出原有的合并单元,再重新添加合并单元
if (cellRangeAddr.isInRange(curRowIndex - 1, curColIndex)) {
sheet.removeMergedRegion(i);
cellRangeAddr.setLastRow(curRowIndex);
sheet.addMergedRegion(cellRangeAddr);
isMerged = true;
}
}
// 若上一个单元格未被合并,则新增合并单元
if (!isMerged) {
CellRangeAddress cellRangeAddress = new CellRangeAddress(curRowIndex - 1, curRowIndex, curColIndex, curColIndex);
sheet.addMergedRegion(cellRangeAddress);
}
}
}
}
我这里数据有数字, 有字符串, 所有就用了getStringCellValue()。
如果需要数字之类的, 可以用其他的 请自测。
这样基本就好了 然后就是试验导出功能
下面是导合并前 和导出合并后对比
这是导出之后的效果还是可以的哈 , 看着相对来说比较方便点了
以上就是使用EasyExcel导出数据做合并单元格的全部教程,
如有其他问题,还请自测 ,这里只是提供一个方式,适用不适用还得靠自己无尽得测试。加油。垒代码。。。