4种开源Excel读写类库与MS Excel类库写操作对比
软件开发过程中,经常需要将数据保存为.xls或.xlsx文件。之前发现微软提供的Microsoft.Office.Interop.Excel效率及其底下,所以搜集了另外4个可以独立读写Excel的开源类库,对写操作进行对比。
测试平台:
CPU | Intel Xeon, 3200 MHz (16 x 200) |
主板 | MSI E7525 Master-S2 (MS-9151) |
内存 | 1024 MB (Registered ECC DDR2 SDRAM) |
操作系统 | Microsoft Windows 7 Ultimate SP1 (x86) |
开发平台 | Visual Studio 2010 & .Net Framework 4.0 |
测试用的5个类库:
测试代号 | 类库版本 | 运行时版本 | 网址/地址 |
MS Excel | 14.0.0.0 | 2.0.50727 | \Microsoft Visual Studio 10.0\Visual Studio Tools for Office\PIA\Office14\ |
ExcelPackage | 1.0.0.1 | 2.0.50727 | http://excelpackage.codeplex.com/ |
EPPlus | 2.9.0.1 | 2.0.50727 | http://epplus.codeplex.com/ |
NPOI | 1.2.4.0 | 4.0.30319 | http://code.google.com/p/npoi/ |
ExcelLibrary | 1.0.0.0 | v2.0.50727 | http://code.google.com/p/excellibrary/ |
在测试开始之前,先将一个366行8列的数据集读入内存,为了避免数据存入硬盘等操作产生的误差,测试仅记录了将数据循环写入数据表中单元格所消耗的时间,为了消除可能的误差,每次操作之间设计了一个30秒的停顿,代码框架如下:
1: for (int s = 0; s < 51; s++)
2: {
3: System.Diagnostics.Stopwatch MyWatch = new System.Diagnostics.Stopwatch();
4: //初始化
5: MyWatch.Start();
6: for (int i = 0; i < rows; i++)
7: {
8: for (int j = 0; j < columns; j++)
9: {
10: //写入单元格数据;
11: }
12: }
13: MyWatch.Stop();
14: //垃圾回收;
15: textBox.AppendText(MyWatch.ElapsedMilliseconds.ToString() + "\r\n");
16: System.Threading.Thread.Sleep(30000);
17: }
取重复测试51次,首次运行一般耗时较长,未计算在内,其余的计算平均值,结果如下表所示:
光从效率上讲,ExcelLibrary以平均高出第二名将近3倍,领先微软自己的Excel类库2700多倍的速度遥遥领先!但是兼容性和导出文件大小还是需要关注的。测试用的数据集粘贴在Excel 2010空文件中保存后,.xls文件大小为57KB,.xlsx文件为26KB,导出后的文件大小却不相同。细节如下图:
综合上述,如果单需要导出.xlsx格式,EPPlus显然是最佳选择,导出速度在所有支持07-10格式的类库中最快,生成的文件也最小;如果单需要导出.xls格式,ExcelLibrary是首选,速度遥遥领先,文件大小也有略有优势;就算同时需要导出两种格式,MS Excel依然不是首选,应为速度实在是慢到令人发指……需要注意的是,大于65536行的数据.xls格式不支持,必须使用.xlsx。