如何取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 ;





请高手指点,谢谢!
...全文
372 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
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的路过帮顶~~~

2,507

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧