Java使用POI导出Excel合并单元格全攻略

闻溪
闻溪
发布时间:2026-10-15 | 4人浏览过
原创

在使用Java进行报表生成或数据交付时,将结构化数据导出为Excel是常见需求。利用Apache POI库,开发者可以轻松创建电子表格并处理复杂的排版逻辑,其中单元格的合并(如合并标题行)对于提升报表可读性至关重要。本文将逐步演示如何通过代码创建Excel、填充数据以及执行单元格合并操作。

准备工作

在编写代码之前,需要确保开发环境中已具备Java运行环境(JDK),并在项目中引入Apache POI依赖库。该库支持对Microsoft Office格式文件的读写,能够完美兼容.xls和.xlsx两种主流Excel格式。

实现步骤

第1步:创建工作簿与工作表

首先需要实例化一个工作簿对象。根据目标文件格式选择子类:

  • HSSFWorkbook:适用于旧版.xls格式。
  • XSSFWorkbook:适用于新版.xlsx格式,支持更大容量数据。

创建工作表并为表格命名,这是后续所有操作的载体。

// 以HSSF为例创建xls格式工作簿
Workbook workbook = new HSSFWorkbook();
// 创建名为Sheet1的工作表
Sheet sheet = workbook.createSheet("Sheet1");

第2步:填充表头与业务数据

数据填充分为表头和主体两部分。先创建第一行作为表头,设置列名;随后遍历数据集合,依次创建行并填入对应单元格内容。

// 创建第0行为表头
Row headerRow = sheet.createRow(0);
Cell headerCell1 = headerRow.createCell(0);
headerCell1.setCellValue("姓名");
Cell headerCell2 = headerRow.createCell(1);
headerCell2.setCellValue("年龄");

// 假设已有用户列表数据
List<User> userList = getUserList();
for (int i = 0; i < userList.size(); i++) {
    // 数据从第2行(i+1)开始写入
    Row dataRow = sheet.createRow(i + 1);
    Cell dataCell1 = dataRow.createCell(0);
    dataCell1.setCellValue(userList.get(i).getName());
    Cell dataCell2 = dataRow.createCell(1);
    dataCell2.setCellValue(userList.get(i).getAge());
}

第3步:合并指定区域单元格

若要合并多个相邻单元格(例如将第一行的"姓名"和"年龄"上方的标题栏合并),需使用CellRangeAddress对象定义矩形区域,参数顺序为:起始行、结束行、起始列、结束列。

// 将第0行(索引0)的第0列到第1列进行合并
// 参数:firstRow, lastRow, firstCol, lastCol
CellRangeAddress region = new CellRangeAddress(0, 0, 0, 1);
sheet.addMergedRegion(region);

第4步:流式输出Excel文件

完成编辑后,通过FileOutputStream将内存中的工作簿对象写入磁盘。务必关闭流以释放资源,防止内存泄漏或文件损坏。

// 指定输出路径
File file = new File("user_data.xls");
try (FileOutputStream fos = new FileOutputStream(file)) {
    workbook.write(fos);
} catch (Exception e) {
    e.printStackTrace();
}

完整代码示例

以下是整合上述步骤的完整Java类,包含数据模型定义及主逻辑,可直接用于测试验证。

import org.apache.poi.hssf.usermodel.*;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class ExcelExportUtil {

    public static void exportExcel() throws IOException {
        // 1. 创建工作簿与_sheet
        Workbook workbook = new HSSFWorkbook();
        Sheet sheet = workbook.createSheet("Sheet1");

        // 2. 填充表头
        Row headerRow = sheet.createRow(0);
        headerRow.createCell(0).setCellValue("姓名");
        headerRow.createCell(1).setCellValue("年龄");

        // 3. 填充数据
        List<User> userList = getUserList();
        for (int i = 0; i < userList.size(); i++) {
            Row row = sheet.createRow(i + 1);
            User user = userList.get(i);
            row.createCell(0).setCellValue(user.getName());
            row.createCell(1).setCellValue(user.getAge());
        }

        // 4. 合并单元格(表头区域)
        CellRangeAddress region = new CellRangeAddress(0, 0, 0, 1);
        sheet.addMergedRegion(region);

        // 5. 导出文件
        File file = new File("user_report.xls");
        try (FileOutputStream fos = new FileOutputStream(file)) {
            workbook.write(fos);
        }
        System.out.println("Excel导出成功!");
    }

    private static List<User> getUserList() {
        List<User> list = new ArrayList<>();
        list.add(new User("张三", 20));
        list.add(new User("李四", 25));
        list.add(new User("王五", 30));
        return list;
    }

    // 简易数据实体
    static class User {
        private String name;
        private int age;

        public User(String name, int age) {
            this.name = name;
            this.age = age;
        }
        public String getName() { return name; }
        public int getAge() { return age; }
    }

    public static void main(String[] args) {
        try {
            exportExcel();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

以上就是使用Java结合Apache POI实现Excel导出及单元格合并的详细内容,更多关于Java数据处理及报表生成的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表