java poi execl表格根据数据集合list名称数据相同的单元格进行合并规格数据相同的单元格进行合并部门数据相同的单元格进行合并申请人数据相同的单元格进行合并
要根据数据集合list将表格中名称、规格、部门和申请人相同的单元格进行合并,可以使用Apache POI库来实现。以下是一个示例代码:
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.*;
public class ExcelMergeCellsExample {
public static void main(String[] args) throws IOException {
// 创建工作簿和工作表
Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet("Sheet1");
// 模拟数据集合list
List<Data> dataList = new ArrayList<>();
dataList.add(new Data("名称1", "规格1", "部门1", "申请人1", "数据1"));
dataList.add(new Data("名称1", "规格1", "部门1", "申请人2", "数据2"));
dataList.add(new Data("名称1", "规格2", "部门1", "申请人3", "数据3"));
dataList.add(new Data("名称2", "规格2", "部门2", "申请人4", "数据4"));
dataList.add(new Data("名称2", "规格2", "部门2", "申请人4", "数据5"));
// 创建样式
CellStyle style = workbook.createCellStyle();
style.setBorderBottom(BorderStyle.THIN);
style.setBottomBorderColor(IndexedColors.BLACK.getIndex());
style.setBorderLeft(BorderStyle.THIN);
style.setLeftBorderColor(IndexedColors.BLACK.getIndex());
style.setBorderRight(BorderStyle.THIN);
style.setRightBorderColor(IndexedColors.BLACK.getIndex());
style.setBorderTop(BorderStyle.THIN);
style.setTopBorderColor(IndexedColors.BLACK.getIndex());
// 合并单元格
Map<String, List<CellRangeAddress>> mergeMap = new HashMap<>();
for (int i = 0; i < dataList.size(); i++) {
Data data = dataList.get(i);
int startRow = i + 1;
int endRow = i + 1;
// 合并名称相同的单元格
String nameKey = data.getName();
if (mergeMap.containsKey(nameKey)) {
List<CellRangeAddress> mergeList = mergeMap.get(nameKey);
CellRangeAddress lastMerge = mergeList.get(mergeList.size() - 1);
if (lastMerge.getLastRow() == startRow - 1) {
lastMerge.setLastRow(endRow);
} else {
mergeList.add(new CellRangeAddress(startRow, endRow, 0, 0));
}
} else {
List<CellRangeAddress> mergeList = new ArrayList<>();
mergeList.add(new CellRangeAddress(startRow, endRow, 0, 0));
mergeMap.put(nameKey, mergeList);
}
// 合并规格相同的单元格
String specKey = data.getSpec();
if (mergeMap.containsKey(specKey)) {
List<CellRangeAddress> mergeList = mergeMap.get(specKey);
CellRangeAddress lastMerge = mergeList.get(mergeList.size() - 1);
if (lastMerge.getLastRow() == startRow - 1) {
lastMerge.setLastRow(endRow);
} else {
mergeList.add(new CellRangeAddress(startRow, endRow, 1, 1));
}
} else {
List<CellRangeAddress> mergeList = new ArrayList<>();
mergeList.add(new CellRangeAddress(startRow, endRow, 1, 1));
mergeMap.put(specKey, mergeList);
}
// 合并部门相同的单元格
String departmentKey = data.getDepartment();
if (mergeMap.containsKey(departmentKey)) {
List<CellRangeAddress> mergeList = mergeMap.get(departmentKey);
CellRangeAddress lastMerge = mergeList.get(mergeList.size() - 1);
if (lastMerge.getLastRow() == startRow - 1) {
lastMerge.setLastRow(endRow);
} else {
mergeList.add(new CellRangeAddress(startRow, endRow, 2, 2));
}
} else {
List<CellRangeAddress> mergeList = new ArrayList<>();
mergeList.add(new CellRangeAddress(startRow, endRow, 2, 2));
mergeMap.put(departmentKey, mergeList);
}
// 合并申请人相同的单元格
String applicantKey = data.getApplicant();
if (mergeMap.containsKey(applicantKey)) {
List<CellRangeAddress> mergeList = mergeMap.get(applicantKey);
CellRangeAddress lastMerge = mergeList.get(mergeList.size() - 1);
if (lastMerge.getLastRow() == startRow - 1) {
lastMerge.setLastRow(endRow);
} else {
mergeList.add(new CellRangeAddress(startRow, endRow, 3, 3));
}
} else {
List<CellRangeAddress> mergeList = new ArrayList<>();
mergeList.add(new CellRangeAddress(startRow, endRow, 3, 3));
mergeMap.put(applicantKey, mergeList);
}
// 写入数据
Row row = sheet.createRow(i + 1);
row.createCell(0).setCellValue(data.getName());
row.createCell(1).setCellValue(data.getSpec());
row.createCell(2).setCellValue(data.getDepartment());
row.createCell(3).setCellValue(data.getApplicant());
row.createCell(4).setCellValue(data.getData());
// 设置样式
for (int j = 0; j < 5; j++) {
Cell cell = row.getCell(j, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
cell.setCellStyle(style);
}
}
// 应用合并单元格
for (Map.Entry<String, List<CellRangeAddress>> entry : mergeMap.entrySet()) {
List<CellRangeAddress> mergeList = entry.getValue();
for (CellRangeAddress merge : mergeList) {
sheet.addMergedRegion(merge);
}
}
// 调整列宽
for (int i = 0; i < 5; i++) {
sheet.autoSizeColumn(i);
}
// 保存文件
FileOutputStream fileOut = new FileOutputStream("output.xlsx");
workbook.write(fileOut);
fileOut.close();
// 关闭工作簿
workbook.close();
}
static class Data {
private String name;
private String spec;
private String department;
private String applicant;
private String data;
public Data(String name, String spec, String department, String applicant, String data) {
this.name = name;
this.spec = spec;
this.department = department;
this.applicant = applicant;
this.data = data;
}
public String getName() {
return name;
}
public String getSpec() {
return spec;
}
public String getDepartment() {
return department;
}
public String getApplicant() {
return applicant;
}
public String getData() {
return data;
}
}
}
该示例代码创建了一个名为"Sheet1"的工作表,并模拟了一个数据集合list。然后根据数据集合中的名称、规格、部门和申请人进行合并单元格,并将数据写入表格中。最后将表格保存到名为"output.xlsx"的文件中。请根据实际需求修改示例代码以适应你的数据集合和表格结构
原文地址: https://www.cveoy.top/t/topic/hK7f 著作权归作者所有。请勿转载和采集!