NPOI 導出 excel 性能測試

来源:https://www.cnblogs.com/weihanli/archive/2019/11/08/npoi-export-perf-test.html

網上看到很多人說 NPOI 的性能不行,自己寫了一個 NPOI 的擴展庫,於是想嘗試看看 NPOI 的性能究竟怎麼樣,道聽途說始終不如自己動手一試。 ...


NPOI 導出 excel 性能測試

Intro

網上看到很多人說 NPOI 的性能不行,自己寫了一個 NPOI 的擴展庫,於是想嘗試看看 NPOI 的性能究竟怎麼樣,道聽途說始終不如自己動手一試。

測試環境

測試工具:

  • BenchmarkDotNet v0.11.5
  • EPPlus.Core.Extensions v2.3.2
  • EPPlus v4.5.3.1
  • NPOI 2.4.1

測試代碼:(Github 源碼

[SimpleJob(launchCount: 1, warmupCount: 1, targetCount: 5)]
[MemoryDiagnoser]
[MinColumn, MaxColumn, MeanColumn, MedianColumn]
public class WorkbookBasicTest
{
    private const int ColsCount = 10;

    [Params(10000, 30000, 50000, 65535)]
    public int RowsCount;

    [Benchmark(Baseline = true)]
    public byte[] NpoiXlsWorkbookInit()
    {
        var workbook = ExcelHelper.PrepareWorkbook(ExcelFormat.Xls);

        var sheet = workbook.CreateSheet("tempSheet");

        for (var i = 0; i < RowsCount; i++)
        {
            var row = sheet.CreateRow(i);
            for (var j = 0; j < ColsCount; j++)
            {
                var cell = row.CreateCell(j);
                cell.SetCellValue($"as ({i}, {j}) sa");
            }
        }

        return workbook.ToExcelBytes();
    }

    [Benchmark]
    [MethodImpl(MethodImplOptions.NoInlining)]
    public byte[] NpoiXlsxWorkbookInit()
    {
        var workbook = ExcelHelper.PrepareWorkbook(ExcelFormat.Xlsx);

        var sheet = workbook.CreateSheet("tempSheet");

        for (var i = 0; i < RowsCount; i++)
        {
            var row = sheet.CreateRow(i);
            for (var j = 0; j < ColsCount; j++)
            {
                var cell = row.CreateCell(j);
                cell.SetCellValue($"as ({i}, {j}) sa");
            }
        }

        return workbook.ToExcelBytes();
    }

    [Benchmark]
    [MethodImpl(MethodImplOptions.NoInlining)]
    public byte[] EpplusWorkbookInit()
    {
        var excel = new ExcelPackage();

        var sheet = excel.Workbook.Worksheets.Add("tempSheet");

        for (var i = 1; i <= RowsCount; i++)
        {
            for (var j = 1; j <= ColsCount; j++)
            {
                sheet.Cells[i, j].Value = $"as ({i}, {j}) sa";
            }
        }

        return excel.GetAsByteArray();
    }
}

測試結果

在 Github 上查看結果 https://github.com/WeihanLi/WeihanLi.Npoi/blob/dev/perf/WeihanLi.Npoi.Benchmark/BenchmarkDotNet.Artifacts/results/WeihanLi.Npoi.Benchmark.WorkbookBasicTest-report-github.md


BenchmarkDotNet=v0.11.5, OS=Windows 10.0.18362
Intel Core i5-3470 CPU 3.20GHz (Ivy Bridge), 1 CPU, 4 logical and 4 physical cores
.NET Core SDK=3.0.100
  [Host]     : .NET Core 2.2.6 (CoreCLR 4.6.27817.03, CoreFX 4.6.27818.02), 64bit RyuJIT
  Job-CBYTBY : .NET Core 2.2.6 (CoreCLR 4.6.27817.03, CoreFX 4.6.27818.02), 64bit RyuJIT

IterationCount=5  LaunchCount=1  WarmupCount=1  
Method RowsCount Mean Error StdDev Min Max Median Ratio RatioSD Gen 0 Gen 1 Gen 2 Allocated
NpoiXlsWorkbookInit 10000 324.7 ms 1.583 ms 0.4110 ms 324.3 ms 325.4 ms 324.6 ms 1.00 0.00 10000.0000 5000.0000 2000.0000 78.6 MB
NpoiXlsxWorkbookInit 10000 1,369.0 ms 73.747 ms 19.1517 ms 1,341.3 ms 1,384.4 ms 1,381.1 ms 4.22 0.06 57000.0000 14000.0000 4000.0000 306.45 MB
EpplusWorkbookInit 10000 552.9 ms 12.740 ms 3.3085 ms 549.7 ms 557.7 ms 552.4 ms 1.70 0.01 18000.0000 7000.0000 3000.0000 121.05 MB
NpoiXlsWorkbookInit 30000 1,222.4 ms 33.717 ms 8.7562 ms 1,209.0 ms 1,233.1 ms 1,222.5 ms 1.00 0.00 29000.0000 11000.0000 3000.0000 235.03 MB
NpoiXlsxWorkbookInit 30000 4,226.2 ms 299.833 ms 77.8658 ms 4,109.5 ms 4,308.6 ms 4,257.2 ms 3.46 0.08 174000.0000 34000.0000 6000.0000 913.9 MB
EpplusWorkbookInit 30000 1,695.4 ms 31.751 ms 8.2457 ms 1,686.3 ms 1,706.5 ms 1,694.2 ms 1.39 0.02 48000.0000 17000.0000 5000.0000 358.51 MB
NpoiXlsWorkbookInit 50000 2,323.5 ms 236.041 ms 61.2990 ms 2,286.0 ms 2,431.9 ms 2,294.2 ms 1.00 0.00 47000.0000 18000.0000 4000.0000 417.1 MB
NpoiXlsxWorkbookInit 50000 7,055.2 ms 279.256 ms 72.5218 ms 6,982.8 ms 7,150.2 ms 7,027.2 ms 3.04 0.10 288000.0000 51000.0000 6000.0000 1545.32 MB
EpplusWorkbookInit 50000 2,806.9 ms 56.266 ms 14.6121 ms 2,792.9 ms 2,829.1 ms 2,804.6 ms 1.21 0.03 79000.0000 27000.0000 7000.0000 578.46 MB
NpoiXlsWorkbookInit 65535 3,646.8 ms 131.129 ms 34.0537 ms 3,603.0 ms 3,696.3 ms 3,642.5 ms 1.00 0.00 61000.0000 21000.0000 4000.0000 504.46 MB
NpoiXlsxWorkbookInit 65535 9,295.6 ms 486.761 ms 126.4104 ms 9,163.3 ms 9,468.6 ms 9,330.5 ms 2.55 0.04 390000.0000 67000.0000 8000.0000 2048.14 MB
EpplusWorkbookInit 65535 3,721.6 ms 124.945 ms 32.4478 ms 3,680.7 ms 3,766.8 ms 3,714.1 ms 1.02 0.01 102000.0000 35000.0000 8000.0000 747.85 MB

從上面的測試結果來看,npoi 導出 xls 的性能還是相當好的,無論是所用時間還是記憶體都占優勢,只是 xls 一個 sheet 最多 65535 行數據,所以測試數據最多只有 65535,其次就是 epplus 導出 xlsx,最次是 npoi 導出 xlsx 了。

測試結論

如果使用 NPOI 導出建議導出 xls,如果要導出數據較多,可以導出 csv ,如果看了另外一個 csv 導出的測試,csv 導出性能要比 excel 好很多,如果實在是要導出 excel,導入 xls 的話就分多個 sheet 處理,如果一定要導出 xlsx 格式的 excel ,推薦用 epplus 來處理,相比 npoi 導出 xlsx 性能更好,記憶體占用更少

Reference


您的分享是我們最大的動力!

更多相關文章
  • 1. 沒有在Program里配置IIS webBuilder.UseIIS(); 2. StartupProduction 里AutoFac容器註入錯誤和新版的CORS中間件已經阻止使用允許任意Origin,即 AllowAnyOrgin設置了也不會生效 3. 可以嘗試下 在網站根目錄dotnet ...
  • 我是一名 ASP.NET 程式員,專註於 B/S 項目開發。累計文章閱讀量超過一千萬,我的博客主頁地址:https://www.itsvse.com/blog_xzz.html 網上有很多關於npoi讀取excel表格的例子,很多都是返回一個Datatable的對象,但是我需要的是一個list集合, ...
  • 場景 DevExpress的TreeList怎樣設置數據源,從實例入手: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/102548490 滑鼠雙擊TreeList中的某一節點,在雙擊事件中怎樣獲取當前節點。 註: 博客主頁: h ...
  • 場景 在Winform中進行頁面設計時,常使用控制項的Dock屬性來進行佈局調整。但是由於設置屬性的順序問題,導致達不到想要的效果。 比如以下兩個控制項 下麵的控制項設置的Dock屬性是Bottom,即在頁面底部,那麼再設置上面的控制項的Dock屬性為Fill,理想效果是應該他們按當前佈局顯示在頁面上。但是 ...
  • 實現 該 敏感詞過濾 採用的是 DFA演算法,參考文章:https://blog.csdn.net/chenssy/article/details/26961957 具體 實現 步驟 如下: 第一步,構建 敏感詞庫(WordsLibrary) 類: using System.Collections.G ...
一周排行
  • static void Main(string[] args) { string url = "https://go.microsoft.com/fwlink/?linkid=2108895&amp;clcid=0x409"; DownloadBigFile(new Uri(url), "ssms.... ...
  • 1. 使用ASP.NET Core 3.x 構建 RESTful API - 1.準備工作 什麼是REST 什麼是REST REST一詞最早是在2000年,由Roy Fielding在他的博士論文《Architectural Styles and the Design of Network-base ...
  • wpf 兩個自定義控制項 一個是IP控制項,一個滑動條。先看下效果圖 IPControl 1、實際工作中有時需要設置IP信息,就想著做一個ip控制項。效果沒有window自帶的好,需要通過tab切換。但也能滿足使用。廢話不多說直接上代碼 IPControl.xaml IPControl.xaml.cs 2 ...
  • 近期和幾位做嵌入式開發的朋友閑聊過程中,一位朋友抱怨到:這C#太難用了,我想在N個窗體(或者是N個用戶組件之間)傳遞值都搞不定,非得要定義一個全局變數來存儲,然後用定時器來刷新值,太Low了。我急切的回答道:這很簡單,不就是委托的事嘛。那你來一個示例啊:朋友道。此為這篇博客的起因,所以此篇博客對於有 ...
  • 在面對對象編程中,類的三大特性分別為封裝,繼承,多態。其中多態的具體實現,依賴於三個方法,也就是虛方法,抽象類和介面。 多態的具體作用是什麼呢?或者說多態的存在有什麼意義呢?多態的存在有效的降低了程式的耦合度,在使用的時候,不僅可以表現大家都有的共性,還能在必要的時候突出一些特殊的的個性。 那麼如何 ...
  • [toc] 前言 在之前已經提到過,公用類庫Util已經開源,目的一是為了簡化開發的工作量,畢竟有些常規的功能類庫重覆率還是挺高的,二是為了一起探討學習軟體開發,用的人越多問題也就會越多,解決的問題越多功能也就越完善, 倉庫地址: "April.Util_github" , "April.Util_ ...
  • 【ASP.NET Core學習】在ASP.NET Core 種使用Entity Framework Core介紹,包括如何添加Entity Framwork Core,創建模型和遷移到資料庫,查詢數據,保存數據,使用事務,處理併發衝突 ...
  • 環境:MacOS 10.13 MAMAP Prophp 7.0.33 + xdebugVisual Studio Code前言我所理解的 POP Chain:利用魔術方法並巧妙構造特殊屬性調用一系列函數或類方法以執行某種敏感操作的調用堆棧反序列化常用魔法函數前言我所理解的 POP Chain:利用魔 ...
  • 當創建隊列jobs、監聽器或訂閱伺服器以推送到隊列中時,您可能會開始認為,一旦分派,隊列工作器決定如何處理您的邏輯就完全由您自己決定了。 嗯……並不是說你不能從作業內部與隊列工作器交互,但是通常情況下,哪怕你做了,也是沒必要的。 這個神奇的騷操作的出現是因為“InteractsWithQueue”這 ...
  • 在說正題之前先解釋一下交換機模式是個籠統的稱呼,它不是一個單獨的模式(包括了訂閱模式,路由模式和主題模式),交換機模式是一個比較常用的模式,主要是為了實現數據的同步。 首先,說一下訂閱模式,就和字面上的意思差不多主要就是一個生產者,多個消費者,同一個消息被多個消費者獲取,先看一下官網的圖示 整體執行 ...
x