java 如何导入excel
导入Excel的常用方法
使用Apache POI库处理Excel文件是最常见的方式。POI支持.xls(HSSF)和.xlsx(XSSF)格式,需添加以下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>
读取Excel文件示例代码
处理.xlsx文件的代码示例:
try (FileInputStream file = new FileInputStream("input.xlsx");
Workbook workbook = new XSSFWorkbook(file)) {
Sheet sheet = workbook.getSheetAt(0);
for (Row row : sheet) {
for (Cell cell : row) {
switch (cell.getCellType()) {
case STRING -> System.out.print(cell.getStringCellValue() + "\t");
case NUMERIC -> System.out.print(cell.getNumericCellValue() + "\t");
case BOOLEAN -> System.out.print(cell.getBooleanCellValue() + "\t");
default -> System.out.print("UNKNOWN\t");
}
}
System.out.println();
}
} catch (IOException e) {
e.printStackTrace();
}
使用EasyExcel处理大数据量
对于大型Excel文件,推荐使用阿里开源的EasyExcel,其采用流式读取降低内存消耗。添加依赖:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.3.2</version>
</dependency>
监听器模式读取示例:
@Slf4j
public class DemoDataListener implements ReadListener<DemoData> {
@Override
public void invoke(DemoData data, AnalysisContext context) {
log.info("读取到数据: {}", data);
}
}
// 调用方式
EasyExcel.read("largeFile.xlsx", DemoData.class, new DemoDataListener()).sheet().doRead();
数据转换与校验
处理数据时建议进行类型校验:
public Object getCellValue(Cell cell) {
return switch (cell.getCellType()) {
case NUMERIC ->
DateUtil.isCellDateFormatted(cell) ?
cell.getDateCellValue() :
cell.getNumericCellValue();
case STRING -> cell.getStringCellValue().trim();
case BOOLEAN -> cell.getBooleanCellValue();
case FORMULA -> cell.getCellFormula();
default -> null;
};
}
异常处理建议
增加健壮性处理:
- 文件存在性检查:
Files.exists(Paths.get(filePath)) - 空单元格处理:
CellType.BLANK - 内存控制:对于大文件使用
SXSSFWorkbook或EasyExcel - 编码处理:明确指定文件编码格式
性能优化方案
大规模数据导入时:
- 采用分批次读取策略
- 使用事件驱动模型(如SAX解析器)
- 避免在内存中保留全部数据
- 考虑使用数据库批量插入操作
// 使用SXSSFWorkbook示例
try (SXSSFWorkbook workbook = new SXSSFWorkbook(100)) {
Sheet sheet = workbook.createSheet();
// 写入时自动刷新临时文件
for(int i=0; i<100000; i++){
Row row = sheet.createRow(i);
row.createCell(0).setCellValue("Data "+i);
if(i%100==0) {
((SXSSFSheet)sheet).flushRows(100);
}
}
}






