请教:ADO连接EXCEL的问题

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

15 个解决方案

#1


把连接去掉试一试

#2


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

#3


什么错误??

#4


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

#5


你把详细的代码贴出来,并且说明详细的错误

#6


以下是以前我回答过别人的一些文字,希望对你有帮助。

经过摸索,我终于找到了方便快捷的通过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就可以了.

#7


好东西!

#8


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;

#9


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

#10


cnExcel.GetFieldNames(sTableName, listbox1.Items) ;  

adotable1.Connection:=cnexcel;
adotable1.TableDirect:=true;
adotable1.GetFieldNames(XlsFieldList);

我不知道你的XlsFieldList是一个什么东西.

#11


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

#12


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

#13


to zfmich() 
打开EXCEL文件时如何才能不出现一些是否调用宏之类的提示:
去掉excel文件中的自定义宏或把相应宏进行数字签名

有点文件没有问题,有点文件才会出现这样的问题

打开excel表要求相应表第一行为字段列表

#14


to  fontain() :
   “去掉excel文件中的自定义宏或把相应宏进行数字签名”
   是手工实现?还是程序实现?如果是程序实现?如何处理?

 打开excel表要求相应表第一行为字段列表
  文件的格式都是一样的啊?

#15


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

#1


把连接去掉试一试

#2


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

#3


什么错误??

#4


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

#5


你把详细的代码贴出来,并且说明详细的错误

#6


以下是以前我回答过别人的一些文字,希望对你有帮助。

经过摸索,我终于找到了方便快捷的通过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就可以了.

#7


好东西!

#8


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;

#9


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

#10


cnExcel.GetFieldNames(sTableName, listbox1.Items) ;  

adotable1.Connection:=cnexcel;
adotable1.TableDirect:=true;
adotable1.GetFieldNames(XlsFieldList);

我不知道你的XlsFieldList是一个什么东西.

#11


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

#12


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

#13


to zfmich() 
打开EXCEL文件时如何才能不出现一些是否调用宏之类的提示:
去掉excel文件中的自定义宏或把相应宏进行数字签名

有点文件没有问题,有点文件才会出现这样的问题

打开excel表要求相应表第一行为字段列表

#14


to  fontain() :
   “去掉excel文件中的自定义宏或把相应宏进行数字签名”
   是手工实现?还是程序实现?如果是程序实现?如何处理?

 打开excel表要求相应表第一行为字段列表
  文件的格式都是一样的啊?

#15


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