一、前言

当前我使用过的导入导出框架有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复杂表头导出(一对多)升级版,博客地址:

https://blog.csdn.net/qq_41057885/article/details/126411957

GitHub 加速计划 / ea / easyexcel
31.64 K
7.47 K
下载
快速、简洁、解决大文件内存溢出的java处理Excel工具
最近提交(Master分支:3 个月前 )
c42183df Bugfix 3 个月前
efa7dff6 * 重新加回 `commons-io` 3 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐