C# NPOI導出Excel和EPPlus導出Excel比較

来源:http://www.cnblogs.com/tanpeng/archive/2016/12/10/6155749.html
-Advertisement-
Play Games

系統中經常會使用導出Excel的功能。 之前使用的是NPOI,但是導出數據行數多就報記憶體溢出。 最近看到EPPlus可以用來導出Excel,就自己測了下兩者導出上的差異。 NPIO官網地址:http://npoi.codeplex.com/ EPPlus官網地址:http://epplus.code ...


系統中經常會使用導出Excel的功能。

之前使用的是NPOI,但是導出數據行數多就報記憶體溢出。

最近看到EPPlus可以用來導出Excel,就自己測了下兩者導出上的差異。

NPIO官網地址:http://npoi.codeplex.com/

EPPlus官網地址:http://epplus.codeplex.com/

添加NPOI、EPPlus類庫dll使用的是NuGet添加。

在類庫References右鍵Manage NuGet Packages...,之後選擇添加對應的dll。

測試結果顯示,相同數據結構的數據,EPPlus的導出能力比NPOI強。

20列,NPOI能導出4萬數據,導出5萬數據時報記憶體溢出。

         EPPlus能導出20萬以上數據,導出23萬測試時記憶體溢出。

NPOI導出:

 1 private static MemoryStream ExportXlsx(DataTable dt)
 2         {
 3             XSSFWorkbook workbook = new XSSFWorkbook();
 4             ISheet sheet = null;
 5 
 6             int headRowIndex = 0;
 7             string sheetName = "Sheet1";
 8             if (!string.IsNullOrEmpty(dt.TableName))
 9             {
10                 sheetName = dt.TableName;
11             }
12             sheet = workbook.CreateSheet(sheetName);
13             int rowIndex = 0;
14 
15             #region 列頭及樣式
16             {
17                 XSSFRow headerRow = (XSSFRow)sheet.CreateRow(headRowIndex);
18 
19                 ICellStyle headStyle = workbook.CreateCellStyle();
20                 headStyle.Alignment = HorizontalAlignment.Center;
21                 IFont font = workbook.CreateFont();
22                 font.FontHeightInPoints = 10;
23                 font.Boldweight = 700;
24                 headStyle.SetFont(font);
25 
26                 foreach (DataColumn column in dt.Columns)
27                 {
28                     headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);
29                     headerRow.GetCell(column.Ordinal).CellStyle = headStyle;
30                 }
31             }
32             #endregion
33 
34             #region 填充內容
35 
36             foreach (DataRow row in dt.Rows)
37             {
38                 rowIndex++;
39                 XSSFRow dataRow = (XSSFRow)sheet.CreateRow(rowIndex);
40                 foreach (DataColumn column in dt.Columns)
41                 {
42                     string drValue = row[column].ToString();
43                     dataRow.CreateCell(column.Ordinal).SetCellValue(drValue);
44                 }
45             }
46             #endregion
47 
48 
49             MemoryStream ms = new MemoryStream();
50 
51             workbook.Write(ms);
52             ms.Flush();
53 
54             return ms;
55         }
56 
57         public static void ExportXlsxByWeb(DataTable dt, string strFileName)
58         {
59 
60             HttpContext curContext = HttpContext.Current;
61 
62             MemoryStream ms = ExportXlsx(dt);
63 
64             curContext.Response.AppendHeader("Content-Disposition",
65                 "attachment;filename=" + HttpUtility.UrlEncode(strFileName, Encoding.UTF8) + ".xlsx");
66             curContext.Response.AddHeader("Content-Length", ms.ToArray().Length.ToString());
67             curContext.Response.ContentEncoding = Encoding.UTF8;
68 
69             curContext.Response.BinaryWrite(ms.ToArray());
70             ms.Close();
71             ms.Dispose();
72             curContext.Response.End();
73 
74         }

EPPlus導出:

 1 /// <summary>
 2         /// 使用EPPlus導出Excel(xlsx)
 3         /// </summary>
 4         /// <param name="sourceTable">數據源</param>
 5         /// <param name="strFileName">xlsx文件名(不含尾碼名)</param>
 6         public static void ExportByEPPlus(DataTable sourceTable, string strFileName)
 7         {
 8             using (ExcelPackage pck = new ExcelPackage())
 9             {
10                 //Create the worksheet
11                 string sheetName = string.IsNullOrEmpty(sourceTable.TableName) ? "Sheet1" : sourceTable.TableName;
12                 ExcelWorksheet ws = pck.Workbook.Worksheets.Add(sheetName);
13 
14                 //Load the datatable into the sheet, starting from cell A1. Print the column names on row 1
15                 ws.Cells["A1"].LoadFromDataTable(sourceTable, true);
16 
17                 //Format the row
18                 ExcelBorderStyle borderStyle = ExcelBorderStyle.Thin;
19                 Color borderColor = Color.FromArgb(155, 155, 155);
20 
21                 using (ExcelRange rng = ws.Cells[1, 1, sourceTable.Rows.Count + 1, sourceTable.Columns.Count])
22                 {
23                     rng.Style.Font.Name = "宋體";
24                     rng.Style.Font.Size = 10;
25                     rng.Style.Fill.PatternType = ExcelFillStyle.Solid;                      //Set Pattern for the background to Solid
26                     rng.Style.Fill.BackgroundColor.SetColor(Color.FromArgb(255, 255, 255));
27 
28                     rng.Style.Border.Top.Style = borderStyle;
29                     rng.Style.Border.Top.Color.SetColor(borderColor);
30 
31                     rng.Style.Border.Bottom.Style = borderStyle;
32                     rng.Style.Border.Bottom.Color.SetColor(borderColor);
33 
34                     rng.Style.Border.Right.Style = borderStyle;
35                     rng.Style.Border.Right.Color.SetColor(borderColor);
36                 }
37 
38                 //Format the header row
39                 using (ExcelRange rng = ws.Cells[1, 1, 1, sourceTable.Columns.Count])
40                 {
41                     rng.Style.Font.Bold = true;
42                     rng.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
43                     rng.Style.Fill.BackgroundColor.SetColor(Color.FromArgb(234, 241, 246));  //Set color to dark blue
44                     rng.Style.Font.Color.SetColor(Color.FromArgb(51, 51, 51));
45                 }
46 
47                 //Write it back to the client
48                 HttpContext.Current.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
49                 HttpContext.Current.Response.AddHeader("content-disposition", string.Format("attachment;  filename={0}.xlsx", HttpUtility.UrlEncode(strFileName, Encoding.UTF8)));
50                 HttpContext.Current.Response.ContentEncoding = Encoding.UTF8;
51 
52                 HttpContext.Current.Response.BinaryWrite(pck.GetAsByteArray());
53                 HttpContext.Current.Response.End();
54             }
55         }

程式生成DataTable,20列,內容如下圖

電腦配置:

測試結果:

條數 NPOI EPPlus
10000 成功生成 成功生成
20000 成功生成 成功生成
30000 成功生成 成功生成
40000 成功生成 成功生成
50000 失敗 成功生成
100000 失敗 成功生成
200000 失敗 成功生成
230000 失敗 失敗

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

-Advertisement-
Play Games
更多相關文章
  • 參考:https://wiki.archlinux.org/index.php/Installation_guide_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) 安裝準備 連接到網際網路 守護進程 dhcpcd 已被預設啟用來探測有線設備, 並會嘗試連接。如需驗證網路... ...
  • 中斷(interrupt)是指CPU在執行程式的過程中,出現了某些突發事件急待處理,CPU必須暫停執行當前的程式,轉去處理突發事件,處理完畢後CPU又返回原程式被中斷的位置並繼續執行。中斷服務程式的執行並不存在於進程上下文,因此,要求中斷服務程式的時間儘可能地短。因此,Linux在中斷處理中引入了頂... ...
  • 樹莓派是當前最火的嵌入計算平臺沒有之一,樹莓派可以給我們無數的想象,樹莓派的高性能、低功耗、低成本、可擴展性(最新的樹莓派原生支持WIFI和藍牙,這功能太贊了)深受大家的喜愛。雖然樹莓派到目前為止已經很好安裝系統了。但是要想方便的使用和部署開發的軟體還是比較麻煩的。 安裝環境的話,你的有樹莓派硬體( ...
  • 從此刻開始,我已封閉!概不接客! 像風一樣的男人,像風一樣的性格,無拘無束,不拘一格。那麼問題來了,當風遇到沙,不一定你是風兒,我是沙兒的纏纏綿綿,。也許是漫天黃沙,飛粒走石。如果我們期望擒住這漫天的塵埃,必須有強有力的手臂!那麼曬網、撒網、收網!讓他老實的封閉起來吧,永遠相依偎,阿拉! 讀在最前面 ...
  • Vs支持多種語言,但有可能創建項目時,預設的開發語言不是你需要的,比如:預設是Visual C++ 你可以通過"工具"----選項----導入和導出設置來修改。 引用: https://weblogs.asp.net/sreejukg/change-default-language-settings... ...
  • string 與 String,大 S 與小 S 之間有關字元串的秘密 字元串是 String 類型的對象,它的值是文本。 在內部,文本被存儲為 Char 對象的順序只讀集合。 C# 字元串末尾沒有以 null 結尾的字元;因此 C# 字元串可以包含任意數目的嵌入式 null 字元(“\0”)。 字 ...
  • 最近在熟悉Abp框架,其基於DDD領域驅動設計。。。前段可以繞過mvc直接調用根據app層動態生成的webapi,有點神奇~,Web API之前有簡單接觸過,WCF的輕量級版,一般用於做一寫開發性的服務介面,形式上類似與MVC,只是不渲染視圖(其他基於restful設計什麼的我不想去扯)。 因此我的 ...
  • C# 介面(Interface) 介面定義了所有類繼承介面時應遵循的語法合同。介面定義了語法合同 "是什麼" 部分,派生類定義了語法合同 "怎麼做" 部分。 介面定義了屬性、方法和事件,這些都是介面的成員。介面只包含了成員的聲明。成員的定義是派生類的責任。介面提供了派生類應遵循的標準結構。 抽象類在 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...