|
@@ -5,6 +5,7 @@ import com.alibaba.excel.metadata.data.WriteCellData;
|
|
|
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.extern.slf4j.Slf4j;
|
|
|
import org.apache.commons.lang3.ObjectUtils;
|
|
|
import org.apache.poi.ss.usermodel.Cell;
|
|
|
import org.apache.poi.ss.usermodel.CellType;
|
|
@@ -14,6 +15,7 @@ import org.apache.poi.ss.util.CellRangeAddress;
|
|
|
|
|
|
import java.util.List;
|
|
|
|
|
|
+@Slf4j
|
|
|
public class ExcelFillCellMergeStrategy implements CellWriteHandler {
|
|
|
/**
|
|
|
* 要合并的列
|
|
@@ -106,32 +108,37 @@ public class ExcelFillCellMergeStrategy implements CellWriteHandler {
|
|
|
* @param curColIndex 当前列
|
|
|
*/
|
|
|
private void mergeWithPrevRow(WriteSheetHolder writeSheetHolder, Cell cell, int curRowIndex, int curColIndex) {
|
|
|
- //获取当前行的当前列的数据和上一行的当前列列数据,通过上一行数据是否相同进行合并
|
|
|
- final Object curData = cell.getCellType() == CellType.STRING ? cell.getStringCellValue() : cell.getNumericCellValue();
|
|
|
- final Cell preCell = cell.getSheet().getRow(curRowIndex - 1).getCell(curColIndex);
|
|
|
- final Object preData = preCell.getCellType() == CellType.STRING ? preCell.getStringCellValue() : preCell.getNumericCellValue();
|
|
|
-
|
|
|
- // 比较当前行的单元格与上一行是否相同,相同合并当前单元格与上一行
|
|
|
- if (curData.equals(preData)) {
|
|
|
- final Sheet sheet = writeSheetHolder.getSheet();
|
|
|
- final List<CellRangeAddress> mergeRegions = sheet.getMergedRegions();
|
|
|
- boolean isMerged = false;
|
|
|
- for (int i = 0; i < mergeRegions.size() && !isMerged; i++) {
|
|
|
- final CellRangeAddress cellRangeAddr = mergeRegions.get(i);
|
|
|
- // 若上一个单元格已经被合并,则先移出原有的合并单元,再重新添加合并单元
|
|
|
- if (cellRangeAddr.isInRange(curRowIndex - 1, curColIndex)) {
|
|
|
- sheet.removeMergedRegion(i);
|
|
|
- cellRangeAddr.setLastRow(curRowIndex);
|
|
|
- sheet.addMergedRegion(cellRangeAddr);
|
|
|
- isMerged = true;
|
|
|
+ try {
|
|
|
+ //获取当前行的当前列的数据和上一行的当前列列数据,通过上一行数据是否相同进行合并
|
|
|
+ final Object curData = cell.getCellType() == CellType.STRING ? cell.getStringCellValue() : cell.getNumericCellValue();
|
|
|
+ final Cell preCell = cell.getSheet().getRow(curRowIndex - 1).getCell(curColIndex);
|
|
|
+ final Object preData = preCell.getCellType() == CellType.STRING ? preCell.getStringCellValue() : preCell.getNumericCellValue();
|
|
|
+
|
|
|
+ // 比较当前行的单元格与上一行是否相同,相同合并当前单元格与上一行
|
|
|
+ if (curData.equals(preData)) {
|
|
|
+ final Sheet sheet = writeSheetHolder.getSheet();
|
|
|
+ final List<CellRangeAddress> mergeRegions = sheet.getMergedRegions();
|
|
|
+ boolean isMerged = false;
|
|
|
+ for (int i = 0; i < mergeRegions.size() && !isMerged; i++) {
|
|
|
+ final CellRangeAddress cellRangeAddr = mergeRegions.get(i);
|
|
|
+ // 若上一个单元格已经被合并,则先移出原有的合并单元,再重新添加合并单元
|
|
|
+ if (cellRangeAddr.isInRange(curRowIndex - 1, curColIndex)) {
|
|
|
+ sheet.removeMergedRegion(i);
|
|
|
+ cellRangeAddr.setLastRow(curRowIndex);
|
|
|
+ sheet.addMergedRegion(cellRangeAddr);
|
|
|
+ isMerged = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 若上一个单元格未被合并,则新增合并单元
|
|
|
+ if (!isMerged) {
|
|
|
+ final CellRangeAddress cellRangeAddress = new CellRangeAddress(curRowIndex - 1, curRowIndex, curColIndex, curColIndex);
|
|
|
+ sheet.addMergedRegion(cellRangeAddress);
|
|
|
}
|
|
|
}
|
|
|
- // 若上一个单元格未被合并,则新增合并单元
|
|
|
- if (!isMerged) {
|
|
|
- final CellRangeAddress cellRangeAddress = new CellRangeAddress(curRowIndex - 1, curRowIndex, curColIndex, curColIndex);
|
|
|
- sheet.addMergedRegion(cellRangeAddress);
|
|
|
- }
|
|
|
+ }catch (Exception e){
|
|
|
+ log.error("合并单元格error:",e);
|
|
|
}
|
|
|
+
|
|
|
}
|
|
|
|
|
|
/**
|