用ADO读取Excel文件,对于绝大多数单元格内容(都是文本格式)可以读出,但是对于某些个别的单元格读出为NULL.
我发现在各个单元格中如果是数字但是被当作文本显示时会在单元格左上角出现一个绿色的标记:数字为当作文字处理。这样的单元格可以被ADO顺利读出,而我这里提问的那些特别的单元格如果是数字则没有绿色的标记出现,就读成NULL了。
不知这个问题如何解决,从VC端或Excel端解决都行,只要是由计算机找出这些有问题的单元格就行。
如果需要,我可以Email给你有问题的Excel文件。

解决方案 »

  1.   

    可以尝试用office自动化来解决
      

  2.   

    [email protected] 顺便把你的到入到excel的代码一起发。
      

  3.   

    to goodboyws(深夜不眠者(VCMVP)) 网友,
    可是我没有得到问题答案,也必须给分吗?
      

  4.   

    可能是Excel中字段类型不一致吧!你应该用CDBVariant去读,判断什么类型字段,然后在定
      

  5.   

    亲人啊,我也遇到类似问题。我是用的ODBC方式读取EXCEL。环境:VC6.0,OS:XP,EXCEL 2000。读取的具体方式如这里描述:
    http://www.vckbase.com/document/viewdoc/?id=421。只有一点略有不同,他用的字段名取:
    recset.GetFieldValue("Name ", sItem1);//sItem1为CString Type
    我用的字段索引号取:
    recset.GetFieldValue(index, sItem1);//index为short Type我取的区域都是数字,但某些列的读取正常,某些明明有数却读个NULL出来。
    如果在这些无法正确读取的数前面加“'”(英文单撇号),就可以正确读取。
      

  6.   

    新发现。用CDBVariant保存单元格内容,发现出问题的单元格类型都是“DBVT_NULL”,正常读取的都是“DBVT_DOUBLE”。有兴趣的朋友可以看一下这个EXCEL:http://zyfly.net/rar/0603.rar。从单元格E8开始,每列的类型依次是:
    NULL、NULL、  DOUBLE,//简写类型
    NULL、DOUBLE、DOUBLE,
    NULL、DOUBLE、DOUBLE,
    NULL、DOUBLE、DOUBLE,
    NULL、DOUBLE、DOUBLE。太见鬼了!
      

  7.   

    http://support.microsoft.com/default.aspx?scid=kb;zh-cn;257819
      

  8.   

    http://whalechen.cnblogs.com/archive/2006/04/26/385930.html
      

  9.   

    void CExcel_ReadDlg::OnButton1() 
    {
    CSpreadSheet SS("C:\\0603.xls", "Sheet1");

    CStringArray Rows, Column;

    for (int i=1; i<=SS.GetTotalRows(); i++) {
    // 读取一行
    SS.ReadRow(Rows, i);
    CString strContents = "";
    for (int j=1; j<=Rows.GetSize(); j++) {
    if (j==1)
    strContents = Rows.GetAt(j-1);
    else
    strContents = strContents +  "-->" + Rows.GetAt(j-1);
    }

    }
    }
    ***********************
    用CSpreadSheet的方法也试了,结果还是一样。查看该类实现代码,内部也是一样的ODBC实现方法。
      

  10.   

    看来多等了这几天真没白等,立即给分并且提交FAQ,给热心人增加信誉
      

  11.   

    jazy兄,你的方法我看了,但依然找不到解决之道。我用的是ODBC的方法,代码如下:sDriver = "MICROSOFT EXCEL DRIVER (*.XLS)";
    sDsn.Format("ODBC;DRIVER={%s};DSN='';DBQ=%s", sDriver, m_sFileXls);
    TRY {
    database.Open(NULL, FALSE, FALSE, sDsn);
    CRecordset recset( &database );
    sSql = "SELECT * FROM [sheet1$]";//所以被处理的EXL表必须改名"sheet1"
    recset.Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly);
    ………………
    后来改成:
    sDsn.Format("ODBC;DRIVER={%s};DSN='';DBQ=%s;IMEX=1", sDriver, m_sFileXls);
    增加了“IMEX=1”,还是不行。还望指教!
      

  12.   

    ODBC不懂我曾经为这个问题把一个项目所有数据库访问方式修改为ADO了,hoho
      

  13.   

    再请教JAZY,我尝试用ADO方式,连接字符中一旦加入HDR=NO或IMEX=1,连接就出错,不加是对的,请问这两个参数该如何加啊?
    m_pCon->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\test2.xls;Extended Properties=Excel 8.0;HDR=NO;IMEX=1", "", "", adModeUnknown);
      

  14.   

    是这样写:
    Extended Properties=\"Excel 8.0;HDR=NO;IMEX=1\"
    这里要用一层引号把“Extended Properties=”之后的东东引起来。