Java Excel 导出合并单元格指南
在Java中导出Excel并实现合并单元格功能,常用的库有Apache POI和EasyExcel,下面我将分别介绍这两种方法实现合并单元格的导出。

使用Apache POI实现合并单元格
Apache POI是Java操作Excel最常用的库之一。
基本步骤
-
添加依赖(Maven):
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>5.2.3</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>5.2.3</version> </dependency>
-
代码实现:
import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileOutputStream; import java.io.IOException;

public class PoiMergeCellsExample { public static void main(String[] args) throws IOException { // 创建工作簿 Workbook workbook = new XSSFWorkbook(); // 创建工作表 Sheet sheet = workbook.createSheet("合并单元格示例");
// 创建样式
CellStyle style = workbook.createCellStyle();
style.setAlignment(HorizontalAlignment.CENTER);
style.setVerticalAlignment(VerticalAlignment.CENTER);
// 创建行和单元格
Row row1 = sheet.createRow(0);
Cell cell1 = row1.createCell(0);
cell1.setCellValue("合并区域");
cell1.setCellStyle(style);
Row row2 = sheet.createRow(1);
Cell cell2 = row2.createCell(0);
cell2.setCellValue("测试数据");
cell2.setCellStyle(style);
// 合并单元格 (起始行, 结束行, 起始列, 结束列)
sheet.addMergedRegion(new CellRangeAddress(0, 1, 0, 0));
// 自动调整列宽
sheet.autoSizeColumn(0);
// 写入文件
try (FileOutputStream out = new FileOutputStream("merge_cells_example.xlsx")) {
workbook.write(out);
}
workbook.close();
}
### 高级合并单元格示例
```java
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileOutputStream;
import java.io.IOException;
public class AdvancedPoiMergeExample {
public static void main(String[] args) throws IOException {
Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet("高级合并示例");
// 创建表头
Row headerRow = sheet.createRow(0);
headerRow.createCell(0).setCellValue("部门");
headerRow.createCell(1).setCellValue("姓名");
headerRow.createCell(2).setCellValue("职位");
// 第一组数据
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("李四");
dataRow2.createCell(2).setCellValue("高级工程师");
// 合并部门列 (1-2行, 0列)
sheet.addMergedRegion(new CellRangeAddress(1, 2, 0, 0));
// 创建样式
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);
// 应用样式
for (int i = 0; i <= 2; i++) {
sheet.getRow(1).getCell(i).setCellStyle(style);
sheet.getRow(2).getCell(i).setCellStyle(style);
}
// 自动调整列宽
for (int i = 0; i < 3; i++) {
sheet.autoSizeColumn(i);
}
// 写入文件
try (FileOutputStream out = new FileOutputStream("advanced_merge_example.xlsx")) {
workbook.write(out);
}
workbook.close();
}
}
使用EasyExcel实现合并单元格
EasyExcel是阿里巴巴开源的Excel处理库,性能更好,API更简洁。
添加依赖(Maven)
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.1.1</version>
</dependency>
代码实现
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.metadata.WriteTable;
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.metadata.style.WriteFont;
import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
import org.apache.poi.ss.usermodel.*;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class EasyExcelMergeExample {
public static void main(String[] args) throws IOException {
String fileName = "easyexcel_merge_example.xlsx";
// 数据准备
List<List<String>> data = new ArrayList<>();
// 表头
data.add(List.of("部门", "姓名", "职位"));
// 数据行
data.add(List.of("技术部", "张三", "工程师"));
data.add(List.of("", "李四", "高级工程师"));
data.add(List.of("市场部", "王五", "经理"));
data.add(List.of("", "赵六", "专员"));
// 创建ExcelWriter
ExcelWriter excelWriter = EasyExcel.write(fileName).build();
// 创建WriteSheet
WriteSheet writeSheet = EasyExcel.writerSheet("合并单元格示例").build();
// 创建WriteTable
WriteTable writeTable = new WriteTable();
writeTable.setHead(data.subList(0, 1)); // 只设置表头
// 设置合并策略
excelWriter.write(data.subList(1, data.size()), writeSheet, writeTable);
// 合并单元格 (起始行, 结束行, 起始列, 结束列)
// 注意:EasyExcel的行号从0开始,但数据行从1开始(因为第0行是表头)
excelWriter.merge(1, 2, 0, 0); // 合并第1-2行的第0列
excelWriter.merge(3, 4, 0, 0); // 合并第3-4行的第0列
// 关闭资源
excelWriter.finish();
System.out.println("Excel文件已生成: " + fileName);
}
}
注意事项
-
合并单元格顺序:建议先写入数据再合并单元格,避免合并后写入数据导致问题。
-
样式问题:合并单元格后,只有左上角的单元格样式会保留,其他单元格样式会被忽略。
(图片来源网络,侵删) -
数据读取:读取合并单元格时,只有左上角的单元格有值,其他单元格为空。
-
性能考虑:大数据量时,EasyExcel比Apache POI性能更好。
-
版本兼容性:不同版本的POI API可能略有差异,建议使用稳定版本。
-
复杂合并:对于复杂的合并需求,可能需要先规划好合并区域,再按顺序处理。
就是在Java中实现Excel导出合并单元格的两种常用方法,你可以根据项目需求选择合适的库。
