在Java开发中,处理Excel文件是一项常见需求,尤其是.xlsx格式的文件,它是Microsoft Office Excel 2007及以后版本的默认保存格式,本文将详细介绍如何使用Java读取.xlsx文件,涵盖多种主流方法、核心代码示例、异常处理及性能优化建议,帮助开发者高效实现文件读取功能。

使用Apache POI读取.xlsx文件
Apache POI是Java领域最常用的操作Office文档的开源库,其XSSF(XML Spreadsheet Format)模块专门用于处理.xlsx文件,需在项目中添加POI依赖(以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>
核心实现步骤
-
加载工作簿:通过
XSSFWorkbook类读取.xlsx文件流,代表整个Excel文件。try (FileInputStream fis = new FileInputStream("example.xlsx"); XSSFWorkbook workbook = new XSSFWorkbook(fis)) { // 后续操作 } -
获取工作表:通过
workbook.getSheetAt(0)或workbook.getSheet("Sheet1")指定工作表。XSSFSheet sheet = workbook.getSheetAt(0);
-
遍历行与单元格:通过
sheet.iterator()遍历行,再遍历每行的单元格。Iterator<Row> rowIterator = sheet.iterator(); while (rowIterator.hasNext()) { Row row = rowIterator.next(); Iterator<Cell> cellIterator = row.iterator(); while (cellIterator.hasNext()) { Cell cell = cellIterator.next(); 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: break; } } System.out.println(); }
异常处理与资源释放
使用try-with-resources语句自动关闭文件流和工作簿,避免资源泄漏,同时需捕获FileNotFoundException和IOException等异常,确保程序健壮性。
使用EasyExcel读取.xlsx文件
阿里巴巴开源的EasyExcel库以低内存占用和高性能著称,适合处理大文件,需添加依赖:

<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.1.1</version>
</dependency>
核心实现步骤
-
定义实体模型:通过注解映射Excel列与Java对象属性。
@Data public class DemoData { @ExcelProperty("标题1") private String string; @ExcelProperty("标题2") private Double doubleData; } -
读取文件:使用
EasyExcel.read()方法,指定文件路径和监听器。String fileName = "example.xlsx"; EasyExcel.read(fileName, DemoData.class, new PageReadListener<DemoData>(dataList -> { // 每页数据回调处理 for (DemoData data : dataList) { System.out.println(data); } })).sheet().doRead();
监听器模式优势
EasyExcel采用监听器模式,逐行读取并回调处理数据,避免将整个文件加载到内存,极大降低了大文件处理的内存压力。
处理复杂场景的注意事项
-
日期与数字格式:对于日期或特殊格式的单元格,需先获取单元格样式再解析。
if (DateUtil.isCellDateFormatted(cell)) { Date date = cell.getDateCellValue(); // 日期格式化处理 } -
合并单元格处理:通过
sheet.getMergedRegions()获取合并区域,判断单元格是否属于合并单元格,并获取其主单元格值。 -
性能优化:

- 对于大文件,优先选择EasyExcel等流式读取方案。
- 禁用POI的
SXSSFWorkbook的自动刷新功能(SXSSFWorkbook workbook = new SXSSFWorkbook(100)),控制内存中的行数。 - 使用多线程处理时,确保每个线程独立使用
Workbook实例。
常见问题与解决方案
-
文件损坏或格式错误:捕获
InvalidFormatException,检查文件是否为有效的.xlsx格式(可通过ZipInputStream验证文件结构)。 -
内存溢出:处理百万级行数据时,避免使用
XSSFWorkbook全量加载,改用SXSSFWorkbook(POI的流式API)或EasyExcel。 -
编码问题:若Excel中包含中文乱码,需确保文件编码为UTF-8,并在读取时指定字符集(如使用
BufferedReader包装流)。
Java读取.xlsx文件可通过Apache POI或EasyExcel实现,POI功能全面适合中小文件,EasyExcel则擅长大文件低内存处理,开发者需根据实际场景选择工具,注意异常处理、资源释放及性能优化,掌握这些方法后,可灵活应对Excel数据读取的各种需求,提升开发效率。

















