【工具】Excel利器—NPOI VS EPPLUS

由于最近客户端不停抱怨,查询会宕机。

其实,这算是老问题了,主要原因是:Query性能不佳

由于该查询会使用到的Table事务量很大,容易会有Wait的现象到最后就TimeOut了。

查询数据量太大,目前是放到DataSet之后直接用GridView绑定。

其实,以上种种造成因素太多了。

再加上,查询出来的结果使用端整批下载或是自订下载成Excel。

最一开始的版本的使用Office原生的套件写到Excel,在网页TimeOut前的极限大约是6000~9000笔。

而,我接手以后我把它改成直接用Html Render出来,在网页TimeOut前的极限大约是10000~14000笔。

但是,这样还是有不少问题。

最后,最近开会主管提出一种方案,让使用者需要大量数据时,用离线的方式制作。

这样的好处有:SQL Command TimeOut 可以拉长。

不用再受限网页TimeOut的问题点。

可以避开高峰时间,让这些又臭又长的Query在深夜里享受性能。

好啦....既然决定要做总要改变用更好的工具吧!!

NPOI应该已经有很多人听闻过了,主管在前几天也刚好提到有一套第三方原件EPPlus。

网络上其实已经有人写过类似评测:皮尼网前走

上面那篇文章,看起来主要是网页版的时间比较,看起来EPPlus根本就是让NPOI看不到车尾灯。

但是,我要的是Console版的比较,就自己来学啦!!

我对NPOI和EPPlus其实都不熟,靠着范例&部分教学拼凑出来了以下结论。

NPOI

我是使用官方最新版本1.2.4,NPOI只能存取Office 2003的版本,我的目的是有一个Templete,我们只把数据塞到各列中。

步骤一:将下载的DLL,加入至参考(此部分不另说明)。

步骤二:using NPOI.HSSF.UserModel;

using NPOI.HPSF;

using NPOI.POIFS.FileSystem;

using NPOI.SS.UserModel;

步骤三://将WorkBook指到我们原本设计好的Templete Book1.xls

using (IWorkbook wb = new HSSFWorkbook(new FileStream("D:/Book1.xls", FileMode.Open)))

{

try

{

//设定要使用的Sheet为第0个Sheet

ISheet TempSheet = wb.GetSheetAt(0);

int StartRow = 4;

//tDS为Query带回来的数据

for (int i = 0; i < tDS.Tables[0].Rows.Count; i++)

{

//第一个Row要用Create的

TempSheet.CreateRow(StartRow + i).CreateCell(0).SetCellValue(Convert.ToString(tDS.Tables[0].Rows[i][0]));

//第二个Row之后直接用Get的

TempSheet.GetRow(StartRow + i).CreateCell(1).SetCellValue(Convert.ToString(tDS.Tables[0].Rows[i][1]));

TempSheet.GetRow(StartRow + i).CreateCell(2).SetCellValue(Convert.ToString(tDS.Tables[0].Rows[i][2]));

TempSheet.GetRow(StartRow + i).CreateCell(3).SetCellValue(Convert.ToString(tDS.Tables[0].Rows[i][3]));

TempSheet.GetRow(StartRow + i).CreateCell(4).SetCellValue(Convert.ToString(tDS.Tables[0].Rows[i][4]));

TempSheet.GetRow(StartRow + i).CreateCell(5).SetCellValue(Convert.ToString(tDS.Tables[0].Rows[i][5]));

TempSheet.GetRow(StartRow + i).CreateCell(6).SetCellValue(Convert.ToString(tDS.Tables[0].Rows[i][6]));

TempSheet.GetRow(StartRow + i).CreateCell(7).SetCellValue(Convert.ToString(tDS.Tables[0].Rows[i][7]));

TempSheet.GetRow(StartRow + i).CreateCell(8).SetCellValue(Convert.ToString(tDS.Tables[0].Rows[i][8]));

TempSheet.GetRow(StartRow + i).CreateCell(9).SetCellValue(Convert.ToString(tDS.Tables[0].Rows[i][9]));

TempSheet.GetRow(StartRow + i).CreateCell(10).SetCellValue(Convert.ToString(tDS.Tables[0].Rows[i][10]));

TempSheet.GetRow(StartRow + i).CreateCell(11).SetCellValue(Convert.ToString(tDS.Tables[0].Rows[i][11]));

TempSheet.GetRow(StartRow + i).CreateCell(12).SetCellValue(Convert.ToString(tDS.Tables[0].Rows[i][12]));

}

//将文件写到指定位置

using (FileStream file = new FileStream("H:/Test_NPOI4.xls", FileMode.Create))

{

wb.Write(file);

file.Close();

file.Dispose();

}

}

catch (Exception e)

{

string a = e.ToString();

}

}

NPOI的程序撰写部分大概就是上方的方式。

EPPLUS

EPPlus我也是用官方最新版本2.6.0.1,EPPluse适用Office 2007&2010,但要注意,只支持.net 3.5以上,至于程序目的跟NPOI是一样的。

步骤一:也是把下载的DLL加入到参考。

步骤二:FileInfo newFile = new FileInfo("D:" + @"Test.xlsx");

//开启

using (ExcelPackage pck = new ExcelPackage(newFile))

{

try

{

//设定ExcelWorkBook

ExcelWorkbook workBook = pck.Workbook;

if (workBook != null)

{

if (workBook.Worksheets.Count > 0)

{

//复制Temp这个Sheet同时命名为《清单》

ExcelWorksheet currentWorksheet = workBook.Worksheets.Copy("Temp", "清单");

//可以设定保护Sheet的密码

//currentWorksheet.Protection.SetPassword("1234");

int StartRow = 4;

for (int i = 0; i < tDS.Tables[0].Rows.Count; i++)

{

//Cells[RowIndex,CellIndex]

currentWorksheet.Cells[StartRow + i, 1].Value = Convert.ToString(tDS.Tables[0].Rows[i][0]);

currentWorksheet.Cells[StartRow + i, 2].Value = Convert.ToString(tDS.Tables[0].Rows[i][1]);

currentWorksheet.Cells[StartRow + i, 3].Value = Convert.ToString(tDS.Tables[0].Rows[i][2]);

currentWorksheet.Cells[StartRow + i, 4].Value = Convert.ToString(tDS.Tables[0].Rows[i][3]);

currentWorksheet.Cells[StartRow + i, 5].Value = Convert.ToString(tDS.Tables[0].Rows[i][4]);

currentWorksheet.Cells[StartRow + i, 6].Value = Convert.ToString(tDS.Tables[0].Rows[i][5]);

currentWorksheet.Cells[StartRow + i, 7].Value = Convert.ToString(tDS.Tables[0].Rows[i][6]);

currentWorksheet.Cells[StartRow + i, 8].Value = Convert.ToString(tDS.Tables[0].Rows[i][7]);

currentWorksheet.Cells[StartRow + i, 9].Value = Convert.ToString(tDS.Tables[0].Rows[i][8]);

currentWorksheet.Cells[StartRow + i, 10].Value = Convert.ToString(tDS.Tables[0].Rows[i][9]);

currentWorksheet.Cells[StartRow + i, 11].Value = Convert.ToString(tDS.Tables[0].Rows[i][10]);

currentWorksheet.Cells[StartRow + i, 12].Value = Convert.ToString(tDS.Tables[0].Rows[i][11]);

currentWorksheet.Cells[StartRow + i, 13].Value = Convert.ToString(tDS.Tables[0].Rows[i][12]);

}

//将Temp 这个Sheet删除

workBook.Worksheets.Delete("Temp");

}

}

//存档至Text4.xlsx

pck.SaveAs(new FileInfo("H:" + @"Test4.xlsx"));

}

catch (Exception e)

{

oLogger.Fatal(e.ToString());

}

}

EPPlus程序撰写方是大概就如上方。

目前不确定我两种组件的写法,有没有可能会造成资源被Lock住,或著是没有释放掉,

这部分如果有高人愿意指教非常之欢迎喔!!

写法说明完,要开始评测啦!

首先我们先来看执行速度,两种组件我都分别跑了10000~40000左右的笔数。

以下是我整理的列表,开始到结束时间是从算出数据笔数后开始计算,因为这次的目的是写文件的速度,要扣除掉Query执行时间。

NOPI

开始到结束:3秒,文件大小:7.25MB

2012-04-21 00:23:07.6900 BathExcel.Program INFO 开始

2012-04-21 00:23:12.2333 BathExcel.Program INFO 数据笔数    9849

2012-04-21 00:23:15.4474 BathExcel.Program INFO 结束

开始到结束:2秒,文件大小:12.8MB

2012-04-21 00:24:12.9077 BathExcel.Program INFO 开始

2012-04-21 00:24:22.5753 BathExcel.Program INFO 数据笔数    17681

2012-04-21 00:24:24.3514 BathExcel.Program INFO 结束

开始到结束:3秒,文件大小:21.4MB

2012-04-21 00:24:41.5194 BathExcel.Program INFO 开始

2012-04-21 00:24:56.1772 BathExcel.Program INFO 数据笔数    29368

2012-04-21 00:24:59.4544 BathExcel.Program INFO 结束

开始到结束:8秒,文件大小:31.6MB

2012-04-21 00:25:17.5354 BathExcel.Program INFO 开始

2012-04-21 00:25:38.9126 BathExcel.Program INFO 数据笔数    43178

2012-04-21 00:25:44.1159 BathExcel.Program INFO 结束

EEPLUS

开始到结束:2秒,文件大小:2.88MB

2012-04-21 00:26:51.8548 BathExcel.Program INFO 开始

2012-04-21 00:26:56.2361 BathExcel.Program INFO 数据笔数    9849

2012-04-21 00:26:58.7312 BathExcel.Program INFO 结束

开始到结束:4秒,文件大小:5.12MB

2012-04-21 00:27:16.2712 BathExcel.Program INFO 开始

2012-04-21 00:27:24.2037 BathExcel.Program INFO 数据笔数    17681

2012-04-21 00:27:28.8359 BathExcel.Program INFO 结束

开始到结束:8秒,文件大小:8.6MB

2012-04-21 00:27:45.5839 BathExcel.Program INFO 开始

2012-04-21 00:27:57.7826 BathExcel.Program INFO 数据笔数    29368

2012-04-21 00:28:05.7360 BathExcel.Program INFO 结束

开始到结束:13秒,文件大小:12.6MB

2012-04-21 00:28:23.6411 BathExcel.Program INFO 开始

2012-04-21 00:28:41.8771 BathExcel.Program INFO 数据笔数    43178

2012-04-21 00:28:54.2988 BathExcel.Program INFO 结束

看完这数据,我发现这跟网页上那篇评论有很大的落差,不知道是哪里造成就是,但是这个数据符合我的实际情况。

总结:在执行速度方面:NPOI小赢一点。

在文件大小方面:EEPLus大胜。

在撰写感受方面:可能都是刚接触不熟,但现阶段我个人认为EEPlus小胜一筹。

在资源支持方面:NPOI胜,因EEPlus目前大多还是英文较多,但NPOI已有中文的完整文档。

最后,你问我我会选择哪一套,答案是,我会选择EEPlus,因为我喜欢他的写作方式。

希望各位看完以后,有什么问题或可以指教我的地方尽量提出来,谢谢!

NPOI参考数据:NOPI官网范例

Tony Qu撰写的中文文章(1.2.2版)

Tony Qu撰写的中文文章(1.2.4版)

EPPlus参考数据:官网范例

官网Web范例

FryHard 外国人写的文章,不错还有提供范例

epplus 速度_【推荐套件】Excel利器 NPOI VS EPPLUS相关推荐

  1. epplus 速度_.Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)

    最近项目中需要一个导出Excel报告的功能,假期搜了一下,把其中比较主流的列一下,仅供参考. 功能需求: 创建并写入.xlsx Excel2007+版本的电子表格文件 不需要office组件支持,终端 ...

  2. epplus 速度_VSTO学习之路:学习使用Epplus(1)

    关于读取其它工作簿数据的几个方式的比较: 1.VBA的GetObject方法,会调用Excel程序打开工作簿(虽然不可见,但确实是打开的) 2.SQL,使用繁琐缺少灵活,不支持单元格样式的操作,也似乎 ...

  3. .net npoi xssfclientanchor设置图片缩放大小_.NET导出Excel的四种方法及评测

    前言 导出Excel是.NET的常见需求,开源社区.市场上,都提供了不少各式各样的Excel操作相关包.本文,我将使用NPOI.EPPlus.OpenXML.Aspose.Cells四个市面上常见的库 ...

  4. epplus word html,.Net开源Excel、Word操作组件-NPOI、EPPlus、DocX

    一.NPOI 简介: NPOI is the .NET version of POI Java project. With NPOI, you can read/write Office 2003/2 ...

  5. C#读写Excel的4种方案(OpenXml、NPOI、EPPlus、Spire.Office)

    在项目中需要使用C#读写Excel,每天定时将数据输出到Excel表格中.在参考了很多的方案后,找到了4个常用的方案,并提供了一些小Demo.更多功能和示例可以参考官方文档. 1.Microsoft. ...

  6. C#读写Excel(NPOI)

    NPOI 是 POI 项目的 .NET 版本.POI是一个开源的Java读写Excel.WORD等微软OLE2组件文档的项目.使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 ...

  7. OPC UA客户端工具Softing OPC Client使用_推荐使用

    OPC UA客户端工具Softing OPC Client使用_推荐使用 Softing OPC Client工具介绍 Softing OPC Client工具是德国Softing公司出品的标准OPC ...

  8. excel 重复方差分析_如何在Excel中运行方差方差分析的两种方法

    excel 重复方差分析 Recently, we looked at how to Perform a One-Way Analysis of Variance in Excel. In today ...

  9. excel 复制 格式不变_ 如何复制Excel表格保持格式及列宽不变

    excel 复制 格式不变_ 如何复制Excel表格保持格式及列宽不变 == excel 粘贴的时候,经常格式就乱了,我们想要保持原来的样式. 有的之后粘贴后,右下角有个 图标 可以选择 保留原格式. ...

最新文章

  1. 在Docker里使用(支持镜像继承的)supervisor管理进程(转)
  2. C语言主应用程序在哪设置,哪位师傅知道51单片机怎样编写子程序?C语言的。在主程序里调...
  3. Sympy计算结果带参数的方程组
  4. ASP网站精品源码集合(免积分下载)
  5. 通过XmlSerializer 实现XML的序列化与反序列化
  6. git合并分支的策略(赞)
  7. php登录个性验证码,PHP七种不同的个性创意验证码例子
  8. xy坐标正负方向_【笛卡尔坐标系】
  9. Spring DI(依赖注入)Xml篇
  10. Android播放外部音乐文件
  11. css_02 | CSS——CSS 选择器详解
  12. 【问题】ajax两种传递id值方式的区别
  13. HBase MapReduce实例分析
  14. 485通讯接口与232接口的区别
  15. 【javascript】字符串逆序输出
  16. 计算机xp怎么做备份,xp系统备份教程方法
  17. android开发框架 xui,简介 - 正确使用XUI的姿势 - 《XUI - Android 原生 UI 框架》 - 书栈网 · BookStack...
  18. NAO机器人姿势切换
  19. python-Selenium
  20. 【阅读提要】《电子设备热设计及分析技术》_余建祖_1

热门文章

  1. Loadrunner pacing与thinktime
  2. 《计算机是怎样跑起来的》小结
  3. easyui异步加载combotree
  4. java 发送企业邮箱_java 企业邮箱_java 企业邮箱群发邮件
  5. EOS智能合约开发-开发环境搭建
  6. javaweb项目创建图片服务器
  7. FTP服务器安装+NGINX搭建简单的图片服务器(Linux)
  8. citp协议服务器,舞台融合科技多元素的7大基本条件
  9. K3Cloud BOS设计 Python 插件 弹出列表
  10. mysql ifnull 无效_关于MySql中使用IFNULL()函数失效的问题。