C#和Excel

in C# with 0 comment

头一次知道Excl在一个企业/个人的报表管理里面这么重要

以前做东西,公司要求导出成 txt 或者 csv 格式就可以了,他们说导出成Excl需要电脑安装Office,而且速度很慢,比较麻烦,不推荐。

当时由于赶进度,我信了,后来在网上搜了一下才发现,谬误源于流言

很多人说Excl操作速度很慢,但其实只是指用官方库的一种方法,常用的Excl操作方法有三种。
这里借鉴一下

1. OleDb:

这种方式是把整个Excel文件当做一个数据源来进行数据的读取操作。
优点:实现方式简单,读取速度快;
缺点:读取Excel数据的过程不太灵活,对内存的占用比较高,当数据量变的很大时,容易由于内存空间不足导致内存溢出异常。(不过貌似对于今天电脑的硬件配置来说,内存问题不大)

2. Com组件

这种方式是通过Com组件 Microsoft.Office.Interop.Excel.dll实现Excel文件的操作。
优点:读取Excel数据非常灵活,可以实现Excel具有的各种数据处理功能;
缺点:对数据的访问时基于单元格方式实现的,所以读写数据较慢,特别是当数据量较大时,访问效率问题更为突出。另一点是要求本机安装了Microsoft Office组件。

3. NPOI

这种方式是通过NPOI库实现Excel文件操作,可以在没有安装微软Office的情况下使用。
优点:读取Excel数据速度较快,操作方式灵活;
缺点:试了再说!

其中oleDb我没有用过,不评价。

大家常说的操作速度慢,指的是使用官方的 COM组件
优点并在我看来并不是很重要,缺点很明显:慢!需要安装Office、CPU和内存占用也比较高(解析时I5CPU占用20%左右)
我只是简单地读取20多行数据,就大概耗费了10s左右。
COM组件读取

排除是第一次初始化耗时的原因,读取第二次耗时大约5s,也就是每秒4、5条左右
此时整个程序内存占用100M左右
COM组件内存占用

当时我就傻了,这要是 10W 条数据,不就凉凉了?
赶紧。。怎么办,多线程,写算法,数据优化?

噼里啪啦写了个双线程读取,速度提了一倍,然后。。。emmm,
计算器

哈!开心,10W条数据只需要一个多小时可以读完啦!!!

食屎咩你

此路不通,换个解决办法。

网上搜了一下,发现了NPOI这个第三方库,不需要安装Office

我先跑去NPOI官网下载了他家的压缩包v2.2.1版本,里面分 .Net 2.0和.Net 4.0 各有5个dll文件,我也没管那么多,全部引用到项目里。一顿操作后。。。看了眼结果
NPOI库

丢雷楼谋
速度翻了30多倍!!
还是单线程

然后我又试了下第二次读取...第三次...
NPOI库2
果然是第三方酷

所以我就说,为什么我当初在网上找了很久都没有找到微软COM的dll

现在
老板给的任务超额完成了
把速度一天翻两倍
假装自己在忙着优化
就可以多轻松几天了
也不用写多线程了
所以我现在为什么还要找微软的dll?

Responses