有一天下午突然收到销售助理给反馈的问题,明明列表中有115300条数据,但是用下载按钮下载的Excel表格只有10000条数据。奇怪了,怎么会出现这种情况。
1、找根源
由于是老项目,先从前端页面找,F12浏览器查看JS源码,下载是采用js的ajax请求,点击浏览器调试模式中的网络重新运行下载,仔细检查请求的json参数,发现参数跟列表完全一致,没有问题,这是几年前的老项目了,这可怎么办,只能打开老项目来查看源码了。费劲打开项目,找到列表页面中的下载按钮,查看js中的ajax请求的文件及方法名称,找到方法后发现也没有问题,按F5进入调试模式,第一次调试结果显示参数正确,第二次调试发现有个pagesize=10000的参数,原来下载的方法跟列表的方法用的是同一个,可能是前辈为了工作效率,直接把分页的条数写成10000条,原来的数据可能不超过10000,终于找到原因了,接下来考虑怎么优化了。
2、优化
方案一,直接把pagesize的值改成100万,这种做法改起来很快,但是给后面的开发者挖了一个坑,不推荐这样做;性能测了一下,导出用了25秒。
方案二,可以把每次下载的内容用文件缓存起来,文件名可以通过下载的搜索条件MD5,如果下次下载同样搜索条件的就判断文件是否存在,这种做法的优点是下载速度快,缺点是如果数据是可变数据就会造成数据不准确,数据发生变化如何更新是个问题。
方案三,可以用分页的方法一页一页的取出数据,然后再组装成一个集合,传递给Excel组件NPOI导出。这样做的优点是按照分页导出速度快,缺点是要写分页的算法,并且不知道具体的页数。
最终选择了方案三,用while循环,不用知道具体多少数据,通过计算最后一页如果小于每页数量或者为0就停止循环。代码如下:

实验了一下,5秒导出数据,效率得到明显提升。
结语
如果你有更加优秀的方法,欢迎留言讨论。

腾讯云福利 :
爆款2核2G云服务器首年50元,2G2核5M云服务器259元/3年
链接:https://curl.qcloud.com/1VVs7OBH
关注公众号:DotNet开发跳槽