public static <T> void downloadMergeCellExcel(HttpServletResponse response, List<LandAllTableRow> dataList, Class rowClass,
String tableName, String sheetName, Collection<String> includeColumnFiledNames,
List<Integer> mergeColumnsIndex, int mergeRowIndex) throws IOException {
response.setContentType("application/vnd.ms-excel;charset=utf-8");
response.setCharacterEncoding("utf-8");
String fileName = URLEncoder.encode(tableName, "UTF-8");
Map<Integer, List<LandAllTableRow>> collectByLandId = dataList.stream().collect(Collectors.groupingBy(LandAllTableRow::getId));
Map<Integer, Integer> landRows = new HashMap<>();
Map<String, Integer> companyRows = new HashMap<>();
for (Integer landId : collectByLandId.keySet()) {
List<LandAllTableRow> companys = collectByLandId.get(landId);
Map<String, List<LandAllTableRow>> collectByOrgCode = companys.stream().collect(Collectors.groupingBy(LandAllTableRow::getOrganizationCode));
int companySize = 0;
for (String orgCode : collectByOrgCode.keySet()) {
companyRows.put(orgCode, collectByOrgCode.get(orgCode).size());
companySize += collectByOrgCode.get(orgCode).size();
}
landRows.put(landId, companySize);
}
try {
response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx");
response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
EasyExcel.write(response.getOutputStream(), rowClass)
.registerWriteHandler(new ExcelFillCellMergeStrategy(mergeColumnsIndex, mergeRowIndex, landRows, companyRows))
.sheet(sheetName)
.includeColumnFiledNames(includeColumnFiledNames)
.doWrite(dataList);
} catch (IOException e) {
e.printStackTrace();
}
}
package com.popsmart.data.common;
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.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddress;
import java.util.*;
public class ExcelFillCellMergeStrategy implements CellWriteHandler {
private List<Integer> mergeColumnIndex;
private int mergeRowIndex;
private Map<Integer, Integer> landRows;
private Map<String, Integer> companyRows;
public ExcelFillCellMergeStrategy(List<Integer> mergeColumnIndex, int mergeRowIndex, Map<Integer, Integer> landRows, Map<String, Integer> companyRows) {
this.mergeColumnIndex = mergeColumnIndex;
this.mergeRowIndex = mergeRowIndex;
this.landRows = landRows;
this.companyRows = companyRows;
}
@Override
public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer columnIndex, Integer relativeRowIndex, Boolean isHead) {
}
@Override
public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
}
@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();
Row row = cell.getSheet().getRow(curRowIndex);
int landIdIndex = 0;
int organizationCodeIndex = 6;
if (curRowIndex > mergeRowIndex) {
if (!mergeColumnIndex.contains(curColIndex)) {
return;
}
Integer landIdValue = (int) row.getCell(landIdIndex).getNumericCellValue();
int landSize = landRows.get(landIdValue);
if (landSize < 2) {
return;
}
Integer lastLandIdValue = null;
String lastOrgCode = null;
if (curRowIndex > 1) {
Row preRow = cell.getSheet().getRow(curRowIndex - 1);
lastLandIdValue = (int) preRow.getCell(landIdIndex).getNumericCellValue();
if (curColIndex >= organizationCodeIndex) {
lastOrgCode = preRow.getCell(organizationCodeIndex).getStringCellValue();
}
}
if (curColIndex < organizationCodeIndex) {
if (landIdValue.equals(lastLandIdValue)) {
return;
}
mergeCell(writeSheetHolder, curRowIndex, curRowIndex + landSize - 1, curColIndex);
} else {
String organizationCodeValue = row.getCell(organizationCodeIndex).getStringCellValue();
if (organizationCodeValue.equals(lastOrgCode)) {
return;
}
int companySize = companyRows.get(organizationCodeValue);
if (companySize > 2) {
mergeCell(writeSheetHolder, curRowIndex, curRowIndex + companySize - 1, curColIndex);
}
}
}
}
private void mergeCell(WriteSheetHolder writeSheetHolder,
int curRowIndex,
int lastRow,
int curColIndex) {
Sheet sheet = writeSheetHolder.getSheet();
CellRangeAddress cellRangeAddress = new CellRangeAddress(curRowIndex, lastRow, curColIndex, curColIndex);
sheet.addMergedRegion(cellRangeAddress);
}
}