Browse Source

添加按行合并策略

dev
jianjun 3 years ago
parent
commit
08794a285a
  1. 106
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/utils/poi/excel/handler/ExcelFillRowMergeStrategy.java
  2. 7
      epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/HouseController.java

106
epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/utils/poi/excel/handler/ExcelFillRowMergeStrategy.java

@ -0,0 +1,106 @@
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 ExcelFillRowMergeStrategy implements RowWriteHandler {
/**
* 需要合并的列 下标
*/
private int[] mergeColumnIndexArr;
/**
* 从下标n行开始合并
*/
private int mergeRowIndex;
/**
* 默认隐藏第一列 用于合并数据
*/
private boolean hiddenFirst = true;
public ExcelFillRowMergeStrategy(int mergeRowIndex, int[] mergeColumnIndexArr) {
this.mergeRowIndex = mergeRowIndex;
this.mergeColumnIndexArr = mergeColumnIndexArr;
}
public ExcelFillRowMergeStrategy(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);
}
}
}

7
epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/HouseController.java

@ -37,7 +37,7 @@ import com.epmet.commons.tools.page.PageData;
import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.commons.tools.security.dto.TokenDto;
import com.epmet.commons.tools.utils.ExcelUtils; import com.epmet.commons.tools.utils.ExcelUtils;
import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.utils.Result;
import com.epmet.commons.tools.utils.poi.excel.handler.ExcelFillCellMergeStrategy; import com.epmet.commons.tools.utils.poi.excel.handler.ExcelFillRowMergeStrategy;
import com.epmet.commons.tools.utils.poi.excel.handler.FreezeAndFilter; import com.epmet.commons.tools.utils.poi.excel.handler.FreezeAndFilter;
import com.epmet.commons.tools.validator.ValidatorUtils; import com.epmet.commons.tools.validator.ValidatorUtils;
import com.epmet.constants.ImportTaskConstants; import com.epmet.constants.ImportTaskConstants;
@ -364,10 +364,11 @@ public class HouseController implements ResultDataResolver {
//冻结表头 2行 //冻结表头 2行
FreezeAndFilter writeHandler = new FreezeAndFilter(); FreezeAndFilter writeHandler = new FreezeAndFilter();
writeHandler.rowSplit = 2; writeHandler.rowSplit = 2;
ExcelFillCellMergeStrategy mergeStrategy = new ExcelFillCellMergeStrategy(2,mergeRowArr,false); //ExcelFillCellMergeStrategy mergeStrategy = new ExcelFillCellMergeStrategy(2,mergeRowArr,false);
ExcelFillRowMergeStrategy mergeStrategy2 = new ExcelFillRowMergeStrategy(2,mergeRowArr,false);
WriteSheet writeSheet = EasyExcel.writerSheet("Sheet1") WriteSheet writeSheet = EasyExcel.writerSheet("Sheet1")
.head(HouseMemberResultDTO.class) .head(HouseMemberResultDTO.class)
.registerWriteHandler(mergeStrategy) .registerWriteHandler(mergeStrategy2)
.registerWriteHandler(writeHandler) .registerWriteHandler(writeHandler)
.build(); .build();
PageData<HouseMemberResultDTO> dataList = null; PageData<HouseMemberResultDTO> dataList = null;

Loading…
Cancel
Save