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