java如何读取xlsx文件
使用 Apache POI 库读取 XLSX 文件
Apache POI 是 Java 中处理 Office 文档的流行库,支持 XLSX 格式。以下是读取 XLSX 文件的基本方法:
确保在项目中添加 Apache POI 依赖(Maven 配置):
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<artifactId>5.2.3</artifactId>
</dependency>
读取 XLSX 文件的代码示例:
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileInputStream;
import java.io.IOException;
public class XLSXReader {
public static void main(String[] args) {
try (FileInputStream fis = new FileInputStream("example.xlsx");
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();
}
}
}
使用 EasyExcel 库高效读取大文件
对于大型 XLSX 文件,EasyExcel 提供了内存友好的解决方案:
添加 EasyExcel 依赖(Maven 配置):
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<artifactId>3.3.2</artifactId>
</dependency>
使用监听器模式读取的示例:
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.read.listener.ReadListener;
public class LargeXLSXReader {
public static void main(String[] args) {
String fileName = "large_file.xlsx";
EasyExcel.read(fileName, DemoData.class, new ReadListener<DemoData>() {
@Override
public void invoke(DemoData data, AnalysisContext context) {
System.out.println("Processing: " + data);
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
System.out.println("All data processed");
}
}).sheet().doRead();
}
public static class DemoData {
private String column1;
private Integer column2;
// 添加 getter/setter 和 toString
}
}
处理日期和特殊格式
当 XLSX 中包含日期或自定义格式时,需要特殊处理:
// 在 Apache POI 中处理日期
if (cell.getCellType() == CellType.NUMERIC && DateUtil.isCellDateFormatted(cell)) {
System.out.print(cell.getDateCellValue() + "\t");
}
// 在 EasyExcel 中通过注解处理
public class DemoData {
@ExcelProperty("日期列")
@DateTimeFormat("yyyy-MM-dd")
private Date dateColumn;
}
性能优化建议
对于大数据量文件,采用流式读取方式减少内存消耗。Apache POI 提供了 SXSSFWorkbook:
Workbook workbook = new SXSSFWorkbook(new XSSFWorkbook(fis));
EasyExcel 本身采用流式解析,默认情况下内存占用较低,适合处理百万级数据。可以通过调整参数进一步优化:
EasyExcel.read(fileName)
.headRowNumber(2) // 跳过表头
.readCache(100) // 设置缓存行数
.sheet()
.doRead();






