转自:http://www.cnblogs.com/tanpeng/p/6155749.html

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

EPPlus导出:

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

程序生成DataTable,20列,内容如下图

电脑配置:

测试结果:

条数 NPOI EPPlus
10000 成功生成 成功生成
20000 成功生成 成功生成
30000 成功生成 成功生成
40000 成功生成 成功生成
50000 失败 成功生成
100000 失败 成功生成
200000 失败 成功生成
230000 失败 失败

C# NPOI导出Excel和EPPlus导出Excel的更多相关文章

  1. C# NPOI导出Excel和EPPlus导出Excel比较

    系统中经常会使用导出Excel的功能. 之前使用的是NPOI,但是导出数据行数多就报内存溢出. 最近看到EPPlus可以用来导出Excel,就自己测了下两者导出上的差异. NPIO官网地址:http: ...

  2. c# .Net :Excel NPOI导入导出操作教程之读取Excel文件信息及输出

    c# .Net :Excel NPOI导入导出操作教程之读取Excel文件信息及输出 using NPOI.HSSF.UserModel;using NPOI.SS.UserModel;using S ...

  3. c# .Net :Excel NPOI导入导出操作教程之List集合的数据写到一个Excel文件并导出

    将List集合的数据写到一个Excel文件并导出示例: using NPOI.HSSF.UserModel;using NPOI.SS.UserModel;using System;using Sys ...

  4. ASP.NET使用NPOI加载Excel模板并导出下载

    1.为什么要使用NPOI导出Excel? 一.解决传统操作Excel遇到的问题: 如果是.NET,需要在服务器端装Office,且及时更新它,以防漏洞,还需要设定权限允许.NET访问COM+,如果在导 ...

  5. 导出Excel之Epplus使用教程1(基本介绍)

    1.前言 目前Epplus的介绍中文资料很少,我也一直在摸索中使用它,以下是我在使用过程中得到的经验,写出来供大家参考.本系列共4章: 导出Excel之Epplus使用教程1(基本介绍) 导出Exce ...

  6. 导出Excel之Epplus使用教程2(样式设置)

    导出Excel之Epplus使用教程1(基本介绍) 导出Excel之Epplus使用教程2(样式设置) 导出Excel之Epplus使用教程3(图表设置) 导出Excel之Epplus使用教程4(其他 ...

  7. 导出Excel之Epplus使用教程3(图表设置)

    导出Excel之Epplus使用教程1(基本介绍) 导出Excel之Epplus使用教程2(样式设置) 导出Excel之Epplus使用教程3(图表设置) 导出Excel之Epplus使用教程4(其他 ...

  8. 导出Excel之Epplus使用教程4(其他设置)

    导出Excel之Epplus使用教程1(基本介绍) 导出Excel之Epplus使用教程2(样式设置) 导出Excel之Epplus使用教程3(图表设置) 导出Excel之Epplus使用教程4(其他 ...

  9. [转].net 使用NPOI或MyXls把DataTable导出到Excel

    本文转自:http://www.cnblogs.com/yongfa365/archive/2010/05/10/NPOI-MyXls-DataTable-To-Excel-From-Excel.ht ...

随机推荐

  1. Java基础八--构造函数

    Java基础八--构造函数 一.子父类中构造函数的特点 1.1 为什么在子类构造对象时,发现,访问子类构造函数时,父类也运行了呢? 原因是:在子类的构造函数中第一行有一个默认的隐式语句. super( ...

  2. 新概念 Lesson 1 Excuse me!

    xu言: 从哪里跌倒,就从哪里爬起来.希望这次真的能够坚持下去... standard  ['stændəd]    pronunciation [prə,nʌnsɪ'eɪʃ(ə)n] basic   ...

  3. 12月8日 周五 image_tag.

    Overview of helpers provided by Action View 6.1 AssetTagHelper:用于generate html语言 image_tag ,return a ...

  4. axios构建缓存池存储基础数据

    项目中经常出现需要多次使用的后端数据,通常的做法是通过变量缓存数据,或者通过类似vuex的东西来进行缓存,但是麻烦在于很可能需要判断一大堆的条件,或者说如果有权限控制的时候数据能否读取也是很麻烦的事情 ...

  5. kmp练习

    kmp板子如下, 失配数组不优化的话, $f_i$就表示子串[0...i]前后缀最大匹配长度 int main() { scanf("%s%s", t, p); int n = s ...

  6. python-day8-循环补充

    # msg='hello'# msg=[1,2,3,4,5,6]# msg=(1,2,3,4,5,6) # index=0# while index < len(msg):# print(msg ...

  7. Error when clicking other button after displaying Popup window(转)

    原文地址:Error when clicking other button after displaying Popup window Hi, I'm developing a custom page ...

  8. 一、WCF学习之旅-创建第一个服务

    WCF基本介绍:http://baike.baidu.com/link?url=TGjLYt3HS4dt4-hIiGRknLy6udRsZ52QxJz9cmRKlR4NXbP9rCZDsKn2fDfG ...

  9. MyEclipse移动开发教程:迁移HTML5移动项目到PhoneGap(二)

    MyEclipse开年钜惠 在线购买低至75折!立即开抢>> [MyEclipse最新版下载] 二.将文件从HTML5项目复制到PhoneGap项目中 1. 在HTML5 app项目的ww ...

  10. MyEclipse 2017 CI 10 发布(附下载)

    挑战全年最低价!MyEclipse线上狂欢仅剩最后3天!立即抢购>> 2017 CI 10主要是一个错误修复版本,这个版本为Angular和TypeScript工具提供了重要的修复,并为I ...