package com.dy.pmsProduct.schedule;
|
|
import com.alibaba.excel.util.BooleanUtils;
|
import com.alibaba.excel.write.handler.CellWriteHandler;
|
import com.alibaba.excel.write.handler.context.CellWriteHandlerContext;
|
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
|
import lombok.extern.slf4j.Slf4j;
|
import org.apache.poi.ss.usermodel.*;
|
import org.apache.poi.ss.util.CellRangeAddress;
|
import org.springframework.stereotype.Component;
|
|
import java.util.List;
|
|
/**
|
* 自定义拦截器。
|
* 根据排班,设置横跨几行
|
*/
|
@Slf4j
|
@Component
|
public class CustomCellWriteHandler implements CellWriteHandler {
|
|
// 设置合并相同名称的单元列
|
private int[] mergeColumnIndex = {1,2,3};
|
// 从哪行开始合并
|
private int mergeRowIndex = 3;
|
|
@Override
|
public void afterCellDispose(CellWriteHandlerContext context) {
|
Cell cell = context.getCell();
|
//当前行
|
int curRowIndex = cell.getRowIndex();
|
//当前列
|
int curColIndex = cell.getColumnIndex();
|
|
WriteSheetHolder writeSheetHolder = context.getWriteSheetHolder();
|
|
if (curRowIndex >= mergeRowIndex) {
|
for (int i = 0; i < mergeColumnIndex.length; i++) {
|
if (curColIndex == mergeColumnIndex[i]) {
|
mergeWithPrevRow(writeSheetHolder, cell, curRowIndex, curColIndex);
|
break;
|
}
|
}
|
}
|
}
|
|
/**
|
* 当前单元格向上合并
|
*
|
* @param writeSheetHolder
|
* @param cell 当前单元格
|
* @param curRowIndex 当前行
|
* @param curColIndex 当前列
|
*/
|
private void mergeWithPrevRow(WriteSheetHolder writeSheetHolder, Cell cell, int curRowIndex, int curColIndex) {
|
Object curId = cell.getSheet().getRow(curRowIndex).getCell(0).getStringCellValue();
|
Object preId = cell.getSheet().getRow(curRowIndex-1).getCell(0).getStringCellValue();
|
|
// 比较当前行的id值与上一行是否相同,相同合并当前单元格与上一行
|
if (curId.equals(preId)) {
|
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);
|
}
|
}
|
}
|
|
}
|