杰瑞科技汇

Java Excel导出合并单元格,如何实现?

Java Excel 导出合并单元格指南

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

Java Excel导出合并单元格,如何实现?-图1
(图片来源网络,侵删)

使用Apache POI实现合并单元格

Apache POI是Java操作Excel最常用的库之一。

基本步骤

  1. 添加依赖(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>
  2. 代码实现:

    import org.apache.poi.ss.usermodel.*;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileOutputStream; import java.io.IOException;

Java Excel导出合并单元格,如何实现?-图2
(图片来源网络,侵删)

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);
    }
}

注意事项

  1. 合并单元格顺序:建议先写入数据再合并单元格,避免合并后写入数据导致问题。

  2. 样式问题:合并单元格后,只有左上角的单元格样式会保留,其他单元格样式会被忽略。

    Java Excel导出合并单元格,如何实现?-图3
    (图片来源网络,侵删)
  3. 数据读取:读取合并单元格时,只有左上角的单元格有值,其他单元格为空。

  4. 性能考虑:大数据量时,EasyExcel比Apache POI性能更好。

  5. 版本兼容性:不同版本的POI API可能略有差异,建议使用稳定版本。

  6. 复杂合并:对于复杂的合并需求,可能需要先规划好合并区域,再按顺序处理。

就是在Java中实现Excel导出合并单元格的两种常用方法,你可以根据项目需求选择合适的库。

分享:
扫描分享到社交APP
上一篇
下一篇