1.解析Excel的方法中开启多个线程提高效率:
/**
* 解析Excel
*/
private void readExcel() {
// 使用线程池解析Excell内容
List<SysUser> list2 = new ArrayList<>();
ExecutorService executorService = null;
try {
// 初始化一个定长线程池对象
executorService = Executors.newFixedThreadPool(8);
ListeningExecutorService listeningExecutorService = MoreExecutors.listeningDecorator(executorService);
// 创建解析Excel的线程任务
ConCallable callable = new ConCallable();
ListenableFuture listenableFuture = listeningExecutorService.submit(callable);
Futures.addCallback(listenableFuture, new FutureCallback<List<SysUser>>() {
@Override
public void onSuccess(List<SysUser> sysUsers) {
// 将解析的结果sysUsers复制到list2;
list2.addAll(sysUsers);
}
@Override
public void onFailure(Throwable throwable) {
throw new BadRequestException("解析失败!");
}
});
} catch (Exception e) {
e.printStackTrace();
}finally {
// 关闭资源
executorService.shutdown();
}
}
2.解析Excel的线程任务类:
/**
* @author dangsl
* @description:解析Excel的任务线程
*/
public class ConCallable implements Callable{
@Override
public Object call() throws Exception {
try {
// 获取文件流
InputStream inputStream = new FileInputStream("C:/Users/54505/Desktop/原系统数据/健康-用户.xls");
// 获取Excell工作薄对象
// XSSFWorkbook workbook = new XSSFWorkbook(inputStream);
Workbook workbook = WorkbookFactory.create(inputStream);
// 获取所有的sheet页数量
int numberOfSheets = workbook.getNumberOfSheets();
List<SysUser> excellRows = new ArrayList<>();
for (int i = 0; i <numberOfSheets ; i++) {
// 遍历获取sheet页
Sheet sheet = workbook.getSheetAt(i);
for (int j = 1; j < sheet.getLastRowNum()+1; j++) {
Row row = sheet.getRow(j);
SysUser user=new SysUser();
for(int k=0;k<row.getLastCellNum()+1;k++){
Cell cell = row.getCell(k);
if (null != cell){
int cellType = cell.getCellType();
int cellTypeBlank = HSSFCell.CELL_TYPE_BLANK;// 空值
if (cellType != cellTypeBlank){
// 不为空值
switch (k){
case 0:
// openId
user.setOpenId(cell.getStringCellValue());
break;
case 1:
// 昵称
user.setNickName(cell.getStringCellValue());
break;
case 2:
// 手机
user.setMobile(cell.getStringCellValue());
user.setAccount(cell.getStringCellValue());
break;
case 4:
// 注册时间
Date dateCellValue = cell.getDateCellValue();
user.setCreateTime(dateCellValue);
break;
case 7:
// 推荐人手机
user.setRecommendId(cell.getStringCellValue());
break;
case 9:
// 真实姓名
user.setName(cell.getStringCellValue());
break;
case 10:
// 身份证
user.setIdCard(cell.getStringCellValue());
break;
default:
break;
}
}
}
}
excellRows.add(user);
}
}
return excellRows;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}