Java 多线程解析Excel

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;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_40074764/article/details/80187403