Java Apache POI 进行 Excel 文档处理

简介

在当今的企业应用中,Excel 文件是数据交换和报告生成的重要工具。Java Apache POI 是一个强大的库,用于在 Java 应用程序中处理 Microsoft Office 文档,包括 Excel 文件格式(HSSF 用于 XLS 和 XSSF 用于 XLSX)。本篇博客将详细介绍 Java Apache POI 处理 Excel 文档的基础概念、使用方法、常见实践以及最佳实践,帮助读者深入理解并高效使用该工具。

目录

  1. 基础概念
  2. 入门示例
  3. 常见实践
  4. 最佳实践
  5. 小结
  6. 参考资料

基础概念

Apache POI 是一个开源项目,提供 Java API 用于操作 Microsoft Office 文件格式。Apache POI 对 Excel 文件的处理分为两个主要类库:

  • HSSF (Horrible Spreadsheet Format):用于处理 Excel 97-2003 文件格式 (.xls)。
  • XSSF (XML Spreadsheet Format):用于处理 Excel 2007 及以上版本文件格式 (.xlsx)。

具体到 Excel 文件的处理,POI 提供了一些核心对象以支持对工作簿、工作表、单元格的操作:

  • Workbook:表示一个 Excel 文件。
  • Sheet:表示一个工作表,可以包含多个 Sheet。
  • Row:表示工作表中的一行。
  • Cell:表示行中的一个单元格。

入门示例

下面是一个简单的入门示例,展示如何使用 Apache POI 创建一个包含单个工作表和一些数据的 Excel 文件:

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

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

public class CreateExcelExample {
    public static void main(String[] args) {
        Workbook workbook = new XSSFWorkbook();
        Sheet sheet = workbook.createSheet("Data");

        Row headerRow = sheet.createRow(0);
        Cell headerCell1 = headerRow.createCell(0);
        headerCell1.setCellValue("Name");

        Cell headerCell2 = headerRow.createCell(1);
        headerCell2.setCellValue("Age");

        Row dataRow = sheet.createRow(1);
        Cell dataCell1 = dataRow.createCell(0);
        dataCell1.setCellValue("Alice");

        Cell dataCell2 = dataRow.createCell(1);
        dataCell2.setCellValue(30);

        try (FileOutputStream fileOut = new FileOutputStream("example.xlsx")) {
            workbook.write(fileOut);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

常见实践

读取 Excel 文件

下面的示例展示了如何读取 Excel 文件中的数据:

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

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

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

            Sheet sheet = workbook.getSheetAt(0);
            for (Row row : sheet) {
                for (Cell cell : row) {
                    switch (cell.getCellType()) {
                        case STRING:
                            System.out.print(cell.getStringCellValue() + "\t");
                            break;
                        case NUMERIC:
                            System.out.print(cell.getNumericCellValue() + "\t");
                            break;
                        default:
                            break;
                    }
                }
                System.out.println();
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

创建 Excel 文件

在创建文件的过程中,我们要正确地关闭文件以防止资源泄漏。创建 Excel 文件的过程包括创建工作簿、工作表、行和单元格,下面是一个简单的例子:

(参见入门示例)

修改 Excel 文件

修改现有的 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 UpdateExcelExample {
    public static void main(String[] args) {
        try (FileInputStream file = new FileInputStream("example.xlsx");
             Workbook workbook = new XSSFWorkbook(file)) {

            Sheet sheet = workbook.getSheetAt(0);
            Row row = sheet.getRow(1);
            Cell cell = row.getCell(1);
            cell.setCellValue(35);  // 修改年龄

            try (FileOutputStream outFile = new FileOutputStream("example.xlsx")) {
                workbook.write(outFile);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

样式及格式化

使用 Apache POI 可以为单元格设置各种样式,例如字体、颜色和对齐方式:

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

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

public class StyleExcelExample {
    public static void main(String[] args) {
        Workbook workbook = new XSSFWorkbook();
        Sheet sheet = workbook.createSheet("Styled Data");

        Row row = sheet.createRow(0);
        Cell cell = row.createCell(0);
        cell.setCellValue("Styled Text");

        CellStyle style = workbook.createCellStyle();
        Font font = workbook.createFont();
        font.setFontHeightInPoints((short)14);
        font.setFontName("Arial");
        font.setBold(true);
        style.setFont(font);

        style.setAlignment(HorizontalAlignment.CENTER);
        cell.setCellStyle(style);

        sheet.autoSizeColumn(0);

        try (FileOutputStream fileOut = new FileOutputStream("styled_example.xlsx")) {
            workbook.write(fileOut);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

最佳实践

  1. 资源管理:使用 try-with-resources 语句自动关闭文件流和工作簿,避免内存泄漏。
  2. 性能考虑:如果要处理非常大的 Excel 文件,考虑批量写入或读取数据,避免加载整个文件到内存中。
  3. 错误处理:捕获并处理 IOExceptions 和其他潜在的异常,比如不正确的文件格式或损坏的文件。
  4. 使用 SXSSFWorkbook:对于非常大的 XLSX 文件,使用 SXSSFWorkbook 来减少内存使用。
  5. 单元测试:对 Excel 处理逻辑进行充分的单元测试,确保程序的正确性和健壮性。

小结

通过以上内容,我们详细介绍了 Apache POI 库在 Java 中处理 Excel 文件的基础概念和使用方法。重点展示了读取、创建、修改和样式化 Excel 的方法,以及在实际项目中应用的最佳实践。结合这些知识,读者可以在项目中熟练地应用 POI 库,实现 Excel 数据的高效管理。

参考资料

  1. Apache POI 官方文档
  2. Apache POI GitHub 主页
  3. Java 8 中的 try-with-resources
posted @   hyzz123  阅读(36)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
点击右上角即可分享
微信分享提示