java读取excel
Java开发中,读取Excel文件是一项常见的任务,尤其在数据处理、报表生成等场景中,以下是关于Java读取Excel的详细指南,涵盖主流方法、代码示例及注意事项。

主流方法对比
| 方法 | 支持格式 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|---|
| Apache POI | .xls/.xlsx | 通用性高、定制性强 | 功能全面,社区活跃,支持复杂操作 | 大文件性能差,内存占用高 |
| EasyExcel | .xlsx | 大数据量处理 | 内存低,速度快,支持流式读取 | 功能略少,仅支持2007+版本 |
| JXL | .xls | 老旧项目兼容 | 简单易用,轻量级 | 已停止维护,不支持.xlsx |
| 第三方API | 多种 | 云端集成应用 | 简化开发,自动兼容多格式 | 依赖网络,需付费(部分服务) |
Apache POI详解
依赖配置
在Maven项目中添加以下依赖:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.3</version> <!-最新版本号需查阅官网 -->
</dependency>
基础代码示例
import org.apache.poi.ss.usermodel.;
import java.io.FileInputStream;
import java.io.IOException;
public class ExcelReader {
public static void main(String[] args) throws IOException {
// 打开Excel文件
try (FileInputStream fis = new FileInputStream("data.xlsx");
Workbook workbook = WorkbookFactory.create(fis)) {
// 获取第一个工作表
Sheet sheet = workbook.getSheetAt(0);
// 遍历行与单元格
for (Row row : sheet) {
for (Cell cell : row) {
System.out.print(getCellValue(cell) + "\t");
}
System.out.println();
}
}
}
// 处理单元格类型转换
private static String getCellValue(Cell cell) {
switch (cell.getCellType()) {
case STRING:
return cell.getStringCellValue();
case NUMERIC:
return String.valueOf(cell.getNumericCellValue());
case BOOLEAN:
return String.valueOf(cell.getBooleanCellValue());
case FORMULA:
return cell.getCellFormula(); // 返回公式本身
case BLANK:
return "";
default:
return "未知类型";
}
}
}
核心步骤
- 导入依赖:确保
poi-ooxml包含在项目中。 - 获取输入流:通过
FileInputStream读取文件。 - 创建Workbook:使用
WorkbookFactory.create()自动识别.xls/.xlsx格式。 - 遍历结构:按
Sheet -> Row -> Cell层级逐层解析。 - 关闭资源:使用
try-with-resources确保文件流和Workbook关闭。
优化与注意事项
- 大文件处理:使用
SXSSFWorkbook实现流式读取,减少内存占用。 - 日期与数字转换:通过
DataFormatter统一格式化输出。 - 异常处理:捕获
IOException并处理文件不存在、格式错误等问题。
EasyExcel实践
依赖配置
在Spring Boot项目中添加:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.2.2</version>
</dependency>
数据模型定义
import lombok.Data;
@Data
public class ExcelData {
private String date; // 对应Excel第一列
private Integer userNum; // 对应Excel第二列
}
读取代码示例
import com.alibaba.excel.EasyExcel;
import java.io.File;
import java.util.List;
public class EasyExcelReader {
public static void main(String[] args) {
// 读取Excel文件
String filePath = "path/to/file.xlsx";
List<ExcelData> dataList = EasyExcel.read(filePath)
.head(ExcelData.class)
.sheet()
.doReadSync();
// 输出数据
dataList.forEach(data ->
System.out.println(data.getDate() + ", " + data.getUserNum()));
}
}
核心优势
- 低内存消耗:基于SAX解析,适合百万级数据。
- 监听器模式:通过
ReadListener实现边读边处理。 - 快速集成:无需复杂配置,依赖自动装配。
常见问题与解决方案
数字格式显示为科学计数法
原因:Excel中的数字默认以数值类型存储,过长时会转为科学计数法。
解决:使用DataFormatter或设置单元格格式为TEXT。

日期解析错误
原因:POI默认将日期视为数值(如0)。
解决:使用DateUtil.isCellDateFormatted()判断后转换:
if (DateUtil.isCellDateFormatted(cell)) {
return new SimpleDateFormat("yyyy-MM-dd").format(cell.getDateCellValue());
}
FAQs
如何判断Excel文件是.xls还是.xlsx?
答:通过文件扩展名或WorkbookFactory.create()自动识别,POI内部会根据魔数(文件头特征)区分格式。
EasyExcel能否处理合并单元格?
答:EasyExcel主要关注数据读取,合并单元格需通过Cell的RowSpan和ColSpan属性判断,但建议优先使用POI

版权声明:本文由 数字独教育 发布,如需转载请注明出处。


冀ICP备2021017634号-12
冀公网安备13062802000114号