Java Excel 数据导入指南
在Java中导入Excel数据,有多种方法可以实现,以下是几种常用的方案:

使用Apache POI库
Apache POI是最流行的Java操作Excel的库,支持.xls和.xlsx格式。
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>
基本示例代码
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class ExcelImporter {
public static List<String[]> readExcel(String filePath) throws IOException {
List<String[]> dataList = new ArrayList<>();
try (FileInputStream fis = new FileInputStream(filePath);
Workbook workbook = new XSSFWorkbook(fis)) {
Sheet sheet = workbook.getSheetAt(0); // 获取第一个工作表
DataFormatter dataFormatter = new DataFormatter();
for (Row row : sheet) {
String[] rowData = new String[row.getLastCellNum()];
for (Cell cell : row) {
rowData[cell.getColumnIndex()] = dataFormatter.formatCellValue(cell);
}
dataList.add(rowData);
}
}
return dataList;
}
public static void main(String[] args) {
try {
List<String[]> data = readExcel("data.xlsx");
for (String[] row : data) {
System.out.println(String.join(", ", row));
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
使用EasyExcel
EasyExcel是阿里巴巴开源的Excel处理库,性能更好,内存占用更低。
Maven依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.1.1</version>
</dependency>
基本示例代码
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import java.util.ArrayList;
import java.util.List;
public class EasyExcelImporter {
public static void main(String[] args) {
String fileName = "data.xlsx";
List<UserData> data = new ArrayList<>();
EasyExcel.read(fileName, UserData.class, new AnalysisEventListener<UserData>() {
@Override
public void invoke(UserData data, AnalysisContext context) {
// 处理每一行数据
System.out.println("解析到一条数据:" + data);
this.dataList.add(data);
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
// 所有数据解析完成后的操作
System.out.println("所有数据解析完成!");
}
}).sheet().doRead();
}
// 定义实体类
public static class UserData {
@ExcelProperty("姓名")
private String name;
@ExcelProperty("年龄")
private Integer age;
@ExcelProperty("邮箱")
private String email;
// getters and setters
}
}
使用JXL库
JXL是一个轻量级的Excel操作库,但只支持.xls格式。
Maven依赖
<dependency>
<groupId>net.sourceforge.jexcelapi</groupId>
<artifactId>jxl</artifactId>
<version>2.6.12</version>
</dependency>
基本示例代码
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class JxlExcelImporter {
public static List<String[]> readExcel(String filePath) throws IOException, BiffException {
List<String[]> dataList = new ArrayList<>();
Workbook workbook = Workbook.getWorkbook(new File(filePath));
Sheet sheet = workbook.getSheet(0);
for (int i = 0; i < sheet.getRows(); i++) {
String[] rowData = new String[sheet.getColumns()];
for (int j = 0; j < sheet.getColumns(); j++) {
rowData[j] = sheet.getCell(j, i).getContents();
}
dataList.add(rowData);
}
workbook.close();
return dataList;
}
}
处理大数据量Excel
对于大数据量Excel,建议使用EasyExcel的SAX模式(流式读取):

public void largeDataRead() {
String fileName = "large_data.xlsx";
// 使用监听器模式读取
EasyExcel.read(fileName, LargeData.class, new PageReadListener(dataList -> {
// 每次读取1000条数据
for (LargeData data : dataList) {
// 处理数据
}
})).sheet().doRead();
}
常见问题处理
-
日期格式处理:
Cell cell = row.getCell(0); if (cell.getCellType() == CellType.NUMERIC && DateUtil.isCellDateFormatted(cell)) { Date date = cell.getDateCellValue(); // 处理日期 } -
空值处理:
if (cell == null || cell.getCellType() == CellType.BLANK) { return ""; } -
性能优化:
- 对于大文件,使用EasyExcel的流式读取
- 避免在循环中创建对象
- 使用try-with-resources确保资源释放
选择哪种方法取决于你的具体需求,如文件格式、性能要求、代码简洁性等,对于新项目,推荐使用EasyExcel,它提供了更好的性能和更简洁的API。

