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