DELPHI应用EXCEL(5) Firedac连接EXCEL数据表

可以将EXCEL表当做数据库连接,方法是使用ODBC进行连接。

见下列语句:

if not dlgOpen1.Execute then Exit;
  con1.Connected:=False;
  con1.Params.Clear;
  con1.DriverName:='odbc';
  con1.Params.add('database='+dlgOpen1.FileName);
  con1.Params.Add('odbcdriver='+'{Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)}');
  //con1.Params.Add("DataSource=Excel Files");//或者这一句也可以,安装EXCEL后默认生成的ODBC设置
  con1.Connected:=True;
  con1.GetInfoReport(lst1.Items);
  con1.GetTableNames('','','',lst1.Items, [osSystem], [tkTable], False);

需要注意的是,获取表的名称时,使用了过程GetTableNames,其原型是:

procedure GetTableNames(const ACatalogName, ASchemaName, APattern: string;
      AList: TStrings; AScopes: TFDPhysObjectScopes = [osMy];
      AKinds: TFDPhysTableKinds = [tkSynonym, tkTable, tkView];
      AFullName: Boolean = True);

需要注意的是,第五个参数AScopes应该是OSsystem,而不是默认参数(默认参数主要用于从数据库中获取自己权限的表名,而EXCEL的sheet是系统表名)。

此外,EXCEL的表名有时候会进行处理,当sheet名中包含特殊字符时,会在表名前加‘`’包括起来,这个符号的编码是96,但不确定在不同的系统中是否相同,所以进行了一定的处理如下:

  s:=lst1.Items[lst1.ItemIndex];
  if not (s[1] in ['0'..'9','A'..'Z','a'..'z']) then
  begin
   // ShowMessage(S[1]+':'+Ord(S[1]).ToString());
    s:=s.Substring(1,s.Length-2);
  end;
  s:=Format('SELECT * FROM [%S]',[s]);

完成以上工作后,可以把EXCLL文件当数据库一样进行处理。在实际操作中你会发现,EXCEL的工作表是以“[”和”]”括起来,并以$结束,例如,sheet1对应的表名是[sheet1$]。

还需要注意的是:

  •  默认第一行是列名。
  • 列的数量不能超过255列。
  • 每列的字符串长度不能超过255.

最后提示:

1、已经在excel中打开的文件不宜作为数据库。

2、在select语句中,可以使用任何excel的函数。

posted @ 2022-11-22 09:06  Luo大哥  阅读(409)  评论(0编辑  收藏  举报