2013-03-15 13:42:54      作者:有理想的码农
 
在对Excel进行读写操作时,使用微软自身提供的解决方案,有两种(第三方方式除外),分别是OLEDB方式和调用COM组件的方式

1. OLEDB方式

用这种方法读取Excel速度相对调用COM组件来讲是非常的快的,因为OLEDB方式就是把Excel当做一个数据库来操作的,将Excel作为一个数据源,直接用Sql语句获取数据。还有一个优点就是不需要安装Office Excel就可以使用。但是这种方式就是只能读取或者写入数据,但是对于Excel本身一些复杂的逻辑,如单元格合并,单元格着色等无法支持。

[csharp]

string connStr="";

if (fileType == ".xls")

connStr = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + fileName + ";" + ";Extended Properties=\"Excel 8.0;HDR=YES;IMEX=1\"";

else

connStr = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + fileName + ";" + ";Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1\"";

string strCom = "SELECT * FROM [Part$A7:AE] where [Part No]=" + PartNO;

OleDbConnection myConn = new OleDbConnection(strCon);

OleDbDataAdapter myCommand = new OleDbDataAdapter(strCom)

System.Data.DataTable partTable = new System.Data.DataTable();

myCommand.Fill(partTable);

在这种方式下,Excel中的内容会放到DataTable中。一种常用的做法是,先使用OLEDB的方式把数据读取到DataTable中进行缓存,然后再在DataTable中进行符合条件的筛选或者处理。当然如果需要向Excel中写入数据的情况下,就要使用insert语句直接向Excel中输入了。需要注意一点,当Excel中的单元格为空时,返回到DataTable中的值是DBNull,使用Convert.ToString()转换后是“”,而如果使用Convert.ToInt32()转换会抛出异常,而不是0.

2. 调用COM组件的方式

这种方式需要先引用 Microsoft.Office.Interop.Excel 。可以非常灵活的读取Excel中的数据,而且使用方式很丰富,基本上凡是打开Office Excel软件能够用鼠标点击完成的事,使用VSTO调用COM组件都能完成,而且可以调用Excel自身带的宏方法等。但是,如果是Web站点部署在IIS上时,还需要服务器机子已安装了Excel,有时候还需要为配置IIS权限。最重要的一点因为是基于单元格方式读取的,所以数据很慢。个人建议是,如果在大数据的循环中,比如for(int i=0; i<10000;i++){……}在这里的逻辑中不要使用COM对象,因为毕竟COM对象是非托管代码,调用时会有一个托管对象到非托管对象的转换,这好比是要经过的一扇门,比较费时费力的。

在向Excel中写入数据的时候,如果有10000行,一行一行的调用COM的Range row对象去赋值,是相当慢。此时,可以使用一个数组,把值累积到数组中,最后把数组一次赋给到所有的需要赋值的区域。此时需要注意,Range的区域要和数组的维度完全对应,否者会有一些奇怪的符号出现。在实际开发中的感觉是,如果数据量很大,而且有多个Excel需要比对的话,可以两种方式结合使用,可以把某个Excel的sheet缓存到DataTable中,然后跟另外的Excel去比较,如果最终需要将大量的数据写入到Excel中的时候,可以使用二维数组赋值的方式再写回到Excel中。

C#操作Excel的OLEDB方式与COM方式比较的更多相关文章

  1. C#使用oledb操作excel文件的方法

    本文实例讲述了C#使用oledb操作excel文件的方法.分享给大家供大家参考.具体分析如下: 不管什么编程语言都会提供操作Excel文件的方式,C#操作Excel主要有以下几种方式: 1.Excel ...

  2. oledb 操作 excel

    oledb excel http://wenku.baidu.com/search?word=oledb%20excel&ie=utf-8&lm=0&od=0 [Asp.net ...

  3. [Asp.net] C# 操作Excel的几种方式 优缺点比较

    在项目中我们常常需要将数据库中的数据导出成Excel文件 有一次工作中我的目的就是读取Excel到内存中,整理成指定格式 整理后再导出到Excel. 因为我要处理的每个Excel表格文件很大.一个表格 ...

  4. java操作excel常用的两种方式

    Excel是我们平时工作中比较常用的用于存储二维表数据的,JAVA也可以直接对Excel进行操作,在这篇博客中将为大家介绍两种操作Excel的方式,分别为:jxl和poi. 对于两者的区别网上有测试如 ...

  5. OleContainer操作Excel以二进制方式读写数据库

    需求源头:OleContainer操作Excel,想把Excel以二进制方式存入数据库,并且以二进制方式读取存入流:Procedure SaveToStream(ADOTable1: TAdoTabl ...

  6. Python操作excel的几种方式--xlrd、xlwt、openpyxl

    openpyxl xlrd xlwt   在处理excel数据时发现了xlwt的局限性–不能写入超过65535行.256列的数据(因为它只支持Excel 2003及之前的版本,在这些版本的Excel中 ...

  7. OLEDB操作Excel

    使用OLEDB操作Excel 的方法 OleDbConnection conn = null;            try            {              //fileName ...

  8. Microsoft.Ace.OleDb.12.0 操作excel

    在用c#操作excel的时候,碰到了一下的问题: 1.Microsoft.Ace.OleDb.12.0未安装,可以到下载2007 Office system 驱动程序AccessDatabaseEng ...

  9. Python学习随笔:使用xlwings设置和操作excel多行多列数据以及设置数据字体颜色填充色对齐方式的方法

    ☞ ░ 前往老猿Python博文目录 ░ 在前面老猿的文章中,<Python学习随笔:使用xlwings读取和操作Excel文件>.<Python学习随笔:使用xlwings读取和操 ...

随机推荐

  1. Java知识点:instanceof关键字

    介绍 格式:a instanceof B,其中a是一个variable(设a所指向的对象的类型命名为A,即A是一个type. 功能:判断A是否 is-a B. 当a=null时,始终返回false. ...

  2. tomcat 默认项目设置

    正常情况下,我们启动tomcat后,直接输入“http://localhost:端口/“ 后,默认访问道是webapp目录下的ROOT应用. 我们要通过上述方式访问自己的应用,有俩种方式. 第一:把自 ...

  3. django - 修改 request.POST的值

    # querydict改为mutable data = data.copy() data.update({'key_list': DATA_UPLOAD_PARAMETER}) 默认的request. ...

  4. 【转】 CATransform3D 矩阵变换之立方体旋转实现细节

    原文网址:http://blog.csdn.net/ch_soft/article/details/7351896 第一部分.前几天做动画,使用到了CATransform3D ,由于没有学过计算机图形 ...

  5. Android提升进入界面的速度

    应用除了有内存占用.内存泄露.内存抖动等看不见的性能问题外,还有很多看得见的性能问题,比如进入界面慢.点击反应慢.页面卡顿等等,这些看得见的体验问题会严重影响用户使用APP心情,但用户的情绪又无法通过 ...

  6. Permutations java实现

    Given a collection of numbers, return all possible permutations. For example,[1,2,3] have the follow ...

  7. C#网络资源列表

    1, http://club.topsage.com/thread-371996-1-1.html

  8. golang学习之指针、内存分配

    func pointer_test() { //空指针,输出为nil var p *int fmt.Printf("p: %v\n", p) //指向局部变量,变量值初始为0 va ...

  9. POJ 2728 Desert King 01分数规划,最优比率生成树

    一个完全图,每两个点之间的cost是海拔差距的绝对值,长度是平面欧式距离, 让你找到一棵生成树,使得树边的的cost的和/距离的和,比例最小 然后就是最优比例生成树,也就是01规划裸题 看这一发:ht ...

  10. web自动化框架之三获取数据库值与界面值比较~~

    数据库用到的是mysql,框架涉及数据库,主要包含两个方面,一个是每个案例执行完毕后,插入案例相关信息与数据:一个是web界面数据核对的时候,需要从sql中获取某行某列值与界面某个值做比较. 描述:w ...