easyexcel阿里java开源框架,导入excel数据
程序员文章站
2022-06-16 10:20:38
在项目实际开发过程中,我们一般需要数据的导入和导出,现在的产品都差不多,这些东西常见的。下面介绍用阿里巴巴的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的方法,给出了方法和步骤,代码示例都是实际操作中测试过的,以供参考。
来源:原创 转载请注明出处