vue excel导出之后时间格式不一样_ef+Npoi导出百万行excel之踩坑记

精品推荐

  • 国内稀缺优秀Java全栈课程-Vue+SpringBoot通讯录系统全新发布!

  • Docker快速手上视频教程(无废话版)【免费】

作者:~小菜鸟

转载自:

https://www.cnblogs.com/qqljcn/p/11917768.html

  最近在做一个需求是导出较大的excel,本文是记录我在做需求过程中遇到的几个问题和解题方法,给大家分享一下,一来可以帮助同样遇到问题的朋友,二呢,各位大神也许有更好的方法可以指点小弟一下,让我顺便学习一下。

背景::工头:“小钟啊,xx界面加个导出excel功能03以后的格式,需要能支持到excel的最大行,同时需要5个并发就行”

我:“收到,但是数据大的时候速度可能比较慢。”

工头:“你先做后续客户反馈了在给他加进度条。”

Npoi神器介绍:SXSSFWorkbook 专门用来导出大数据用,他会把数据先写入C盘的临时目录;不会所有 都留在内存里;更详细介绍请百度或者参考(http://poi.apache.org/components/spreadsheet/how-to.html#sxssf)

有了这层基础开始劈里啪啦一段操作写代码;(以下代码非生产代码只是我为了帖子写重现问题的测试代码)

首先开个线程模拟并发

b6882e47e6276894592a703398711f62.png

编写导出方法:记录时间、创建SXSSFWorkbook 代码如图:

b9e8096ad76a407d8539f331db8b0609.png

启动运行;

68cc2cb19ba2fe56d65a4733cee3f4d3.png

好!第一口锅已造好,看这个提示,前面说了SXSSFWorkbook 是会先把缓存数据写入Windows临时文件里头的,这个目录正好是Windows的临时文件夹虽然是个错误但是验证了刚刚的说法;至于这个错误看提示 我们有个大胆的想法是文件占用问题,应该是创建文件的时候文件已经存在了,这样我们把npoi的dll打开来看看,通过看源码和各种f12我们看到了这么一段代码

8e1ce7a50ef3e69ccd3ac49094d47041.png

这里看到用来随机数,而我们知道net的随机数在极短的时间内生成是不可靠的(详见百度或者:

https://docs.microsoft.com/zh-cn/dotnet/api/system.random.-ctor?f1url=https%3A%2F%2Fmsdn.microsoft.com%2Fquery%2Fdev16.query%3FappId%3DDev16IDEF1%26l%3DZH-CN%26k%3Dk(System.Random.%2523ctor);k(TargetFrameworkMoniker-.NETFramework,Version%3Dv4.0);k(DevLang-csharp)%26rd%3Dtrue&view=netframework-4.8)也就是说生成一样的文件名,然后我们在通过 github里可以看到

c0b2b0970a63f2fbe7e75f91d9dfbdfd.png

早在年初NPOI就对这个问题做了更改就换成guid了,随后我来到了nuget

e388107b083bed92df26ae73bc79d889.png

nuget最新版 是去年12月份发布,并没有包含上面的更改;

所以呢 要么github下载最新版编译要么自己解决,想了想如果换版本的话以前的功能可能会影响到所以,我们就在外面加一把小锁吧!如图

91e13171bbbda00ae956e9b8393d7801.png

0e1b7912575135a01374c9d077397ba1.png

这样呢我们在试试!

7431ccda135681748f507eef8a373dee.png

很好 不会在出现文件占用问题了;好继续导出!

既然是都先写入缓存文件是不是占用的内存就很小了 来看看

caf14dfcaea546e180d12d25c5818719.png

2G多。。。什么情况,还在涨

92ec0e85fbb90a2f449285b8e31a7201.png

3G。。。这明显不符合工头的需求了,然后终于它炸了

24649a87f70eef02e91224e58952436c.png

第一念头是为啥我该怎么办,设置GC的回收模式?手动多GC?还是要把代码给拿下来看看,看看这么大内存哪里没释放文件?冷静、冷静、想想,既然是内存爆了 那么正确流程应该是抓取看看是什么吃的内存得出结果再去改东西,

3f215899a57d0925c6d8ed8ac42c00d5.png

发现了啥是不是很熟悉的东西?状态管理、包装类,想到了啥 EF的“模型跟踪”这个功能占用的内存最大了。那就去掉吧 加上这么一句 意思是无跟踪查询 ,修改实例后SaveChanges不对对它生效;

3998571bedc45cb02794077c9fb9e03b.png

(AsNoTracking 更详情理解介绍请百度在加上msdn:https://docs.microsoft.com/zh-cn/ef/ef6/querying/no-tracking?redirectedfrom=MSDN )

现在在继续导出看看:

c0dbc6bf5460937d9e2023c83a00dbbd.png

内存是吃的不大了,

2bdeac0b8d7fb7529343224f31d80db8.png

可以看出临时文件还是很大的,这还没导完呢,所以做的时候 尽量要保证下硬盘的空间!

等待。。。

总结:

1.导出大数据用SXSSFWorkbook

2.构建SXSSFWorkbook 时候lock或者自己编译最新版本

3.我们做导出时,ef查询数据后记得加AsNoTracking 关闭绑定跟踪。(以后日常开发中如果只需要查询的也可以这样做)

4.SXSSFWorkbook 导出大数据 临时文件夹所在的硬盘不能太小 因为会生成大于excel本身的缓存文件!

016d80fcfa3f967003b22a207ee922f8.png

fbad1e782731b3536ce195fcb9f80f01.png

93580ed350c5b99af4429d933c454a90.png

最后导出完毕

12d3cdba37b03f7f067cf38f486dcb52.png

用时:

5e2c18477d515e92e68ac4fd271da81e.png

e3e92e722f9d54b4d364aba32720dd14.png

已标记关键词 清除标记
表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
相关推荐
<p> <b><span style="background-color:#FFE500;">【超实用课程内容】</span></b> </p> <p> <br /> </p> <p> <br /> </p> <p> 本课程内容包含讲解<span>解读Nginx的基础知识,</span><span>解读Nginx的核心知识、带领学员进</span>高并发环境下的Nginx性能优化实战,让学生能够快速将所学融合到企业应用中。 </p> <p> <br /> </p> <p style="font-family:Helvetica;color:#3A4151;font-size:14px;background-color:#FFFFFF;"> <b><br /> </b> </p> <p style="font-family:Helvetica;color:#3A4151;font-size:14px;background-color:#FFFFFF;"> <b><span style="background-color:#FFE500;">【课程如何观看?】</span></b> </p> <p style="font-family:Helvetica;color:#3A4151;font-size:14px;background-color:#FFFFFF;"> PC端:<a href="https://edu.csdn.net/course/detail/26277"><span id="__kindeditor_bookmark_start_21__"></span></a><a href="https://edu.csdn.net/course/detail/27216">https://edu.csdn.net/course/detail/27216</a> </p> <p style="font-family:Helvetica;color:#3A4151;font-size:14px;background-color:#FFFFFF;"> 移动端:CSDN 学院APP(注意不是CSDN APP哦) </p> <p style="font-family:Helvetica;color:#3A4151;font-size:14px;background-color:#FFFFFF;"> 本课程为录播课,课程永久有效观看时长,大家可以抓紧时间学习后一起讨论哦~ </p> <p style="font-family:"color:#3A4151;font-size:14px;background-color:#FFFFFF;"> <br /> </p> <p class="ql-long-24357476" style="font-family:"color:#3A4151;font-size:14px;background-color:#FFFFFF;"> <strong><span style="background-color:#FFE500;">【学员专享增值服务】</span></strong> </p> <p class="ql-long-24357476" style="font-family:"color:#3A4151;font-size:14px;background-color:#FFFFFF;"> <b>源码开放</b> </p> <p class="ql-long-24357476" style="font-family:"color:#3A4151;font-size:14px;background-color:#FFFFFF;"> 课件、课程案例代码完全开放给你,你可以根据所学知识,自修改、优化 </p> <p class="ql-long-24357476" style="font-family:"color:#3A4151;font-size:14px;background-color:#FFFFFF;"> 下载方式:电脑登录<a href="https://edu.csdn.net/course/detail/26277"></a><a href="https://edu.csdn.net/course/detail/27216">https://edu.csdn.net/course/detail/27216</a>,播放页面右侧点击课件进资料打包下载 </p> <p> <br /> </p> <p> <br /> </p> <p> <br /> </p>
©️2020 CSDN 皮肤主题: 1024 设计师:白松林 返回首页