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复杂表头导出(一对多)升级版,博客地址:

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

  • 16
    点赞
  • 92
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
对于复杂表头导出EasyExcel是一个非常方便的Java库。你可以按照以下步骤进行操作: 1. 导入EasyExcel依赖:在你的项目中,添加EasyExcel的Maven或Gradle依赖。 2. 创建表头样式:使用EasyExcel提供的样式类,如`com.alibaba.excel.write.style.column.SimpleColumnWidthStyleStrategy`,可根据列宽自动调整。你还可以自定义样式,如字体、颜色等。 3. 定义数据模型:创建一个Java类,用于表示导出数据的模型。每个字段对应一列数据。 4. 准备数据:从数据库或其他数据源获取要导出的数据,并将其封装到定义好的数据模型中。 5. 创建导出任务:使用EasyExcel提供的`com.alibaba.excel.EasyExcel.write()`方法创建一个导出任务。传入要导出的数据集合、要导出的数据模型类以及导出文件的路径。 6. 设置表头:使用EasyExcel提供的`com.alibaba.excel.write.metadata.style.WriteCellStyle`类,可以设置表头的样式。 7. 执行导出:调用导出任务的`sheet()`方法,设置表格名称和表头行数。然后调用`doWrite()`方法执行导出导出的过程是逐行写入,并自动处理分页和大数据量导出。 下面是一个示例代码片段,演示了如何使用EasyExcel导出复杂表头: ``` // 导出数据 List<YourDataModel> dataList = getDataFromDataSource(); // 创建导出任务 String exportFilePath = "path/to/export/file.xlsx"; ExcelWriter excelWriter = EasyExcel.write(exportFilePath, YourDataModel.class).build(); // 设置表头样式 WriteCellStyle headStyle = new WriteCellStyle(); // 设置样式属性,如字体、颜色等 // 执行导出 excelWriter.sheet().head(headStyle).doWrite(dataList); // 关闭资源 excelWriter.finish(); ``` 这样,你就可以使用EasyExcel实现复杂表头导出了。希望对你有帮助!如有更多问题,请继续提问。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值