Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
天在微信群里聽到老牌Excel開發(fā)利器NPOI的作者瞿總說4.6.1版本的NPOI已經(jīng)支持.NET Standard 2.0了,這也就意味著你可以在.NET Core中使用NPOI了。
寫在前面
曾經(jīng)的.NET Framework時(shí)代就很喜歡使用這個(gè)組件來對(duì)Excel的進(jìn)行操作,可是隨著.NET Core時(shí)代的到來以及NPOI不支持.NET Core所以就找到了園子里的大神楊曉東對(duì)NPOI的.NET Core的移植版,可是使用的過程中的如果對(duì)這個(gè)移植的插件進(jìn)行深入的使用的話還是有部分問題,可能正如楊曉東大神自己所說:“去年的那個(gè)版本是針對(duì)于 .NET Core 1.0 的,從發(fā)布截止現(xiàn)在在 NuGet 大概有 2K 多的下載量,說明還是有很多同學(xué)在使用 NPOI 的,社區(qū)中也得到了很多同學(xué)的推廣。 但是上一個(gè)移植的版本也有諸多缺陷和 bug,在 Github 上也收到了一些 Issue 進(jìn)行反饋,很多 Bug 可能是移植過程中的bug,但是對(duì)于這些 Bug 可能我也無能為力,因?yàn)?NPOI 的代碼是非常龐大和復(fù)雜的。”
不過也再次特別感謝下楊曉東大神對(duì)NPOI的.NET Core版本的移植也才能讓我們?cè)?NET Core1.0以及.NET Core2.0的一段時(shí)間內(nèi)繼續(xù)使用這個(gè)NPOI。
有興趣的小伙伴可以看下楊曉東大神的版本這里是介紹《NET Core 2.0 開源Office組件 NPOI》
因此在得知NPOI的作者瞿總已經(jīng)完成對(duì)NPOI的升級(jí)并支持.NET Standard 2.0后特此把這個(gè)好消息告訴全體.NET Core開發(fā)者們。自此我們又可以盡情的在.NET Core中繼續(xù)使用這個(gè)開源的老牌Office組件了!反正我表示挺開心的!而且如果你在使用的過程中有任何問題都可以在GitHub上對(duì)作者提issue,作者也會(huì)以迅雷不及掩耳之勢(shì)之勢(shì)進(jìn)行修復(fù)
什么是NPOI
說了半天NPOI已經(jīng)可以在.NET Core中使用了,可能對(duì)于新手朋友還是不知道這玩意究竟是什么?其實(shí)你可以看看百度百科《NPOI》里面有詳細(xì)的講述。我只能跟你說使用 NPOI 你就可以在沒有安裝 Office 或者相應(yīng)環(huán)境的機(jī)器上對(duì) WORD/EXCEL 文檔進(jìn)行讀寫操作,十分方便。
另外NPOI的原作者的GitHub地址是:https://github.com/tonyqus/npoi
里面也有詳盡的描述
如何使用
通過Nuget直接添加NPOI的最新引用即可使用
Install-Package NPOI -Version 2.4.1
然后你就可用像之前一樣進(jìn)行操作了!
但是如果你想運(yùn)行在Linux上可能需要注意一下:
由于NPOI使用System.Drawing.Common,因此必須在Linux系統(tǒng)上安裝libgdiplus和libc6。
Ubuntu 16.04及以上
apt-get install libgdiplus libc6-dev ln -s /usr/lib/libgdiplus.so /usr/lib/gdiplus.dll
然后就可以在Linux系統(tǒng)上跑起來了!
例子
我們有很多例子可供您學(xué)習(xí)如何使用NPOI。
請(qǐng)查看https://github.com/tonyqus/npoi/tree/master/examples。
文件夾名稱示例描述HSSF有關(guān)Excel 97-2003格式的示例(* .xls)XSSF有關(guān)Excel 2007+格式的示例(* .xlsx)XWPF有關(guān)Word 2007+格式(* .docx)的示例POIFS關(guān)于OLE2文檔/ ActiveX文檔的示例OOXML有關(guān)OpenXML文件的示例
第三方博客
使用NPOI - C#和WEB API導(dǎo)出到Excel
使用NPOI在.NET中構(gòu)建漂亮的XLS文檔
如何使用NPOI閱讀Excel 2007文檔
如何使用NPOI創(chuàng)建Excel電子表格
NPOI 2.0 - 將Excel XLS文檔轉(zhuǎn)換為HTML格式
NPOI與Excel表和動(dòng)態(tài)圖表
總結(jié)
今天給大家介紹了一款.NET Core Office開發(fā)利器NPOI已經(jīng)支持.NET Core了!希望對(duì)大家有所幫助!今后我們的實(shí)戰(zhàn)教程之CMS系統(tǒng)里面對(duì)Excel的操作也將使用這個(gè)組件,屆時(shí)我講實(shí)戰(zhàn)講解如何使用這個(gè)組件,最后感謝大家的閱讀。
sp.net為了縮短開發(fā)周期,搭建了一個(gè)快速開發(fā)平臺(tái)。
如果是做OA、CRM、ERP一類的管理系統(tǒng),如果為了縮短開發(fā)周期,搭建一個(gè)快速開發(fā)平臺(tái),再配合一些快速開發(fā)的組件開發(fā)效率能提高很多。
1.框架用到的技術(shù)
(1)前臺(tái)技術(shù):ajax+Jquery+jqgrid+Bootstrap
(2)開發(fā)環(huán)境:VS2015-VS2019
(3)數(shù)據(jù)庫:SQL Server,Oracle、Mysql
(5)后臺(tái)技術(shù):ASP.NET MVC,TinyIoc(IoC容器),EF(ORM框架),layui框架或vue,Log4Net,NPOI等
2.框架主要功能展示
手機(jī)端是通過html做前端開發(fā),通過ajax與后臺(tái)webapi接口做交互。開發(fā)完成后可以打包成應(yīng)用提供給用戶下載
近在做一個(gè)需求是導(dǎo)出較大的excel,本文是記錄我在做需求過程中遇到的幾個(gè)問題和解題方法,給大家分享一下,一來可以幫助同樣遇到問題的朋友,二呢,各位大神也許有更好的方法可以指點(diǎn)小弟一下,讓我順便學(xué)習(xí)一下。
背景::工頭:“小鐘啊,xx界面加個(gè)導(dǎo)出excel功能03以后的格式,需要能支持到excel的最大行,同時(shí)需要5個(gè)并發(fā)就行”
我:“收到,但是數(shù)據(jù)大的時(shí)候速度可能比較慢。”
工頭:“你先做后續(xù)客戶反饋了在給他加進(jìn)度條。”
Npoi神器介紹:SXSSFWorkbook 專門用來導(dǎo)出大數(shù)據(jù)用,他會(huì)把數(shù)據(jù)先寫入C盤的臨時(shí)目錄;不會(huì)所有 都留在內(nèi)存里;更詳細(xì)介紹請(qǐng)百度或者參考(http://poi.apache.org/components/spreadsheet/how-to.html#sxssf)
有了這層基礎(chǔ)開始劈里啪啦一段操作寫代碼;(以下代碼非生產(chǎn)代碼只是我為了帖子寫重現(xiàn)問題的測(cè)試代碼)
首先開個(gè)線程模擬并發(fā)
編寫導(dǎo)出方法:記錄時(shí)間、創(chuàng)建SXSSFWorkbook 代碼如圖:
啟動(dòng)運(yùn)行;
好!第一口鍋已造好,看這個(gè)提示,前面說了SXSSFWorkbook 是會(huì)先把緩存數(shù)據(jù)寫入Windows臨時(shí)文件里頭的,這個(gè)目錄正好是Windows的臨時(shí)文件夾雖然是個(gè)錯(cuò)誤但是驗(yàn)證了剛剛的說法;至于這個(gè)錯(cuò)誤看提示 我們有個(gè)大膽的想法是文件占用問題,應(yīng)該是創(chuàng)建文件的時(shí)候文件已經(jīng)存在了,這樣我們把npoi的dll打開來看看,通過看源碼和各種f12我們看到了這么一段代碼
這里看到用來隨機(jī)數(shù),而我們知道net的隨機(jī)數(shù)在極短的時(shí)間內(nèi)生成是不可靠的(詳見百度或者:
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)也就是說生成一樣的文件名,然后我們?cè)谕ㄟ^ github里可以看到
早在年初NPOI就對(duì)這個(gè)問題做了更改就換成guid了,隨后我來到了nuget
nuget最新版 是去年12月份發(fā)布,并沒有包含上面的更改;
所以呢 要么github下載最新版編譯要么自己解決,想了想如果換版本的話以前的功能可能會(huì)影響到所以,我們就在外面加一把小鎖吧!如圖
這樣呢我們?cè)谠囋嚕?/p>
很好 不會(huì)在出現(xiàn)文件占用問題了;好繼續(xù)導(dǎo)出!
既然是都先寫入緩存文件是不是占用的內(nèi)存就很小了 來看看
2G多。。。什么情況,還在漲
3G。。。這明顯不符合工頭的需求了,然后終于它炸了
第一念頭是為啥我該怎么辦,設(shè)置GC的回收模式?手動(dòng)多GC?還是要把代碼給拿下來看看,看看這么大內(nèi)存哪里沒釋放文件?冷靜、冷靜、想想,既然是內(nèi)存爆了 那么正確流程應(yīng)該是抓取看看是什么吃的內(nèi)存得出結(jié)果再去改東西,
發(fā)現(xiàn)了啥是不是很熟悉的東西? 狀態(tài)管理、包裝類,想到了啥 EF的“模型跟蹤”這個(gè)功能占用的內(nèi)存最大了。那就去掉吧 加上這么一句 意思是無跟蹤查詢 ,修改實(shí)例后SaveChanges不對(duì)對(duì)它生效;
(AsNoTracking 更詳情理解介紹請(qǐng)百度在加上msdn:https://docs.microsoft.com/zh-cn/ef/ef6/querying/no-tracking?redirectedfrom=MSDN )
現(xiàn)在在繼續(xù)導(dǎo)出看看:
內(nèi)存是吃的不大了,
可以看出臨時(shí)文件還是很大的,這還沒導(dǎo)完呢,所以做的時(shí)候 盡量要保證下硬盤的空間!
等待。。。
總結(jié):
1.導(dǎo)出大數(shù)據(jù)用SXSSFWorkbook
2.構(gòu)建SXSSFWorkbook 時(shí)候lock或者自己編譯最新版本
3.我們做導(dǎo)出時(shí),ef查詢數(shù)據(jù)后記得加AsNoTracking 關(guān)閉綁定跟蹤。(以后日常開發(fā)中如果只需要查詢的也可以這樣做)
4.SXSSFWorkbook 導(dǎo)出大數(shù)據(jù) 臨時(shí)文件夾所在的硬盤不能太小 因?yàn)闀?huì)生成大于excel本身的緩存文件!
最后導(dǎo)出完畢
用時(shí):
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。