您可以使用 Apache 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> dataList = getDataList(); // 获取数据集合

        Workbook workbook = new XSSFWorkbook();
        Sheet sheet = workbook.createSheet('Sheet1');

        // 创建单元格样式
        CellStyle headerStyle = createHeaderStyle(workbook);
        CellStyle dataStyle = createDataStyle(workbook);

        // 设置合并单元格的区域
        Map<String, CellRangeAddress> mergedRegions = new HashMap<>();

        // 写入表头
        Row headerRow = sheet.createRow(0);
        createHeaderCell(headerRow, 0, '数量', headerStyle);
        createHeaderCell(headerRow, 1, '名称', headerStyle);
        createHeaderCell(headerRow, 2, '规格', headerStyle);
        createHeaderCell(headerRow, 3, '部门', headerStyle);
        createHeaderCell(headerRow, 4, '申请人', headerStyle);

        // 写入数据
        int rowNum = 1;
        for (AmcOfficeinfosUtil data : dataList) {
            Row dataRow = sheet.createRow(rowNum);
            createDataCell(dataRow, 0, data.getQuantity(), dataStyle);
            createDataCell(dataRow, 1, data.getName(), dataStyle);
            createDataCell(dataRow, 2, data.getSpecification(), dataStyle);
            createDataCell(dataRow, 3, data.getDepartment(), dataStyle);
            createDataCell(dataRow, 4, data.getApplicant(), dataStyle);

            // 记录合并单元格的区域
            String key = data.getName() + data.getSpecification() + data.getDepartment() + data.getApplicant();
            if (mergedRegions.containsKey(key)) {
                CellRangeAddress region = mergedRegions.get(key);
                region.setLastRow(rowNum);
            } else {
                CellRangeAddress region = new CellRangeAddress(rowNum, rowNum, 0, 4);
                mergedRegions.put(key, region);
            }

            rowNum++;
        }

        // 合并单元格
        for (CellRangeAddress region : mergedRegions.values()) {
            sheet.addMergedRegion(region);
        }

        // 添加合计行
        Row totalRow = sheet.createRow(rowNum);
        totalRow.createCell(0).setCellValue('合计');
        totalRow.createCell(1);
        totalRow.createCell(2);
        totalRow.createCell(3);
        totalRow.createCell(4).setCellValue(dataList.size());

        // 自动调整列宽
        for (int i = 0; i < 5; i++) {
            sheet.autoSizeColumn(i);
        }

        // 保存文件
        try (FileOutputStream fileOut = new FileOutputStream('output.xlsx')) {
            workbook.write(fileOut);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static List<AmcOfficeinfosUtil> getDataList() {
        // 模拟数据集合
        List<AmcOfficeinfosUtil> dataList = new ArrayList<>();
        dataList.add(new AmcOfficeinfosUtil(1, '名称1', '规格1', '部门1', '申请人1'));
        dataList.add(new AmcOfficeinfosUtil(2, '名称1', '规格1', '部门1', '申请人2'));
        dataList.add(new AmcOfficeinfosUtil(3, '名称2', '规格2', '部门2', '申请人3'));
        dataList.add(new AmcOfficeinfosUtil(4, '名称3', '规格3', '部门3', '申请人4'));
        dataList.add(new AmcOfficeinfosUtil(5, '名称3', '规格3', '部门3', '申请人5'));
        return dataList;
    }

    private static CellStyle createHeaderStyle(Workbook workbook) {
        CellStyle style = workbook.createCellStyle();
        Font font = workbook.createFont();
        font.setBold(true);
        style.setFont(font);
        return style;
    }

    private static CellStyle createDataStyle(Workbook workbook) {
        CellStyle style = workbook.createCellStyle();
        style.setWrapText(true);
        return style;
    }

    private static void createHeaderCell(Row row, int column, String value, CellStyle style) {
        Cell cell = row.createCell(column);
        cell.setCellValue(value);
        cell.setCellStyle(style);
    }

    private static void createDataCell(Row row, int column, Object value, CellStyle style) {
        Cell cell = row.createCell(column);
        if (value instanceof Number) {
            cell.setCellValue(((Number) value).doubleValue());
        } else {
            cell.setCellValue(value.toString());
        }
        cell.setCellStyle(style);
    }
}

class AmcOfficeinfosUtil {
    private int quantity;
    private String name;
    private String specification;
    private String department;
    private String applicant;

    public AmcOfficeinfosUtil(int quantity, String name, String specification, String department, String applicant) {
        this.quantity = quantity;
        this.name = name;
        this.specification = specification;
        this.department = department;
        this.applicant = applicant;
    }

    public int getQuantity() {
        return quantity;
    }

    public String getName() {
        return name;
    }

    public String getSpecification() {
        return specification;
    }

    public String getDepartment() {
        return department;
    }

    public String getApplicant() {
        return applicant;
    }
}

上述代码中,getDataList()方法模拟了一个数据集合,您可以根据实际情况进行替换。createHeaderStyle()createDataStyle()方法分别创建了表头和数据的单元格样式。createHeaderCell()createDataCell()方法用于创建表头和数据的单元格。最后,通过Workbook对象的write()方法将数据写入文件中。

请注意,此示例使用了XSSF格式(.xlsx文件)。如果要使用HSSF格式(.xls文件),只需将Workbook workbook = new XSSFWorkbook();改为Workbook workbook = new HSSFWorkbook();即可。


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

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