您觉得本文档还缺少什么内容?可以自己补充~
本项目采用了easy-poi来实现导入导出功能,easy-poi的详细使用请参考easy-poi官方文档。下面介绍本项目的二次封装:
后端实现导入
- PoiController 公共导入
 
@PostMapping(value = "/import")
default R<Boolean> importExcel(@RequestParam(value = "file") MultipartFile simpleFile, HttpServletRequest request,
                               HttpServletResponse response) throws Exception {
    ImportParams params = new ImportParams();
    params.setTitleRows(StrUtil.isEmpty(request.getParameter("titleRows")) ? 0 : Convert.toInt(request.getParameter("titleRows")));
    params.setHeadRows(StrUtil.isEmpty(request.getParameter("headRows")) ? 1 : Convert.toInt(request.getParameter("headRows")));
    List<Map<String, String>> list = ExcelImportUtil.importExcel(simpleFile.getInputStream(), Map.class, params);
    if (list != null && !list.isEmpty()) {
        return handlerImport(list);
    }
    return validFail("导入Excel无有效数据!");
}
- 参考用户导入
 
@Override
public R<Boolean> importExcel(@RequestParam("file") MultipartFile simpleFile, HttpServletRequest request,
                              HttpServletResponse response) throws Exception {
    ImportParams params = new ImportParams();
    params.setTitleRows(0);
    params.setHeadRows(1);
    params.setNeedVerify(true);
    params.setVerifyGroup(new Class[]{Default.class});
    // 下面的2个handler只能支持少量数据导入,因为每一条数据都会执行N次查询
    params.setVerifyHandler(excelUserVerifyHandler);
    params.setDictHandler(userExcelDictHandlerIImpl);
    ExcelImportResult<UserExcelVO> result = ExcelImportUtil.importExcelMore(simpleFile.getInputStream(), UserExcelVO.class, params);
    if (result.isVerifyFail()) {
        // 更加优雅的方式,应该是让用户下载错误的数据
        return R.validFail(result.getFailList().stream()
                .map(item -> StrUtil.format("第{}行检验错误: {}", item.getRowNum(), item.getErrorMsg()))
                .collect(Collectors.joining("<br/>")));
    }
    List<UserExcelVO> list = result.getList();
    if (list.isEmpty()) {
        return this.validFail("导入数据不能为空");
    }
    Set<String> accounts = new HashSet<>();
    List<User> userList = list.stream().map(item -> {
        ArgumentAssert.notContain(accounts, item.getAccount(), "Excel中存在重复的账号: {}", item.getAccount());
        accounts.add(item.getAccount());
        User user = new User();
        BeanUtil.copyProperties(item, user);
        user.setSalt(RandomUtil.randomString(20));
        user.setPassword(SecureUtil.sha256(BizConstant.DEF_PASSWORD + user.getSalt()));
        return user;
    }).collect(Collectors.toList());
    baseService.saveBatch(userList);
    return this.success(true);
}
- 实体类字段上标记@Excel注解
 
后端导出
@RequestMapping(value = "/export", method = RequestMethod.POST, produces = "application/octet-stream")
default void exportExcel(@RequestBody @Validated PageParams<PageQuery> params, HttpServletRequest request, HttpServletResponse response) {
    ExportParams exportParams = getExportParams(params);
    List<?> list = findExportList(params);
    Map<String, Object> map = new HashMap<>(7);
    map.put(NormalExcelConstants.DATA_LIST, list);
    map.put(NormalExcelConstants.CLASS, getExcelClass());
    map.put(NormalExcelConstants.PARAMS, exportParams);
    Object fileName = params.getExtra().getOrDefault(NormalExcelConstants.FILE_NAME, "临时文件");
    map.put(NormalExcelConstants.FILE_NAME, fileName);
    PoiBaseView.render(map, request, response, NormalExcelConstants.EASYPOI_EXCEL_VIEW);
}
后端导出预览
@RequestMapping(value = "/preview", method = RequestMethod.POST)
default R<String> preview(@RequestBody @Validated PageParams<PageQuery> params) {
    ExportParams exportParams = getExportParams(params);
    List<?> list = findExportList(params);
    Workbook workbook = ExcelExportUtil.exportExcel(exportParams, getExcelClass(), list);
    return success(ExcelXorHtmlUtil.excelToHtml(new ExcelToHtmlParams(workbook)));
}