Java POI Excel 表格合并单元格:根据数据集合合并相同数据并计算合计
你可以使用Java的POI库来操作Excel表格并实现你的需求。下面是一个示例代码,用于根据数据集合合并相同数据的单元格和添加合计行:
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ExcelMergeCells {
public static void main(String[] args) {
List<AmcOfficeinfosUtil> data = getData(); // 获取数据集合
Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet("Sheet1");
// 创建样式,用于合并单元格和设置合计行格式
CellStyle mergeCellStyle = workbook.createCellStyle();
mergeCellStyle.setAlignment(HorizontalAlignment.CENTER);
mergeCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
// 创建存储合并单元格信息的Map
Map<String, CellRangeAddress> mergeCellsMap = new HashMap<>();
// 写入数据
int rowIndex = 0;
for (AmcOfficeinfosUtil item : data) {
Row row = sheet.createRow(rowIndex);
Cell cell1 = row.createCell(0);
cell1.setCellValue(item.get数量());
Cell cell2 = row.createCell(1);
cell2.setCellValue(item.get名称());
Cell cell3 = row.createCell(2);
cell3.setCellValue(item.get规格());
Cell cell4 = row.createCell(3);
cell4.setCellValue(item.get部门());
Cell cell5 = row.createCell(4);
cell5.setCellValue(item.get申请人());
// 合并数量相同的单元格
String quantityKey = item.get数量();
if (mergeCellsMap.containsKey(quantityKey)) {
CellRangeAddress mergeCellRange = mergeCellsMap.get(quantityKey);
mergeCellRange.setLastRow(rowIndex);
} else {
CellRangeAddress newMergeCellRange = new CellRangeAddress(rowIndex, rowIndex, 0, 0);
mergeCellsMap.put(quantityKey, newMergeCellRange);
}
// 合并名称相同的单元格
String nameKey = item.get名称();
if (mergeCellsMap.containsKey(nameKey)) {
CellRangeAddress mergeCellRange = mergeCellsMap.get(nameKey);
mergeCellRange.setLastRow(rowIndex);
} else {
CellRangeAddress newMergeCellRange = new CellRangeAddress(rowIndex, rowIndex, 1, 1);
mergeCellsMap.put(nameKey, newMergeCellRange);
}
// 合并规格相同的单元格
String specKey = item.get规格();
if (mergeCellsMap.containsKey(specKey)) {
CellRangeAddress mergeCellRange = mergeCellsMap.get(specKey);
mergeCellRange.setLastRow(rowIndex);
} else {
CellRangeAddress newMergeCellRange = new CellRangeAddress(rowIndex, rowIndex, 2, 2);
mergeCellsMap.put(specKey, newMergeCellRange);
}
// 合并部门相同的单元格
String departmentKey = item.get部门();
if (mergeCellsMap.containsKey(departmentKey)) {
CellRangeAddress mergeCellRange = mergeCellsMap.get(departmentKey);
mergeCellRange.setLastRow(rowIndex);
} else {
CellRangeAddress newMergeCellRange = new CellRangeAddress(rowIndex, rowIndex, 3, 3);
mergeCellsMap.put(departmentKey, newMergeCellRange);
}
// 合并申请人相同的单元格
String applicantKey = item.get申请人();
if (mergeCellsMap.containsKey(applicantKey)) {
CellRangeAddress mergeCellRange = mergeCellsMap.get(applicantKey);
mergeCellRange.setLastRow(rowIndex);
} else {
CellRangeAddress newMergeCellRange = new CellRangeAddress(rowIndex, rowIndex, 4, 4);
mergeCellsMap.put(applicantKey, newMergeCellRange);
}
rowIndex++;
}
// 合并单元格
for (CellRangeAddress mergeCellRange : mergeCellsMap.values()) {
sheet.addMergedRegion(mergeCellRange);
RegionUtil.setBorderBottom(BorderStyle.THIN, mergeCellRange, sheet);
RegionUtil.setBorderTop(BorderStyle.THIN, mergeCellRange, sheet);
RegionUtil.setBorderLeft(BorderStyle.THIN, mergeCellRange, sheet);
RegionUtil.setBorderRight(BorderStyle.THIN, mergeCellRange, sheet);
}
// 添加合计行
Row totalRow = sheet.createRow(rowIndex);
Cell totalCell = totalRow.createCell(0);
totalCell.setCellValue("合计");
// 计算名称相同数据合并后的数量
Map<String, Integer> nameQuantityMap = new HashMap<>();
for (AmcOfficeinfosUtil item : data) {
String name = item.get名称();
String quantity = item.get数量();
int currentQuantity = nameQuantityMap.getOrDefault(name, 0);
int newQuantity = currentQuantity + Integer.parseInt(quantity);
nameQuantityMap.put(name, newQuantity);
}
// 在合计行中写入名称相同数据合并后的数量
int columnOffset = 1;
for (Map.Entry<String, Integer> entry : nameQuantityMap.entrySet()) {
String name = entry.getKey();
int quantity = entry.getValue();
Cell cell = totalRow.createCell(columnOffset);
cell.setCellValue(quantity);
columnOffset++;
}
// 调整列宽以适应数据
for (int i = 0; i < 5; i++) {
sheet.autoSizeColumn(i);
int columnWidth = sheet.getColumnWidth(i);
sheet.setColumnWidth(i, (int) (columnWidth * 1.2));
}
// 保存Excel文件
try (FileOutputStream fos = new FileOutputStream("output.xlsx")) {
workbook.write(fos);
} catch (IOException e) {
e.printStackTrace();
}
}
// 模拟获取数据集合的方法
private static List<AmcOfficeinfosUtil> getData() {
List<AmcOfficeinfosUtil> data = new ArrayList<>();
data.add(new AmcOfficeinfosUtil("10", "名称1", "规格1", "部门1", "申请人1"));
data.add(new AmcOfficeinfosUtil("5", "名称1", "规格2", "部门2", "申请人2"));
data.add(new AmcOfficeinfosUtil("8", "名称2", "规格1", "部门1", "申请人2"));
data.add(new AmcOfficeinfosUtil("3", "名称3", "规格3", "部门2", "申请人3"));
return data;
}
}
class AmcOfficeinfosUtil {
private String 数量;
private String 名称;
private String 规格;
private String 部门;
private String 申请人;
public AmcOfficeinfosUtil(String 数量, String 名称, String 规格, String 部门, String 申请人) {
this.数量 = 数量;
this.名称 = 名称;
this.规格 = 规格;
this.部门 = 部门;
this.申请人 = 申请人;
}
public String get数量() {
return 数量;
}
public String get名称() {
return 名称;
}
public String get规格() {
return 规格;
}
public String get部门() {
return 部门;
}
public String get申请人() {
return 申请人;
}
}
上述代码将数据集合存储在List
原文地址: https://www.cveoy.top/t/topic/pumz 著作权归作者所有。请勿转载和采集!