你可以使用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中,根据数量、名称、规格、部门和申请人进行单元格合并。并在最后添加了一个合计行,计算了名称相同数据合并后的数量。请根据你的实际需求修改代码中的数据结构和字段名称,并将生成的Excel文件保存为"output.xlsx"。


原文地址: https://www.cveoy.top/t/topic/pumz 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录