No error message available, result code: E_FAIL(0x80004005)
2012-07-05 16:50 步丈天涯 阅读(2463) 评论(0) 编辑 收藏 举报做上传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步里,关键代码如下:
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,问题居然解决了,代码如下:
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,功能才正常。
参考资料: