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的函数。