3 changed files with 177 additions and 14 deletions
@ -0,0 +1,105 @@ |
|||
package com.epmet.commons.tools.utils.poi.excel.handler; |
|||
|
|||
import com.alibaba.excel.write.handler.RowWriteHandler; |
|||
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; |
|||
import com.alibaba.excel.write.metadata.holder.WriteTableHolder; |
|||
import lombok.extern.slf4j.Slf4j; |
|||
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; |
|||
|
|||
/** |
|||
* desc:按行对单元格合并策略 依据是第一列的值 |
|||
* |
|||
* @author liujianjun |
|||
*/ |
|||
@Slf4j |
|||
public class ExcelFillRowMergeStrategy2 implements RowWriteHandler { |
|||
|
|||
/** |
|||
* 需要合并的列 下标 |
|||
*/ |
|||
private int[] mergeColumnIndexArr; |
|||
/** |
|||
* 从下标n行开始合并 |
|||
*/ |
|||
private int mergeRowIndex; |
|||
/** |
|||
* 默认隐藏第一列 用于合并数据 |
|||
*/ |
|||
private boolean hiddenFirst = true; |
|||
|
|||
|
|||
public ExcelFillRowMergeStrategy2(int mergeRowIndex, int[] mergeColumnIndexArr) { |
|||
this.mergeRowIndex = mergeRowIndex; |
|||
this.mergeColumnIndexArr = mergeColumnIndexArr; |
|||
} |
|||
|
|||
public ExcelFillRowMergeStrategy2(int mergeRowIndex, int[] mergeColumnIndexArr, boolean hiddenFirst) { |
|||
this.mergeRowIndex = mergeRowIndex; |
|||
this.mergeColumnIndexArr = mergeColumnIndexArr; |
|||
this.hiddenFirst = hiddenFirst; |
|||
} |
|||
|
|||
@Override |
|||
public void beforeRowCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Integer rowIndex, Integer relativeRowIndex, Boolean isHead) { |
|||
|
|||
} |
|||
|
|||
@Override |
|||
public void afterRowCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Integer relativeRowIndex, Boolean isHead) { |
|||
// 隐藏id列
|
|||
if (hiddenFirst) { |
|||
writeSheetHolder.getSheet().setColumnHidden(0, true); |
|||
} |
|||
} |
|||
|
|||
|
|||
@Override |
|||
public void afterRowDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Integer relativeRowIndex, Boolean isHead) { |
|||
//当前行索引
|
|||
int curRowNum = row.getRowNum(); |
|||
if (mergeColumnIndexArr != null && mergeColumnIndexArr.length > 0 && !isHead) { |
|||
//当前行第一列单元格
|
|||
Cell curA1Cell = row.getCell(0); |
|||
Object curA1Data = curA1Cell.getCellType() == CellType.STRING ? curA1Cell.getStringCellValue() : curA1Cell.getNumericCellValue(); |
|||
//上一行第一列单元格
|
|||
Cell preA1Cell = row.getSheet().getRow(curRowNum - 1).getCell(0); |
|||
Object preA1Data = preA1Cell.getCellType() == CellType.STRING ? preA1Cell.getStringCellValue() : preA1Cell.getNumericCellValue(); |
|||
|
|||
if (curA1Data.equals(preA1Data)) { |
|||
for (int value : mergeColumnIndexArr) { |
|||
mergeSameRow(writeSheetHolder, curRowNum, value); |
|||
} |
|||
} |
|||
} |
|||
|
|||
} |
|||
|
|||
|
|||
private void mergeSameRow(WriteSheetHolder writeSheetHolder, 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.addMergedRegionUnsafe(cellRangeAddr); |
|||
isMerged = true; |
|||
} |
|||
} |
|||
// 若上一个单元格未被合并,则新增合并单元
|
|||
if (!isMerged) { |
|||
CellRangeAddress cellRangeAddress = new CellRangeAddress(curRowIndex - 1, curRowIndex, curColIndex, curColIndex); |
|||
sheet.addMergedRegionUnsafe(cellRangeAddress); |
|||
} |
|||
} |
|||
|
|||
} |
Loading…
Reference in new issue