Spring Boot通过EasyExcel异步多线程实现大数据量Excel导入,百万数据30秒
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.read.listener.ReadListener;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ExcelDataImporter {
private ExecutorService executorService = Executors.newFixedThreadPool(10); // 创建固定大小的线程池
public void importData(MultipartFile file) {
EasyExcel.read(file.getInputStream(), DataModel.class, new AsyncDataListener(executorService)).sheet().doRead();
}
private static class AsyncDataListener extends AnalysisEventListener<DataModel> {
private ExecutorService executorService;
public AsyncDataListener(ExecutorService executorService) {
this.executorService = executorService;
}
@Override
public void invoke(DataModel data, AnalysisContext context) {
executorService.submit(new DataImportTask(data));
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
// 所有数据解析完成后做的事情
executorService.shutdown(); // 关闭线程池
}
}
private static class DataImportTask implements Runnable {
private DataModel data;
public DataImportTask(DataModel data) {
this.data = data;
}
@Override
public void run() {
// 这里编写数据导入逻辑
// 例如:保存到数据库、进行业务处理等
}
}
// DataModel是你的数据模型类,应该与你的Excel文件列对应
public static class DataModel {
// 定义各个字段,例如:
// private String column1;
// private Date column2;
// 提供getter和setter方法
}
}
这个代码示例展示了如何使用EasyExcel库异步地读取Excel文件数据,并将数据导入到数据库中。通过使用线程池,可以有效地处理大量数据并减少处理时间。这个示例代码提供了一个简单的框架,你可以根据自己的需求对其进行扩展和修改。
评论已关闭