Java 中处理 Excel:Apache POI 及其替代方案

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Java 中处理 Excel:库概览与代码示例



Java 是企业级开发中最流行的语言之一,经常需要与 Microsoft Excel 电子表格(.xls 和 .xlsx 格式)进行交互。无论是导出报告、从 CRM 导入数据,还是自动化会计报告,都离不开一个可靠的工具来处理 Excel。在本文中,我们将介绍 Java 的主要库、它们的特性、优缺点,并提供实用的代码示例。



Java 中处理 Excel 的流行库



目前有几种成熟的解决方案。具体库的选择取决于 Excel 版本、数据量和所需功能。



  • Apache POI — 事实上的标准。支持两种格式(.xls 和 .xlsx),允许读取、写入、格式化单元格,处理公式、图表和宏。虽然较重,但功能最强大。
  • JExcelApi (jxl) — 更轻量的替代方案,但仅支持旧版 .xls 格式。适用于不需要 .xlsx 支持的简单任务。
  • EasyExcel (Alibaba) — 基于 POI 的轻量级版本,针对大文件和流式处理进行了优化。非常适合导入/导出数百万行数据。
  • OpenCSV — 并非直接用于 Excel,而是用于处理 CSV(Excel 可打开)。非常适合无需格式化的简单表格数据交换。


示例 1:使用 Apache POI 读取 Excel 文件



考虑一个基本场景:打开 data.xlsx 文件并将第一页的内容输出到控制台。



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) { String filePath = "data.xlsx";

try (FileInputStream fis = new FileInputStream(filePath); Workbook workbook = new XSSFWorkbook(fis)) {

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; case BOOLEAN: System.out.print(cell.getBooleanCellValue() + "\\t"); break; default: System.out.print("?\\t"); } } System.out.println(); } } catch (IOException e) { e.printStackTrace(); } }}


示例 2:格式化写入 Excel 数据



创建一个新的 report.xlsx 文件,包含标题和数据,并将标题设置为粗体。



import org.apache.poi.ss.usermodel.*;import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.io.FileOutputStream;import java.io.IOException;

public class WriteExcelExample { public static void main(String[] args) { try (Workbook workbook = new XSSFWorkbook()) { Sheet sheet = workbook.createSheet("报告");

// 标题样式 CellStyle headerStyle = workbook.createCellStyle(); Font headerFont = workbook.createFont(); headerFont.setBold(true); headerFont.setFontHeight

推荐