当前位置: 移动技术网 > IT编程>开发语言>Java > easyexcel阿里java开源框架,导入excel数据

easyexcel阿里java开源框架,导入excel数据

2020年07月29日  | 移动技术网IT编程  | 我要评论

在项目实际开发过程中,我们一般需要数据的导入和导出,现在的产品都差不多,这些东西常见的。下面介绍用阿里巴巴的easyexcel实现excel数据导入。

第一步:easyexcel的引入

当你要做excel的导入导出的需求的时候,你可能就想到的是用什么插件,baidu一搜,easyexcel介绍的文章就会出现,因为用的比较多。
Java领域解析、生成Excel比较有名的框架有Apache poi、jxl等。但他们都存在一个严重的问题就是非常的耗内存。如果你的系统并发量不大的话可能还行,但是一旦并发上来后一定会OOM或者JVM频繁的full gc。
在这样的一种场景下,EasyExcel就诞生了,这是阿里巴巴开源的一个excel处理框架,使用简单、节省内存,因此,也受到了很多公司和个人的喜爱。
使用maven项目的方式,使用easyexcel引入如下的依赖,比较新的版本


<dependency>
		<groupId>com.alibaba</groupId>
		<artifactId>easyexcel</artifactId>
		<version>2.2.6</version>
</dependency>
      第二步:开始导入


首先我们知道导入是从节目选择excel文件传到后台,所以在api的control方法需要接受文件的MultipartFile变量类型,如下的代码示例


@PostMapping("/importExcel")
@ApiOperation(value = "导入excle", notes = "一键导入", response = QueryVo.class)
public ApiResult<Integer> readExcel(@RequestParam("installer_file") MultipartFile excel, HttpServletRequest request,
		HttpServletResponse response) {

	int result = 0;
	try {

		result = excelService.importInstallerList(excel.getInputStream());

	} catch (Exception e) {
		e.printStackTrace();
		// 打印到日志文件中
		log.error("Internal error:" + e);
	}

	return ApiResult.ok(result);
}
      我们看到control接收了文件,传递文件流到service层处理了,下面是service层的代码示例,获取数据并调用插入的方法



@Override
public int importInstallerList(InputStream excel) {
	Map<String, Object> resultMap = new HashMap<String, Object>();

	int result = 0;
	try {

		// 读取数据
		List<Map<String, Object>> list = EasyExcel.read(excel).doReadAllSync();
		log.info("list:{},{},{}", list.get(0).get(0), list.get(0).get(1), list.get(0).get(2));
 
		List<ExcelModel> objList = new ArrayList();
		for (int i = 0; i < list.size(); i++) {
			ExcelModel model = new ExcelModel();
			model.setId(UUID.randomUUID().toString());
			model.setName(list.get(i).get(0).toString());
			model.setSex(list.get(i).get(1).toString());
		  
			objList.add(model);
		}
 
		result = excelMapper.insertFromExcel(objList);
	 
		return result;

	} catch (Exception e) {
		// TODO: handle exception
		e.printStackTrace();
	}
	return result;
}
      在使用mybatis框架操作数据库,我们定义insert的方法,注意我们使用一个批量的插入的方式,代码示例



insert into sup_ent_ebusiness (id,name,sex)
			 values
		<foreach collection="list" item="item" index="index" separator = ",">  
		
	(#{item.id},#{item.Name},#{item.sex})
</foreach>
      还有深入一点,当我们一次导入的excel文件数据量很多时,我们在服务层做一个分页插入的动作,这样提高程序效率



if (objList.size() > 999) {
	// 分批次插入
	int count = objList.size() / 999;

	// 分批次插入的集合
	List<List> subList = new ArrayList();

	for (int i = 1; i <= count; i++) {
		// 截取list集合 0 - 999
		subList.add(objList.subList((i - 1) * 999, i * 999));

		if (i == count && objList.size() % 999 != 0) {
			// 有999的余数
			subList.add(objList.subList(i * 999, objList.size() - 1));
		}
	}

	// 分批次插入
	for (List list2 : subList) {
		result += excelMapper.insertFromExcel(list2);
	}
}
      以上就是导入excel的方法,给出了方法和步骤,代码示例都是实际操作中测试过的,以供参考。


来源:移动技术网原创  转载请注明出处

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网