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. Linq 时间对比陷阱坑

    同样的两个datetime 格式的时间     2013年12月2日 17点29分57秒  

  2. django - request.raw_post_data 与 request.body

    request.raw_post_data 重命名成了 request.body - 在1.3版本之后. 这是当时 起票 的讨论内容:https://code.djangoproject.com/ti ...

  3. Java [Leetcode 94]Binary Tree Inorder Traversal

    题目描述: Given a binary tree, return the inorder traversal of its nodes' values. For example:Given bina ...

  4. oracle查询某个用户下的所有视图

    SYS>select view_name from dba_views where owner = 'NS_RAS3'; VIEW_NAME--------------------------- ...

  5. (5)Quartz学习

    原文:http://blog.csdn.net/zxl315/article/details/10879927 介绍Quartz Quartz是一个开源的任务调度系统,它能用来调度很多任务的执行. 运 ...

  6. JQuery实现——黑客帝国代码雨效果

    效果如你所见就是本页面上方那样的效果 实现方法来自一个印度小伙纸,学习完我也没总结一下,今儿个补上 如何实现,大家右键查看源码复制即可,不过学习的过程还是要总结总结. 下面通过另外两个小例子,一步一步 ...

  7. TCP/IP详解学习笔记(12)-TCP的超时与重传

    超时重传是TCP协议保证数据可靠性的另一个重要机制,其原理是在发送某一个数据以后就开启一个计时器,在一定时间内如果没有得到发送的数据报的ACK报文,那么就重新发送数据,直到发送成功为止. 1.超时 超 ...

  8. Android欢迎界面的创建方法

    1.制作一张启动图片splash.png,放置在res->drawable-hdpi文件夹中.2.新建布局文件splash.xml <?xml version="1.0" ...

  9. HDU 4336-Card Collector(状压,概率dp)

    题意: 有n种卡片,每包面里面,可能有一张卡片或没有,已知每种卡片在面里出现的概率,求获得n种卡片,需要吃面的包数的期望 分析: n很小,用状压,以前做状压时做过这道题,但概率怎么推的不清楚,现在看来 ...

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

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