如何取EXCEL 文件里面的表名?

bjcx994 2010-01-25 05:27:34
最好的解决方案是能在没有装EXCEL的电脑上读EXCEL文件到delphi
我现在是想用ADO连接到EXCEL,然后用一个查询查出里面的表,然后把数据读到 clientdataset 中
但是EXCEL的工作表名未知的情况下,不知该如何取出,如果是用 Extended Properties=Excel 8.0;好像没有装EXCEL的机器就不能用


下面的连接串用 ADO的GetTableNames取不到表名,但是我听说用这个方式连接的可以在不装EXCEL的电脑上用


dm.ADOConnUser.ConnectionString:=
'Driver={Microsoft Excel Driver (*.xls)};DBQ= ' +Trim(EdtXlsFile.Text);


用下面的连接串则可以正常取出


if UpperCase(ExtractFileExt(Trim(EdtXlsFile.Text)))='XLSX' then

begin
//为excel 2007 文件
dm.ADOConnUser.ConnectionString:=
'Provider=Microsoft.ACE.OLEDB.12.0;
Password='''';Data Source='+
Trim(NewAccountMonthWizard.EdtXlsFile.Text)
+';Extended Properties=''Excel 12.0;IMEX=1;HDR=YES'';
Persist Security Info=True;';
end
else
begin

dm.ADOConnUser.ConnectionString:='Provider=
Microsoft.Jet.OLEDB.4.0;Data Source='+
Trim(EdtXlsFile.Text) +';
Extended Properties=Excel 8.0
;Persist Security Info=False';
end ;





请高手指点,谢谢!
...全文
293 点赞 收藏 16
写回复
16 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
bjcx994 2010-02-06

原来是参数问题

dm.ADOConnUser.GetTableNames(lsttablename.Items ,False ); 就不行
dm.ADOConnUser.GetTableNames(lsttablename.Items ,True );就可以了



回复
bjcx994 2010-02-06
[Quote=引用 12 楼 jjwwang 的回复:]
Delphi syntax:

procedure GetTableNames(List: TStrings; SystemTables: Boolean = False);

应该能取得所有的sheet.
[/Quote]
是这个吗,如果是就取不到


procedure TADOConnection.GetTableNames(List: TStrings;
SystemTables: Boolean);
var
TypeField,
NameField: TField;
TableType: string;
DataSet: TADODataSet;
begin
CheckActive;
DataSet := TADODataSet.Create(nil);
try
OpenSchema(siTables, EmptyParam, EmptyParam, DataSet);
TypeField := DataSet.FieldByName('TABLE_TYPE'); { do not localize }
NameField := DataSet.FieldByName('TABLE_NAME'); { do not localize }
List.BeginUpdate;
try
List.Clear;
while not DataSet.EOF do
begin
TableType := TypeField.AsString;
if (TableType = 'TABLE') or (TableType = 'VIEW') or { do not localize }
(SystemTables and (TableType = 'SYSTEM TABLE')) then { do not localize }
List.Add(NameField.AsString);
DataSet.Next;
end;
finally
List.EndUpdate;
end;
finally
DataSet.Free;
end;
end;


回复
c58342418 2010-02-06
up
回复
auqfiudh 2010-02-04
ODBC
回复
Harryfin 2010-02-04
其实让客户装个EXCEL倒没什么,常用办公软件而已,我们都是这样要求的。
回复
bjcx994 2010-02-04
[Quote=引用 8 楼 yflk 的回复:]
5楼的方法可行,我在一个程序中也是用这种方法。只是表多时不好确定后面的表。
[/Quote]

你的连接串请问是如何写的,我现在也用这个,但是问题是我在用一楼所写的连接串时取不出表,但是如果自己写SQL是能查询出来的。
回复
YFLK 2010-02-04
5楼的方法可行,我在一个程序中也是用这种方法。只是表多时不好确定后面的表。
回复
idecl 2010-02-04
正在研究用BIFF8格式来直接读EXCEL的方法,这样就可以不装EXCEL了,也比OLE方式快
回复
CACACACACA 2010-02-04
Delphi syntax:

procedure GetTableNames(List: TStrings; SystemTables: Boolean = False);

应该能取得所有的sheet.
回复
bjcx994 2010-01-30
[Quote=引用 5 楼 diecode 的回复:]
用这个
dm.ADOConnUser.GetTableNames

我就是这么取的
[/Quote]

请问你的连接串是如何写的?
回复
diecode 2010-01-28
用这个
dm.ADOConnUser.GetTableNames

我就是这么取的
回复
bjcx994 2010-01-26
非OLE的方式有吗?
回复
亮剑_ 2010-01-25
通过OLE取当前Sheet名
ExcelApp.Workbooks[1].ActiveSheet
回复
bjcx994 2010-01-25
OLE的不喜欢,因为用OLE的话,电脑一定要装EXCEL,好像装了精简版的都会出问题!
回复
fall513 2010-01-25
只用过OLE的路过帮顶~~~
回复
相关推荐
发帖
数据库相关
创建于2007-08-02

2454

社区成员

Delphi 数据库相关
申请成为版主
帖子事件
创建了帖子
2010-01-25 05:27
社区公告
暂无公告