1 Excel上传
针对Excel的上传,采用的是比较常规的方法,其实和文件上传是相同的。具体源码如下:
@PostMapping(value = "", consumes = "multipart
public abstract class XxlsAbstract extends DefaultHandler {
private SharedStringsTable sst;
private String lastContents;
private int sheetIndex = -1;
private List rowlist = new ArrayList<>();
public List
3 解析成功后的数据处理
首先我们将源码展示出来,然后再具体说明
public int addBlackLists(String file) throws ExecutionException, InterruptedException {
ArrayList> resultList = new ArrayList<>();
XxlsAbstract xxlsAbstract = new XxlsAbstract() {
//针对数据的具体处理
@Override
public void optRows(int sheetIndex, int curRow, List rowlist) {
if (this.willSaveAmount == 5000) {
//插入数据
List
针对上面的源码,我们可以发现,我们需要将读取到的EXCEL数据插入到数据库中,这里为了减小数据库的IO和提高插入的效率,我们采用5000一批的批量插入(注意:如果数据量过大会导致组成的SQL语句无法执行)。
这里需要获取到一个最终执行成功的插入结果,并且插入执行很慢。所有采用了Java多线程的Future模式,采用异步的方式最终来获取J执行结果。
通过上面的实现,楼主测试得到最终一百万条数据需要四分钟左右的时间就可以搞定。如果大家有更好的方法,欢迎留言。
补充知识:Java API SXSSFWorkbook导出Excel大批量数据(百万级)解决导出超时
之前使用简单的HSSFWorkbook,导出的数据不能超过
后来改成SXSSFWorkbook之后可以导出更多,但是
而且我之前的代码是一次性查出所有数据,几十万条,直接就超时了。
之前的代码是一次性查出所有的结果,list里面存了几十万条数据。因为功能设计的问题,我这一个接口要同时处理三个功能:
再加上查询SQL的效率问题,导致请求超时。
现在为了做到处更大量的数据只能选择优化。优化查询的sql这里就不讲了,只讲导出功能的优化。
其实就是分批次处理查询结果:
这样做的好处是查询速度变快,封装速度也变快,整体速度变快就不会出现超时,而且,每次分页查出的结果放到list中不会出现占用JVM内存过大的情况。避免出现内存溢出导致系统崩溃。
再次优化:
上面这样做虽然可以导出,但是代码看起来不美观:
这样看起来就简洁很多了。
经验证,查询加封装EXCEL7000条数据处理只需要1秒
以上这篇使用Springboot+poi上传并处理百万级数据EXCEL就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持考高分网。