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
版权声明:本文由 数字独教育 发布,如需转载请注明出处。