Java使用POI导出Excel合并单元格全攻略
在使用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数据处理及报表生成的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









