You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
107 lines
4.1 KiB
107 lines
4.1 KiB
package com.hfkj.common.utils;
|
|
|
|
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 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;
|
|
|
|
public class ExcelFillCellMergeStrategyUtils implements CellWriteHandler {
|
|
|
|
/**
|
|
* 需要合并列的下标,从0开始
|
|
*/
|
|
private int[] mergeColumnIndex;
|
|
/**
|
|
* 从第几行开始合并,表头下标为0
|
|
*/
|
|
private int mergeRowIndex;
|
|
|
|
public ExcelFillCellMergeStrategyUtils(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 (curColIndex == 0) {
|
|
Row preRow = cell.getSheet().getRow(curRowIndex - 1);
|
|
if (preRow == null) {
|
|
// 当获取不到上一行数据时,使用缓存sheet中数据
|
|
preRow = writeSheetHolder.getCachedSheet().getRow(curRowIndex - 1);
|
|
}
|
|
if (preRow != null) {
|
|
if (cell.getStringCellValue().equals(preRow.getCell(0).getStringCellValue())) {
|
|
for (int i = 0; i < mergeColumnIndex.length; i++) {
|
|
if (curColIndex == mergeColumnIndex[i]) {
|
|
mergeWithPrevRow(writeSheetHolder, cell, i, i);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// preRow.getCell(curColIndex);
|
|
|
|
/* 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) {
|
|
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);
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|