EasyExcel复杂表头导入(一对多)
easyexcel
快速、简洁、解决大文件内存溢出的java处理Excel工具
项目地址:https://gitcode.com/gh_mirrors/ea/easyexcel
免费下载资源
·
一、前言
当前我使用过的导入导出框架有EasyPoi 和 EasyExcel,我用EasyPoi比较多。
EasyPoi 框架的导入导出功能,乃至复杂表头的导入导出,网上都有很多示例,我也写过几篇博客,其官方文档也很详细,功能强大。其官方文档地址经常访问不了,可以参考这个。
风铃开源文档-旧版 (afterturn.cn)https://opensource.afterturn.cn/doc/easypoi.html
EasyExcel 框架是阿里巴巴团队开发导入导出框架,相较而言,EasyExcel要轻量简单高效一些。网上的示例也相对较少,胜在官网稳定简洁。EasyExcel · 语雀 (yuque.com)https://www.yuque.com/easyexcel/doc/easyexcel最近,我在写EasyExcel框架的一对多的导入功能,官方文档和网上都没有详细的说明,搞了半天,在此记录一下。
说明:EasyExcel无法做到自动给我们处理成类里面嵌套List的效果,这就需要我们通过直接的方式先拿到数据,然后自行在service层处理。EasyPoi则有对应的注解和方法可以实现。
二、EasyExcel一对多导入实现
2.1 模板样式
2.2 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;
}
2.3 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层再做处理。
2.4 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();
}
EasyExcel复杂表头导出(一对多)升级版,博客地址:
GitHub 加速计划 / ea / easyexcel
31.64 K
7.47 K
下载
快速、简洁、解决大文件内存溢出的java处理Excel工具
最近提交(Master分支:3 个月前 )
c42183df
Bugfix 3 个月前
efa7dff6 * 重新加回 `commons-io`
3 个月前
更多推荐
已为社区贡献11条内容
所有评论(0)