java poi execl表格根据数据集合listAmcOfficeinfosUtil数量名称数据相同的单元格进行合并规格数据相同的单元格进行合并部门数据相同的单元格进行合并申请人数据相同的单元格进行合并 并且在最后有合计行计算名称相同的数量
您可以使用Java的Apache POI库来实现Excel表格的合并和计算。
以下是一个示例代码,演示如何根据数据集合合并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 ExcelMergeAndTotal {
public static void main(String[] args) {
List<AmcOfficeinfosUtil> data = getData(); // 获取数据集合
Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet("Sheet1");
// 创建单元格样式
CellStyle cellStyle = workbook.createCellStyle();
cellStyle.setAlignment(HorizontalAlignment.CENTER);
// 创建标题行
Row headerRow = sheet.createRow(0);
headerRow.createCell(0).setCellValue("数量");
headerRow.createCell(1).setCellValue("名称");
headerRow.createCell(2).setCellValue("规格");
headerRow.createCell(3).setCellValue("部门");
headerRow.createCell(4).setCellValue("申请人");
// 合并单元格的起始行号和终止行号
int startRow = 1;
int endRow = 1;
// 遍历数据集合,生成数据行并合并单元格
for (int i = 0; i < data.size(); i++) {
AmcOfficeinfosUtil item = data.get(i);
Row dataRow = sheet.createRow(i + 1);
dataRow.createCell(0).setCellValue(item.getQuantity());
dataRow.createCell(1).setCellValue(item.getName());
dataRow.createCell(2).setCellValue(item.getSpecification());
dataRow.createCell(3).setCellValue(item.getDepartment());
dataRow.createCell(4).setCellValue(item.getApplicant());
if (i < data.size() - 1) {
AmcOfficeinfosUtil nextItem = data.get(i + 1);
if (item.getName().equals(nextItem.getName())) {
endRow++;
} else {
// 合并名称相同的单元格
sheet.addMergedRegion(new CellRangeAddress(startRow, endRow, 1, 1));
startRow = i + 2;
endRow = i + 2;
}
} else {
// 合并最后一组名称相同的单元格
sheet.addMergedRegion(new CellRangeAddress(startRow, endRow, 1, 1));
}
}
// 添加合计行
Map<String, Integer> totalMap = new HashMap<>();
for (AmcOfficeinfosUtil item : data) {
String name = item.getName();
int quantity = item.getQuantity();
totalMap.put(name, totalMap.getOrDefault(name, 0) + quantity);
}
Row totalRow = sheet.createRow(data.size() + 1);
totalRow.createCell(0).setCellValue("合计");
int column = 1;
for (String name : totalMap.keySet()) {
int totalQuantity = totalMap.get(name);
totalRow.createCell(column).setCellValue(totalQuantity);
column++;
}
// 设置合计行样式
CellStyle totalCellStyle = workbook.createCellStyle();
totalCellStyle.setAlignment(HorizontalAlignment.CENTER);
totalRow.setRowStyle(totalCellStyle);
// 调整列宽
for (int i = 0; i < headerRow.getLastCellNum(); i++) {
sheet.autoSizeColumn(i);
}
try {
FileOutputStream outputStream = new FileOutputStream("output.xlsx");
workbook.write(outputStream);
workbook.close();
outputStream.close();
System.out.println("Excel生成成功!");
} catch (IOException e) {
e.printStackTrace();
}
}
private static List<AmcOfficeinfosUtil> getData() {
// TODO: 返回数据集合的实现
return new ArrayList<>();
}
}
请根据您的实际需求实现getData()方法来返回数据集合。在示例代码中,使用了AmcOfficeinfosUtil类来表示数据对象,您可以根据实际情况修改或替换该类。请确保AmcOfficeinfosUtil类具有以下属性和相应的getter方法:
private int quantity; // 数量
private String name; // 名称
private String specification; // 规格
private String department; // 部门
private String applicant; // 申请人
此代码将生成一个名为"output.xlsx"的Excel文件,其中单元格将根据名称、规格、部门和申请人进行合并,并在最后添加一个合计行,计算名称相同的数量
原文地址: http://www.cveoy.top/t/topic/hLiK 著作权归作者所有。请勿转载和采集!