使用OleDb读取Excel文档不成功的原因分析及解决办法
当使用OleDb访问Excel文件时,不管使用的是Microsoft.Jet.OLEDB.4.0,还是Microsoft.ACE.OLEDB.12.0,也不管是否在连接Excel时,是否使用了IMEX=1强制把混合数据字段强制为文本,都有可能出现某些单元格读取不到值的情况,这是一个普遍的问题。
如下的文档就有可能出现单元格数据读不出的可能性:

出现的原因是,OleDb不能识别Excel字段的数据类型。使用OleDb读取Excel时,字段类型都是由Asp.net来推断的。推断的大致过程是,Asp.net取前面n条记录(n小于10),从这个很小的数据集合中推定所属字段类型。问题正好出现在这里,假设在前面的10行数据类型都是double时,它就认为这一列是double,对于非double类型的数据都只会简单的返回DBNull。这样就会造成有的单元格数据读取不出来了。
解决这个问题的办法,最安全的办法是直接使用Excel组件来读取xls文件。为引入Excel组件,我们需要添加Excel 12.0类库:

添加组件后,会出现下面的程序集:

在代码中,只要引入添加下面的命令空间即可操作Excel:

添加组件后,会出现下面的程序集:

在代码中,只要引入添加下面的命令空间即可操作Excel:
using Microsoft.Office.Interop.Excel;
ApplicationClass app = null;
WorkbookClass w = null;
Worksheet datasheet = null;
打开Excel文件:
app = new ApplicationClass();
app.Visible = false;
w = (WorkbookClass)app.Workbooks.Open("D:\\excel.xls", missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing);
datasheet = (Worksheet)(w.Worksheets["Sheet1"]);//也可以使用下标,从1开始
读取数据
range = datasheet.get_Range("AA11", "AD11");
Array array = (System.Array)range.Formula;
String AA11 = array.GetValue(1, 1); //AA11单元格数据
String AD11 = array.GetValue(1, 4); //AD11单元格数据
w.Close(XlSaveAction.xlDoNotSaveChanges, "D:\\excel.xls", missing);
app.Quit();
app = null;
至此使用Microsoft Excel 12.0 Object Libray读取Excel就过程就结束了。使用Excel12类库读取的话,需要在服务器安装Office软件才能正常运行。
Tag标签: 读取Excel OleDb
- 1. 使用OleDb读取Excel文档不成功的原因分析及解决办法2009-06-16





