package cn.exrick.xboot.your.common;
|
|
|
import com.alibaba.excel.metadata.CellData;
|
import com.alibaba.excel.metadata.Head;
|
import com.alibaba.excel.write.handler.CellWriteHandler;
|
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
|
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
|
import lombok.Data;
|
import org.apache.poi.ss.usermodel.Cell;
|
import org.apache.poi.ss.usermodel.CellType;
|
import org.apache.poi.ss.usermodel.Row;
|
import org.apache.poi.ss.usermodel.Sheet;
|
import org.apache.poi.ss.util.CellRangeAddress;
|
|
import java.util.List;
|
|
|
@Data
|
public class ExcelFillCellMergeStrategy implements CellWriteHandler {
|
/**
|
* 合并字段的下标,如第一到五列new int[]{0,1,2,3,4}
|
*/
|
private int[] mergeColumnIndex;
|
/**
|
* 从第几行开始合并,如果表头占两行,这个数字就是2
|
*/
|
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 integer, Integer integer1, Boolean aBoolean) {
|
|
}
|
|
@Override
|
public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell,
|
Head head, Integer integer, Boolean aBoolean) {
|
|
}
|
|
@Override
|
public void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder,
|
CellData cellData, Cell cell, Head head, Integer integer, Boolean aBoolean) {
|
|
}
|
|
@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;
|
}
|
}
|
}
|
}
|
|
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();
|
// 比较当前行的第一列的单元格与上一行是否相同,相同合并当前单元格与上一行
|
//
|
if (curData.equals(preData)) {
|
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);
|
}
|
}
|
}
|
}
|