当前位置: 技术文章>> 如何在 Java 中使用 Apache POI 处理 Excel 文件?

文章标题:如何在 Java 中使用 Apache POI 处理 Excel 文件?
  • 文章分类: 后端
  • 4775 阅读

在Java开发中,处理Excel文件是一项常见的任务,尤其是在需要读取、编辑或生成报表的场景中。Apache POI是一个强大的Java库,它提供了丰富的API来操作Microsoft Office文档,尤其是Excel文件(无论是旧版的.xls格式还是新版的.xlsx格式)。下面,我将详细介绍如何在Java项目中使用Apache POI来处理Excel文件,包括读取和写入数据。

引入Apache POI

首先,你需要在你的Java项目中引入Apache POI的依赖。如果你使用Maven作为构建工具,可以在pom.xml文件中添加以下依赖(注意检查最新版本以获取最新的功能和修复):

<!-- Apache POI for Excel xls and xlsx files -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>你的POI版本号</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>你的POI-OOXML版本号</version>
</dependency>

<!-- 如果你需要处理Excel中的日期,可能还需要这个 -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml-schemas</artifactId>
    <version>你的POI-OOXML-SCHEMAS版本号</version>
</dependency>

确保替换你的POI版本号你的POI-OOXML版本号你的POI-OOXML-SCHEMAS版本号为实际的最新版本号。

读取Excel文件

读取Excel文件通常涉及打开文件、遍历工作表(Sheet)、读取行(Row)和单元格(Cell)中的数据。以下是一个简单的示例,展示如何读取.xlsx文件中的数据:

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

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class ExcelReader {
    public static void main(String[] args) {
        try (FileInputStream fis = new FileInputStream(new File("example.xlsx"));
             Workbook workbook = new XSSFWorkbook(fis)) {

            Sheet sheet = workbook.getSheetAt(0); // 获取第一个工作表
            for (Row row : sheet) {
                for (Cell cell : row) {
                    // 根据Cell类型处理数据
                    switch (cell.getCellType()) {
                        case STRING:
                            System.out.print(cell.getStringCellValue() + "\t");
                            break;
                        case NUMERIC:
                            System.out.print(cell.getNumericCellValue() + "\t");
                            break;
                        case BOOLEAN:
                            System.out.print(cell.getBooleanCellValue() + "\t");
                            break;
                        case FORMULA:
                            System.out.print(cell.getCellFormula() + "\t");
                            break;
                        case BLANK:
                            System.out.print("\t");
                            break;
                        default:
                            System.out.print("Unknown type\t");
                    }
                }
                System.out.println(); // 换行
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

注意,处理数字单元格时,Apache POI默认返回的是double类型。如果你需要处理日期,可能需要特别处理,因为Excel存储日期为自1900年1月0日以来的天数。

写入Excel文件

写入Excel文件同样简单,你需要创建一个新的工作簿(Workbook),添加工作表(Sheet),然后在工作表中添加行(Row)和单元格(Cell)。以下是一个示例:

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

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

public class ExcelWriter {
    public static void main(String[] args) {
        Workbook workbook = new XSSFWorkbook(); // 创建新的Excel工作簿
        Sheet sheet = workbook.createSheet("Example Sheet"); // 创建一个工作表

        // 创建一个行(Row 0)
        Row row = sheet.createRow(0);

        // 在行中创建单元格(Cell)并写入数据
        Cell cell = row.createCell(0);
        cell.setCellValue("Hello");

        cell = row.createCell(1);
        cell.setCellValue(123);

        cell = row.createCell(2);
        cell.setCellValue(true);

        // 将工作簿写入文件
        try (FileOutputStream outputStream = new FileOutputStream("example_output.xlsx")) {
            workbook.write(outputStream);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                workbook.close(); // 关闭工作簿以释放资源
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

进阶用法

Apache POI提供了许多高级功能,比如设置单元格样式、合并单元格、设置列宽和行高、插入图片等。这些功能通常需要使用到CellStyleDataFormatCreationHelper等类。

设置单元格样式

CellStyle style = workbook.createCellStyle();
style.setDataFormat(workbook.createDataFormat().getFormat("yyyy-mm-dd"));
cell.setCellValue(new Date());
cell.setCellStyle(style);

合并单元格

sheet.addMergedRegion(new CellRangeAddress(
    firstRow, // 起始行
    lastRow,  // 结束行
    firstCol, // 起始列
    lastCol   // 结束列
));

插入图片

插入图片稍微复杂一些,需要用到ClientAnchor来指定图片的位置和大小,以及Drawing<?>来添加图片到工作表。

注意事项

  • 性能考虑:对于大型Excel文件,操作可能会非常耗时且消耗大量内存。考虑使用SXSSFWorkbook(流式API)来处理.xlsx文件,以减少内存消耗。
  • 异常处理:确保妥善处理所有可能的异常,特别是IO异常和Apache POI抛出的特定异常。
  • 版本兼容性:不同版本的Apache POI可能支持不同版本的Excel文件格式。确保你的库版本与你的需求相匹配。

结论

Apache POI是一个强大的库,为Java开发者提供了丰富的API来读取、编辑和生成Excel文件。通过掌握其基本用法和高级功能,你可以轻松地在Java应用程序中集成Excel文件处理功能。如果你需要更深入地学习Apache POI,建议查阅官方文档和社区资源,如博客、论坛和Stack Overflow等,以获取最新的信息和解决方案。

在探索Apache POI的过程中,不妨关注一些高质量的学习资源,如“码小课”网站上的相关课程,它们可能为你提供更系统、更深入的指导和实战案例,帮助你更快地掌握这项技能。

推荐文章