欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-08 15:10:09
在项目实际开发过程中,我们一般需要数据的导入和导出,现在的产品都差不多,这些东西常见的。下面介绍用阿里巴巴的easyexcel实现excel数据导入...

在项目实际开发过程中,我们一般需要数据的导入和导出,现在的产品都差不多,这些东西常见的。下面介绍用阿里巴巴的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的方法,给出了方法和步骤,代码示例都是实际操作中测试过的,以供参考。


来源:原创  转载请注明出处