批量导入数据以用户为例[不贴数据库操作代码,都是简单的插入和查询操作自己写]

  • 1 导入依赖
  • 2 批量导入模板下载
  • 3 批量导入数据
    • 准备工作
    • 实现代码
    • 测试接口
  • 4 下载导入失败表格
  • 5 实体类
  • 6 常见错误
    • 1 easyexcel Create workbook failure

1 导入依赖

     <!--excel--><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.1.6</version></dependency><!--通用mapper--><dependency><groupId>tk.mybatis</groupId><artifactId>mapper-spring-boot-starter</artifactId><version>2.0.4</version></dependency>

2 批量导入模板下载

Result是通用返回类,这里就不贴了,不想写的话可以将返回结果类型改成String或对应的实体类,直接可以copy,无需改动,最多改一下实现层下载文件名
controller 层

@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {/*用户数据批量导入模板下载*/@GetMapping("/templateDownLoad")public Result<Object> templateDownLoad(HttpServletResponse response){return userService.templateDownLoad(response);}
}

service 层

public interface UserService {Result<Object> templateDownLoad(HttpServletResponse response);
}

service 实现层

@Slf4j
@Service
public class UserServiceImpl implements UserService {@Overridepublic Result<Object> templateDownLoad(HttpServletResponse response) {return responseTemplate(response);}private Result<Object> responseTemplate(HttpServletResponse response) {//路径资源ClassPathResource pathResource = new ClassPathResource("/template/用户数据批量导入模板.xlsx");try {InputStream inputStream = pathResource.getInputStream();//输出的文件名称,格式String fileName = URLEncoder.encode("userTemplate","UTF-8");response.setHeader("Content-disposition","attachment;filename="+fileName+".xlsx");//输出文件ExcelWriter writer = EasyExcel.write(response.getOutputStream()).withTemplate(inputStream).build();writer.finish();return Result.success();} catch (IOException e) {log.error("用户数据批量导入模板下载失败");return Result.fail("用户数据批量导入模板下载失败");}}
}

模板位置

浏览器测试

3 批量导入数据

准备工作

数据库表如图
ums_member_import_record 导入信息记录表
ums_member_import_detail 细明表
ums_member 用户信息表

excel模板内容如图

实现代码

复制添加到之前对应的类中即可
controller层

 @PostMapping("/excelUpload")public Result<Object> excelUpload(MultipartFile file){return userService.upload(file);}

service层

 Result<Object> upload(MultipartFile file);

service实现层

 @Overridepublic Result<Object> upload(MultipartFile file) {return excelUpload(file);}private Result<Object> excelUpload(MultipartFile file) {//用于重命名上传的文件SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");String filePath;String filename;String newFilename;//上传文件保存路径String savePath = "D:\\home\\user\\excel";if (file!=null&&!file.isEmpty()){filename = file.getOriginalFilename();String sub = filename.split("\\.")[0];String end = filename.split("\\.")[1];log.debug(end);if (end.equals("xlsx")||end.equals("xls")){//重命名上传文件newFilename = sub+"_"+format.format(new Date())+end;filePath = savePath + "\\"+ newFilename;//如果父文件夹不存在就创建File newFile = new File(filePath);if (!newFile.getParentFile().exists()){if (newFile.getParentFile().mkdirs()){log.debug("文件夹创建成功");}else {return Result.fail("文件夹创建失败");}}try {//存储上传的文件file.transferTo(newFile);} catch (IOException e) {//log.error("文件上传失败");return Result.fail("文件上传失败");}//此处应该还有一个操作人id的,即登录者的userId,这里是测试接口暂且不用UserImportRecord record = UserImportRecord.builder().fileName(filename).newFileName(newFilename).createTime(new Date()).build();//返回记录生成的id,以便后续下载导入失败数据,没用通用mapper//即要返回插入的自增id作为record iduserImportRecordMapper.insertRecord(record);ExcelLister<UserTemplate> lister = new ExcelLister<>();ExcelReader reader = EasyExcel.read(filePath,UserTemplate.class,lister).build();ReadSheet sheet = EasyExcel.readSheet(0).build();reader.read(sheet);List<Object> list = lister.getDataList();if (CollectionUtils.isEmpty(list))return Result.fail("请按模板导入数据");int failNum =0;for(Object data : list){UserImportFail fail = new UserImportFail();UserImportDetail detail = new UserImportDetail();UserTemplate template = (UserTemplate) data;//安字段名赋值BeanUtils.copyProperties(template,detail);detail.setRecordId(record.getId());//设置状态1-成功,2-失败detail.setStatus(1);//效验数据,失败的不导入if(!checkImportData(template,fail)){failNum++;detail.setStatus(2);detail.setReason(fail.getReason());detail.setCreateTime(new Date());userImportDetailMapper.insertSelective(detail);continue;}User user = new User();BeanUtils.copyProperties(template,user);//设置默认密码,要加密的自己写//user.setPassword(encode("123456"));user.setPassword("123456");user.setStatus(1);user.setLevel(1);//user.setIcon(defaultUrl);user.setCreateTime(new Date());try {userMapper.insertSelective(user);} catch (Exception e) {log.error("用户数据插入失败:{}",e.toString());failNum++;detail.setStatus(2);detail.setReason("账号生成失败");userImportDetailMapper.insertSelective(detail);}userImportDetailMapper.insertSelective(detail);}record.setAllNum(list.size());record.setFailNum(failNum);record.setSucceedNum(list.size()-failNum);record.setCreateTime(new Date());userImportRecordMapper.updateByPrimaryKeySelective(record);UserImportRecordDto recordDto = new UserImportRecordDto();BeanUtils.copyProperties(record,recordDto);return Result.success(recordDto);}else {return Result.fail("请上传excel文件");}}else {return Result.fail("文件不能为空");}}//效验数据,根据需求自己更改private boolean checkImportData(UserTemplate template, UserImportFail fail) {BeanUtils.copyProperties(template,fail);if(isEmpty(template.getUsername())){fail.setReason("用户名不能为空");return false;}if(isEmpty(template.getName())){fail.setReason("姓名不能为空");return false;}if(isEmpty(template.getPhone())){fail.setReason("手机号不能为空");return false;}if(isEmpty(template.getGender())){fail.setReason("姓别不能为空");return false;}if(isEmpty(template.getCity())){fail.setReason("所在地不能为空");return false;}if(isEmpty(template.getBirthday())){fail.setReason("生日不能为空");return false;}Example e = new Example(User.class);e.createCriteria().andEqualTo("username",template.getUsername());int count = userMapper.selectCountByExample(e);if (count > 0){fail.setReason("用户名已注册");return false;}e = new Example(User.class);e.createCriteria().andEqualTo("phone",template.getPhone());count = userMapper.selectCountByExample(e);if (count > 0){fail.setReason("手机号已绑定");return false;}return true;}private boolean isEmpty(String str){return str == null || str.trim().equals("");}

测试接口

测试数据共30个数据,预计失败8个

使用posman 测试

结果符合预期结果

4 下载导入失败表格

controller层

 @GetMapping("/failUploadDownload/{code}")public Result<Object> failUploadDownload(@PathVariable("code")String code,HttpServletResponse response){return userService.failUploadDownload(code,response);}

service层

Result<Object> failUploadDownload(String code,HttpServletResponse response);

service实现层

 @Overridepublic Result<Object> failUploadDownload(String code, HttpServletResponse response) {Example example = new Example(UserImportDetail.class);example.createCriteria().andEqualTo("status",2);example.createCriteria().andEqualTo("recordId",code);List<UserImportDetail> userImportDetails = userImportDetailMapper.selectByExample(example);try {ClassPathResource resource = new ClassPathResource("/template/导入失败模板.xlsx");String filename  = URLEncoder.encode("result","UTF-8");response.setHeader("Content-disposition","attachment;filename="+filename+".xlsx");ExcelWriter writer = EasyExcel.write(response.getOutputStream()).withTemplate(resource.getInputStream()).build();writer.fill(userImportDetails,EasyExcel.writerSheet(0).build());writer.finish();return Result.success();} catch (Exception e) {log.error("下载导入结果失败:{}",e.toString());return Result.fail("下载导入结果失败");}}

模板位置及内容

浏览器测试下载

下载结果
与预期结果相同,excel 批量导入数据到此基本完成

5 实体类

User

@Data
@Table(name = "ums_member")
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String username;private String password;private String name;private String phone;private Integer status;@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")private Date createTime;private String icon;private String gender;@JsonFormat(pattern = "yyyy-MM-dd")private Date birthday;private String city;private Integer level;
}

UserImportRecordDto 插入结果返回信息

@Data
public class UserImportRecordDto {/*返回该次导入记录号*/private Long id;//总数private Integer allNum;//成功数量private Integer succeedNum;//失败数量private Integer failNum;}

UserImportDetail 详细实体类

@Data
@Table(name = "ums_member_import_detail")
public class UserImportDetail {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private String id;@Column(name = "record_id")private Long recordId;@Column(name = "username")private String username;@Column(name = "name")private String name;@Column(name = "phone")private String phone;@Column(name = "gender")private String gender;@Column(name = "birthday")private String birthday;@Column(name = "city")private String city;@Column(name = "status")private Integer status;@Column(name = "reason")private String reason;@Column(name = "create_time")private Date createTime;@Column(name = "update_time")private Date updateTime;}

UserImportFail 失败实体类

@Data
public class UserImportFail {private String username;private String name;private String phone;private String gender;private String birthday;private String city;private String status;private String reason;
}

UserImportRecord 导入记录实体类

@Data
@Builder
@Table(name = "ums_member_import_record")
public class UserImportRecord implements Serializable{private static final long serialVersionUID = 447595778318537938L;@Id@Column(name = "id")private Long id;@Column(name = "user_id")private Long userId;@Column(name = "file_name")private String fileName;@Column(name = "new_file_name")private String newFileName;@Column(name = "all_num")private Integer allNum;@Column(name = "succeed_num")private Integer succeedNum;@Column(name = "fail_num")private Integer failNum;@Column(name = "fail_file_name")private String failFileName;@Column(name = "create_time")private Date createTime;@Column(name = "update_time")private Date updateTime;}

UserTemplate excel获取模版实体类

@Data
public class UserTemplate {@ExcelProperty(index = 0)private String username;@ExcelProperty(index = 1)private String name;@ExcelProperty(index = 2)private String phone;@ExcelProperty(index = 3)private String gender;@ExcelProperty(index = 4)private String birthday;@ExcelProperty(index = 5)private String city;}

6 常见错误

1 easyexcel Create workbook failure

解决方法
在配置文件中添加

         <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-resources-plugin</artifactId><configuration><nonFilteredFileExtensions><nonFilteredFileExtension>xls</nonFilteredFileExtension><nonFilteredFileExtension>xlsx</nonFilteredFileExtension></nonFilteredFileExtensions></configuration></plugin>

Spring Boot 实现excel 批量导入数据(模板下载 ->数据导入->导入失败表格下载)相关推荐

  1. Spring boot读取Excel并存入PG数据库(一)

    Spring boot读取Excel并存入PG数据库(一) 目录 一.前言 二.项目需求 三.数据库表设计 四.代码实现和测试 五.总结 一.前言 进入9月以来,一直忙于项目,特别是临近国庆节这半个月 ...

  2. Spring Boot 操作 Excel

    Spring Boot 操作 Excel 1 新建 Spring Boot Maven 示例工程项目 2 依赖引入 Pom.xml 3 操作 Excel 3.1 创建 Workbook 3.2 创建工 ...

  3. 猿创征文 | 微服务 Spring Boot 整合Redis 实战开发解决高并发数据缓存

    文章目录 一.什么是 缓存? ⛅为什么用缓存? ⚡如何使用缓存 二.实现一个商家缓存 ⌛环境搭建 ♨️核心源码 ✅测试接口 三.采用 微服务 Spring Boot 注解开启缓存 ✂️@CacheEn ...

  4. Spring Boot 通过Restful API,在PostMan 中返回数据

    Spring Boot 通过Restful API,在PostMan 中返回数据 资源组 新增 POST/resource_group/ad 请求体:格式:from-data参数:groupName= ...

  5. PSD分层立体数据模板立体数据统计素材

    PSD分层格式的好素材,可以轻松创建所需的所有不同统计图.以百分比或原始值的形式输入数据.控制尺寸,厚度,位置,旋转,颜色和透明度.自动生成颜色样本和关键字匹配的图表,移动和定位他们. 更多的设计素材 ...

  6. 使用Vue+Spring Boot实现Excel上传

    写在最前 在上期教程中我们介绍了读写Excel与使用Selenium的入门方法,本期将介绍通过Vue+Spring Boot实现在WebApp中上传Excel导入测试脚本的功能.使用前后端分离的技术是 ...

  7. Spring boot基于itext实现定制化模板pdf生成功能

    最近被安排公司项目的一个活:根据给定的模板生成pdf,很多公司的项目涉及这种xxx单的生成,我这里是个检查单的生成,具体内容下面给出,和各位csdner一起分享学习一下,如有不对多多指教. 首先先看下 ...

  8. spring boot中Excel文件下载踩坑大全

    项目场景:Spring boot文件下载 调用接口下载spring boot工程的resources目录下的excel模板文件,非常常见的一个文件下载功能,但是却容易遇到很多坑,下面总结记录下. 问题 ...

  9. Spring Boot 最佳实践(四)模板引擎Thymeleaf集成

    ## 一.Thymeleaf介绍 Thymeleaf是一种Java XML / XHTML / HTML5模板引擎,可以在Web和非Web环境中使用.它更适合在基于MVC的Web应用程序的视图层提供X ...

最新文章

  1. Nature子刊:宏基因组组装基因组实现谱系解析
  2. python能参加奥赛吗-盘点 | 国内含金量高有助于升学的编程竞赛大全,家长必读!...
  3. 确定需要改变几个位,才能将整数A转变为整数B
  4. 搜狗词库爬虫(2):基础爬虫框架的运行流程
  5. Hbase 2.0 RegionObserver使用
  6. 软件测试 学习之路 CSS (三)
  7. API经济正在牵制技术的改革
  8. 微服务架构师的道、法、术
  9. 第1章第26节:如何通过幻灯片母版统一管理相同类型的幻灯片2 [PowerPoint精美幻灯片实战教程]
  10. Elasticsearch的关键词搜索
  11. 室外用计算机,室外气候计算工具
  12. java中valueof_JAVA中intValue()和ValueOf()什么意思,还有Value什么意思
  13. Docker磁盘空间使用分析与清理
  14. XCOM2中敌对生物设计分析(Aliens篇)
  15. vue2 typescript 项目 如何引入antd -ui组件
  16. java开发工程师面试自我介绍_Java程序员如何进行自我介绍
  17. 关于数据的封包发送和拆包使用
  18. ERP系统方案的实施步骤
  19. Qt Creator5.7安卓开发环境搭建
  20. 数据库连接工厂错误原因分析

热门文章

  1. 九月游戏公司面试总结
  2. ALPHA_101因子(26_50)
  3. oracle 11g r2 rac +openfiler 2.99 +centos 6.5+vbox
  4. 性能比较好的蓝牙耳机,2023质量最好的蓝牙耳机排行榜推荐
  5. CreateWindow用法
  6. php 获取 ip地址_PHP 获取ip地址的六种方法
  7. 拼图小游戏Java简易版
  8. word设置默认字体_如何在Word中设置默认字体
  9. 品牌百度百科词条创建方法是什么?品牌百科怎么创建?
  10. H5视频播放器开发-画中画