No error message available, result code: E_FAIL(0x80004005)

做上传Excel文件这个功能的时候,遇到个奇怪的事情。

我的程序里上传Excel文件的过程是这样的:

1.将用户选择上传的文件保存到服务器上

2.使用 Provider=Microsoft.Ace.OLEDB.12.0 打开这个文件,然后读取文件内容,加载到DataTable里

关键在于上面第2步,本地开发环境怎么debug都是没问题的;一旦发布到服务器上,文件size小一点的没有问题,大于大约1M的话,就会报错,

错误有2个(不是同时出现):

a) external table is not in the expected format

b) No error message available, result code: E_FAIL(0x80004005)

上面第2步里,关键代码如下:

View Code
string strConn = "Provider=Microsoft.Ace.OLEDB.12.0;Data Source=" + filename + ";Extended Properties=Excel 12.0 Xml;";

OleDbDataAdapter oda = new OleDbDataAdapter("select * from [Sheet1$]", strConn);

DataSet ds = new DataSet();
oda.Fill(ds); //error

后来,在Provider里加了HDR=Yes; IMEX=1,问题居然解决了,代码如下:

View Code
string strConn = "Provider=Microsoft.Ace.OLEDB.12.0;Data Source=" + filename + ";Extended Properties=\"Excel 12.0 Xml;HDR=Yes;IMEX=1\";";

查了一下微软官方的资料,找出了HDR, IMEX的相关解释:

HDR,即Header Row,HDR=Yes则表明Excel文件里第一行作为header,不作为数据考虑。比如,把Excel文件里数据读入到DataTable,HDR=Yes,则Excel文件里第一行作为这个DataTable的字段名。HDR的Default值是Yes。

IMEX,即Import/Export Mode,IMEX的Default值是2(?待确定)有3种:

IMEX=0 is Export mode  //Write Only
IMEX=1 is Import mode  //Read Only
IMEX=2 is Linked mode (full update capabilities)  //Read/Write

当IMEX=1时,即Import Mode,在读取Excel文件时,如果该文件的某列存在Mixed Data的情况(比如数字和字符串结合的情况:CN123),会把该单元格里的值的类型转换成注册表里ImportMixedTypes(win7路径:HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Jet/4.0/Engines/Excel)的值。比如ImportMixedTypes=text,则把CN123的类型转成text型,这样,就不会出现异常情况了(当然还要考虑TypeGuessRows,这里不赘述)。

当IMEX=0或2时,在读取Excel文件时,会忽略掉注册表里的ImportMixedTypes,转而以MajorityType类型返回单元格里的数据。

TypeGuessRows,ImportMixedTypes需要在注册表里手动更改。ImportMixedTypes共有两种类型:MajorityType和Text,它的Default值是Text。

我遇到的问题虽然解决了,但还是没搞清楚问题的症结:

在没有加HDR=Yes; IMEX=1时,文件size大约小于1M的话,功能是没问题的(列里有Mixed Data情形);

当大于1M的时候,只有加上HDR=Yes; IMEX=1,功能才正常。

 参考资料:

http://support.microsoft.com/kb/257819

http://office.microsoft.com/en-us/access-help/initializing-the-microsoft-excel-driver-HP001032159.aspx

http://www.instantpages.ltd.uk/ADODB_WP.htm

原文地址:https://www.cnblogs.com/bobliu/p/2573460.html