Java 使用 Apache POI 合并 Excel 单元格
Apache POI 是一个流行的 Java API,用于处理 Microsoft Office 格式文件,包括 Excel,下面我将介绍如何使用 POI 合并 Excel 单元格。

基本步骤
- 创建工作簿 (
Workbook) - 获取或创建工作表 (
Sheet) - 获取行 (
Row) 和单元格 (Cell) - 使用
addMergedRegion()方法合并单元格
示例代码
创建新 Excel 并合并单元格
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileOutputStream;
import java.io.IOException;
public class MergeCellsExample {
public static void main(String[] args) {
// 创建新的工作簿
Workbook workbook = new XSSFWorkbook();
// 创建工作表
Sheet sheet = workbook.createSheet("合并单元格示例");
// 创建标题行
Row titleRow = sheet.createRow(0);
Cell titleCell = titleRow.createCell(0);
titleCell.setCellValue("合并单元格示例");
// 合并单元格 (从第0行第0列到第0行第2列)
sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 2));
// 创建一些数据
Row dataRow1 = sheet.createRow(1);
dataRow1.createCell(0).setCellValue("姓名");
dataRow1.createCell(1).setCellValue("年龄");
dataRow1.createCell(2).setCellValue("城市");
Row dataRow2 = sheet.createRow(2);
dataRow2.createCell(0).setCellValue("张三");
dataRow2.createCell(1).setCellValue(25);
dataRow2.createCell(2).setCellValue("北京");
// 合并单元格 (从第2行第0列到第3行第0列)
sheet.addMergedRegion(new CellRangeAddress(2, 3, 0, 0));
try (FileOutputStream fileOut = new FileOutputStream("合并单元格示例.xlsx")) {
workbook.write(fileOut);
System.out.println("Excel文件创建成功!");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
workbook.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
读取现有 Excel 并合并单元格
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class MergeExistingCells {
public static void main(String[] args) {
try (FileInputStream fileIn = new FileInputStream("现有文件.xlsx");
Workbook workbook = new XSSFWorkbook(fileIn)) {
Sheet sheet = workbook.getSheet("Sheet1");
// 合并单元格 (从第1行第1列到第3行第3列)
sheet.addMergedRegion(new CellRangeAddress(1, 3, 1, 3));
try (FileOutputStream fileOut = new FileOutputStream("修改后的文件.xlsx")) {
workbook.write(fileOut);
System.out.println("Excel文件修改成功!");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
高级合并选项
合并单元格并设置样式
// 创建样式
CellStyle style = workbook.createCellStyle();
style.setAlignment(HorizontalAlignment.CENTER); // 水平居中
style.setVerticalAlignment(VerticalAlignment.CENTER); // 垂直居中
style.setBorderBottom(BorderStyle.THIN);
style.setBorderTop(BorderStyle.THIN);
style.setBorderLeft(BorderStyle.THIN);
style.setBorderRight(BorderStyle.THIN);
// 创建单元格并应用样式
Cell cell = titleRow.createCell(0);
cell.setCellValue("合并单元格示例");
cell.setCellStyle(style);
// 合并单元格
sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 2));
检查单元格是否已合并
// 检查指定区域是否已合并
for (int i = 0; i < sheet.getNumMergedRegions(); i++) {
CellRangeAddress mergedRegion = sheet.getMergedRegion(i);
if (mergedRegion.isInRange(2, 0)) { // 检查第2行第0列是否在合并区域内
System.out.println("该单元格已合并");
break;
}
}
取消合并单元格
// 取消合并单元格 sheet.removeMergedRegion(0); // 参数是合并区域的索引
注意事项
- 合并区域不能重叠
- 合并后,只有左上角的单元格有值,其他单元格为空
- 读取合并区域时,可以使用
sheet.getMergedRegion()获取合并信息 - 对于大数据量操作,建议使用 SXSSFWorkbook (流式 API) 来避免内存问题
希望这些示例能帮助你在 Java 中使用 Apache POI 合并 Excel 单元格!

