摘要:背景小白今天闲着没事,在公司摸鱼,以为今天有事无聊的一天,突然上头说小子,今天实现一下批量导入数据吧,当时我的内心是拒绝的,然后默默打开。介绍框架本身并不支持读取,所有读取需要借助一些框架。
1 背景
小白今天闲着没事,在公司摸鱼,以为今天有事无聊的一天,突然上头说小子,今天实现一下批量导入Excel数据吧,当时我的内心是拒绝的,然后默默打开idea。
2 介绍 2.1 框架java本身并不支持读取excel,所有读取excel需要借助一些框架。目前有几种方式,
1. Apache POI
2. Java Excel API
3. easyexcel
这里主要讲解的是 Apache POI,Apache POI支持03版以及07年版 区别是后缀不一样,03版对应的是xls 07版对应的是xlsx xlsx
这里主要讲解的是07版的
1.sheet表示的是
excel底部的工作表.
对应的是POI的的XSSFSheet
2.row表示的是行
对应的是POI的的XSSFRow
3.cell表示的是每一行的单元格.
对应的是POI的的Cell
3 源码 3.0 片段说明1.上传文件使用springboot的MultipartFile
对应
MultipartFile file
2.创建对象
XSSFWorkbook xssfWorkbook = new XSSFWorkbook(inputStream);
3.获取sheet(默认第一个)
XSSFSheet sheet = xssfWorkbook.getSheetAt(0);3.1 控制层源码
@RequestMapping("/import") public void importExcel(@RequestParam("file") MultipartFile file) throws Exception{ InputStream inputStream = file.getInputStream(); //07年的 不兼容之前 XSSFWorkbook xssfWorkbook = new XSSFWorkbook(inputStream); XSSFSheet sheet = xssfWorkbook.getSheetAt(0); //获取行数 int lastRowNum = sheet.getLastRowNum(); for (int i = 1; i <= lastRowNum; i++) { XSSFRow row = sheet.getRow(i); QuChannel quChannel = new QuChannel(); if (row.getCell(0) != null){ row.getCell(0).setCellType(XSSFCell.CELL_TYPE_STRING); quChannel.setChannel(row.getCell(0).getStringCellValue()); } if (row.getCell(1) != null){ row.getCell(1).setCellType(XSSFCell.CELL_TYPE_STRING); quChannel.setChannelName(row.getCell(1).getStringCellValue()); } if (row.getCell(2) != null){ row.getCell(2).setCellType(XSSFCell.CELL_TYPE_STRING); quChannel.setRemarks(row.getCell(2).getStringCellValue()); } if (row.getCell(3) != null){ quChannel.setChannelSource((int) row.getCell(3).getNumericCellValue()); } if (row.getCell(4) != null){ quChannel.setActivityType((int) row.getCell(4).getNumericCellValue()); } if (row.getCell(5) != null){ quChannel.setDeliveryTime(row.getCell(5).getDateCellValue()); } if (row.getCell(6) != null){ row.getCell(6).setCellType(XSSFCell.CELL_TYPE_STRING); quChannel.setOriginalLink(row.getCell(6).getStringCellValue()); } if (row.getCell(7) != null){ row.getCell(7).setCellType(XSSFCell.CELL_TYPE_STRING); quChannel.setSaLink(row.getCell(7).getStringCellValue()); } if (row.getCell(8) != null){ quChannel.setDeliveryMode((int) row.getCell(8).getNumericCellValue()); } if (row.getCell(9) != null){ quChannel.setCreateGroup((int) row.getCell(9).getNumericCellValue()); } if (row.getCell(10) != null){ row.getCell(10).setCellType(XSSFCell.CELL_TYPE_STRING); quChannel.setRemark(row.getCell(10).getStringCellValue()); } quChannelMapper.insert(quChannel); } }3.2 review
1.避免将sql写在for循环里面,改进的话可以创建一个列表list,将对象add进去,然后在循环外面进行批量插入
2.想要去重的话可以使用set的不能重复添加特性
3.注意excel的字段与类属性的对应关系,如果excel字段是string,但是累属性是整形的话,可以使用枚举类
暂时想到这么多 欢迎指教评论
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/74912.html
摘要:总结整个过程的难点在于获取文件对象,从数据中取值然后在按取出,这样我们就可以从后台上传文件,然后进行批量导入数据库,其他数据格式只需要改和中的数据字段就可以 第一篇(从django后台解析excel数据批量导入数据库) 文章会在github中持续更新 作者: knthony github 联系我 1.django 如何从后台上传excel中批量解析数据 要从django后台导入...
摘要:批量导入数据库思想之一页面上传表格后台解析表格的数据暂放数据结构中或自己看情况处理,再把里面的数据批量存入数据库。 批量导入数据库思想之一:页面上传excel表格后台解析excel表格的数据暂放数据结构中(list或Map,自己看情况处理),再把list里面的数据批量存入数据库。直接贴代码: 前端: 文件描述: ...
摘要:然后封面就一个一个下啦是不是很方便具体源代码在上有用的话记得星星 有时候会有这样的需求吧 有一个表格里面有一批数据需要批量生成封面我们在浏览器里可以批量生成比如 showImg(https://segmentfault.com/img/bV67kB?w=2308&h=996); 我们有这样一个表格需要生成图书封面 showImg(https://segmentfault.com/img...
摘要:并且在对的抽象中,每一行,每一个单元格都是一个对象。对支持使用官方例子需要继承,覆盖方法,每读取到一个单元格的数据则会回调次方法。概要Java对Excel的操作一般都是用POI,但是数据量大的话可能会导致频繁的FGC或OOM,这篇文章跟大家说下如果避免踩POI的坑,以及分别对于xls和xlsx文件怎么优化大批量数据的导入和导出。一次线上问题这是一次线上的问题,因为一个大数据量的Excel导出...
阅读 1261·2021-09-02 13:36
阅读 2713·2019-08-30 15:44
阅读 2970·2019-08-29 15:04
阅读 3191·2019-08-26 13:40
阅读 3641·2019-08-26 13:37
阅读 1170·2019-08-26 12:22
阅读 1001·2019-08-26 11:36
阅读 1212·2019-08-26 10:41