irpas技术客

EasyExcel复杂表头导入(一对多)_间歇性悲伤患者_easyexcel复杂表头

未知 1882

前言

当前我使用过的导入导出框架有EasyPoi 和 EasyExcel,我用EasyPoi比较多。

EasyPoi 框架的导入导出功能,乃至复杂表头的导入导出,网上都有很多示例,我也写过几篇博客,其官方文档也很详细,功能强大。其官方文档地址经常访问不了,可以参考这个。

风铃开源文档-旧版 (afterturn.cn)https://opensource.afterturn.cn/doc/easypoi.html

EasyExcel 框架是阿里巴巴团队开发导入导出框架,相较而言,EasyExcel要轻量简单高效一些。网上的示例也相对较少,胜在官网稳定简洁。EasyExcel · 语雀 (yuque.com)https://·/easyexcel/doc/easyexcel最近,我在写EasyExcel框架的一对多的导入功能,官方文档和网上都没有详细的说明,搞了半天,在此记录一下。

说明:EasyExcel无法做到自动给我们处理成类里面嵌套List的效果,这就需要我们通过直接的方式先拿到数据,然后自行在service层处理。EasyPoi则有对应的注解和方法可以实现。

EasyExcel一对多导入实现 模板样式

?Entity对象 @Data @ToString public class CustomerExcel implements Serializable { /** * 客户编号 */ @ExcelProperty(index = 0) private String customerCode; /** * 客户名称 */ @ExcelProperty(index = 1) private String customerName; /** * 客户所在地 */ @ExcelProperty(index = 2) private String address; /** * 联系人姓名 */ @ExcelProperty(index = 3) private String personName; /** * 联系电话 */ @ExcelProperty(index = 4) private String personPhone; /** * 联系人姓名及电话List * 这个是需要我们自己整理的,EasyExcel做不到 **/ @ExcelIgnore private List<Map<String, String>> contactsList; } Contorller 层 @PostMapping("/import") @ApiOperation("导入客户信息列表") @ApiImplicitParam(name = "file", value = "导入的Excel文件", dataType = "File", paramType = "form", required = true) public ResponseMsg importCustomer(@RequestParam(value = "file") MultipartFile file) throws Exception { InputStream inputStream = file.getInputStream(); List<CustomerExcel> list = EasyExcel.read(inputStream).headRowNumber(2).head(CustomerExcel.class).sheet().doReadSync(); ResponseMsg responseMsg = new ResponseMsg(); if (list == null || list.size() == 0) { responseMsg.setCode(MsgCode.Error.value()); responseMsg.setDesc("导入失败,没有读取到导入数据!"); return responseMsg; } else { // service层 return customerService.importCustomer(list); } } // 注意,我们在这里拿到的list数据是有问题,合并的单元格就一个单元格有数据,其他没有,所以需要在service层再做处理。

Service 层 /** * 导入客户基本信息 */ @Override public ResponseMsg importCustomer(List<CustomerExcel> list) { // 待保存到数据库的数据 List<CustomerExcel> data = new ArrayList<>(); // 客户信息 CustomerExcel customer = new CustomerExcel(); // 客户联系人信息 List<Map<String, String>> contactsList = new ArrayList<>(); for (CustomerExcel obj : list) { // 判断客户编号和客户名称是否为空 if (StringUtil.isNotBlank(obj.getCustomerCode()) && StringUtil.isNotBlank(obj.getCustomerName())) { // 联系人信息列表是否有数据,如果有则要把数据保存起来 if (contactsList.size() != 0) { customer.setContactsList(contactsList); data.add(customer); } // 重置客户和联系人列表对象 customer = new CustomerExcel(); contactsList = new ArrayList<>(); customer.setCustomerName(obj.getCustomerName()); customer.setCustomerCode(obj.getCustomerCode()); customer.setAddress(obj.getAddress()); Map map = new HashMap(4); map.put("name", obj.getPersonName()); map.put("phone", obj.getPersonPhone()); contactsList.add(map); // 如果客户编码和客户名称为空,则只拿联系人信息即可 } else { Map map = new HashMap(4); map.put("name", obj.getPersonName()); map.put("phone", obj.getPersonPhone()); contactsList.add(map); } } // 保存最后一条数据 if (contactsList.size() != 0) { customer.setContactsList(contactsList); data.add(customer); } // 保存,或做其他处理。 customerMapper.insertBatch(data); return new ResponseMsg(); }


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #easyexcel复杂表头 # #easyexcel