为什么在ADO连接EXCEL后,这样取表的字段列表有时会出错?
cnExcel.GetFieldNames(sTableName, XlsFieldList) ;
应该是文件的关系,不知是文件大小还是文件中定义了链接或宏的缘故?

解决方案 »

  1.   

    to Dingobin(丁丁历险)
       不是很明白,能否详细说说?
      

  2.   

    XlsFieldList为空的。
    而且很奇怪的是,不是每个EXCEL文件都会这样,而且只要把文件中的该工作表另存为另外的文件也不会出现这问题,不知道这到底是什么问题/
      

  3.   

    以下是以前我回答过别人的一些文字,希望对你有帮助。经过摸索,我终于找到了方便快捷的通过jet把excel数据导出方法,我把我的一些经验写出来,希望对后人有帮助.
    假设有一个excel表d:\在职职工库.xls,簿中有一个表在职职工,其中有如下数据
               2002年5月职工花名册
    序号     姓名     性别    民族   工资
      1      张三       男     汉    800.00
      2      李四       男     回    1200.00
      3      张芸       女     汉    852.00
      4     何天荣      男     满    962.00现要把其中的职工数据导出到d:\zghmc.dbf.首先用excel打开d:\在职职工库.xls,选择包含职工数据的区域,不包括标题"2002年5月职工花名册",执行"插入->名称->定义",输入zgk,为所选的数据定义一个名称,关闭excel.
    如果你的excel表没有标题,完全是一个二维表,就不用定义名称,用adotable连接后设置tabledirect为true,你的excel数据库要有一个字段名,就像其它数据库一样是一个二维表.
    在project中加入一个ADOConnection1、一个ADOQuery1,添加以下代码:
    ADOConnection1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\在职职工库.xls;Extended Properties=excel 8.0;Persist Security Info=False';
    ADOQuery1.Connection:= ADOConnection1;
    ADOQuery1.SQL.Clear;
    ADOQuery1.SQL.Add('select * into zghmc in "d:\" "dBASE 5.0;" from zgk' );
    ADOQuery1.ExecSQL;
    ADOQuery1.Close;然后编译运行,就把excel中的职工数据导出到d:\zghmc.dbf中了。
    如果要在程序中显示excel中的数据,添加一个ADOTable1,设置Connection为ADOConnection1就可以了.
      

  4.   

    to dejoy(燕青):
       请问zgk是怎么设置的?手工?还是由程序设置?
    我的代码:
        cnExcel.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;' +
                                    'Data Source=' + AExcelFile + ';' +
                                    'Extended Properties=Excel 8.0;' +
                                    'Persist Security Info=False' ;
        cnExcel.LoginPrompt := false ;
        try
          cnExcel.Open ;
        except
          exit ;
        end;
        cnExcel.GetFieldNames(sTableName, XlsFieldList) ;  其中:1、AExcelFile为Excel文件名(包含路径);
          2、sTableName为Excel文件中第一个工作表名称;
          3、cnExcel为ADOConnection;
      

  5.   

    可能是GetFieldNames有问题吧。
    还是用ADOCONNECTION获取
      

  6.   

    cnExcel.GetFieldNames(sTableName, listbox1.Items) ;  

    adotable1.Connection:=cnexcel;
    adotable1.TableDirect:=true;
    adotable1.GetFieldNames(XlsFieldList);我不知道你的XlsFieldList是一个什么东西.
      

  7.   

    少了一句
    adotable1.TableName:='[Sheet1$]';
      

  8.   

    谢谢 dejoy(燕青) 
        XlsFieldList :TStringList,应该没什么问题吧。现在奇怪的是,有点文件没有问题,有点文件才会出现这样的问题。真是奇怪!
        另外,我想问一下,打开EXCEL文件时如何才能不出现一些是否调用宏之类的提示,谢谢!
      

  9.   

    to zfmich() 
    打开EXCEL文件时如何才能不出现一些是否调用宏之类的提示:
    去掉excel文件中的自定义宏或把相应宏进行数字签名有点文件没有问题,有点文件才会出现这样的问题打开excel表要求相应表第一行为字段列表
      

  10.   

    to  fontain() :
       “去掉excel文件中的自定义宏或把相应宏进行数字签名”
       是手工实现?还是程序实现?如果是程序实现?如何处理? 打开excel表要求相应表第一行为字段列表
      文件的格式都是一样的啊?
      

  11.   

    看office帮助,office有个人数字签名软件,只能用于本机。
    如果第一行不识字段列表,直接用ado打开可能会有问题