zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    《人月神话》读后感
    十天冲刺计划(第二次)
    日历表的事件处理和管理(刘静)
    十天冲刺计划
    结组开发项目(TD学生助手)
    电梯调度(二)
    敏捷软件开发方法综述
    对于二维数组求子数组的和的最大值
    电梯调度(一)
    FloatyFish休闲游戏 Beta正式发布
  • 原文地址:https://www.cnblogs.com/bobliu/p/2573460.html
Copyright © 2011-2022 走看看