如何使用delphi将Excel文件导入Access数据库
Posted
技术标签:
【中文标题】如何使用delphi将Excel文件导入Access数据库【英文标题】:How to import an Excel file into Access database, using delphi 【发布时间】:2012-05-02 18:15:11 【问题描述】:我正在编写一个数据库应用程序,使用 Delphi,需要在 Excel 工作表上导入数据并将其保存在 Access 数据库中。我不知道如何做到这一点,使用什么组件,或者如果可能的话,请你帮帮我。
【问题讨论】:
更长的方法是使用 COM 将其保存为 csv,然后解析 CSV 文件并对其进行验证。 【参考方案1】:您有多种选择,请尝试其中一种
1) 使用DoCmd.TransferSpreadsheet
函数,这种方法比较简单,但不是很灵活。
$APPTYPE CONSOLE
$R *.res
uses
SysUtils,
ActiveX,
ComObj;
procedure ImportDataAccess(const AccessDb, TableName, ExcelFileName:String);
Const
acQuitSaveAll = $00000001;
acImport = $00000000;
acSpreadsheetTypeExcel9 = $00000008;
acSpreadsheetTypeExcel12 = $00000009;
var
LAccess : OleVariant;
begin
//create the COM Object
LAccess := CreateOleObject('Access.Application');
//open the access database
LAccess.OpenCurrentDatabase(AccessDb);//if the access database doesn't exist use the NewCurrentDatabase method instead.
//import the data
LAccess.DoCmd.TransferSpreadsheet( acImport, acSpreadsheetTypeExcel9, TableName, ExcelFileName, True);
LAccess.CloseCurrentDatabase;
LAccess.Quit(1);
end;
begin
try
CoInitialize(nil);
try
ImportDataAccess('C:\Data\Database1.accdb','Sales','C:\Data\Sales.xlsx');
Writeln('Done');
finally
CoUninitialize;
end;
except
on E:EOleException do
Writeln(Format('EOleException %s %x', [E.Message,E.ErrorCode]));
on E:Exception do
Writeln(E.Classname, ':', E.Message);
end;
Writeln('Press Enter to exit');
Readln;
end.
2) 使用ado组件,更灵活的方式。
$APPTYPE CONSOLE
$R *.res
uses
Data.DB,
Data.Win.ADODB,
SysUtils,
ActiveX,
ComObj;
procedure ImportDataADO(const AccessDb, TableName, ExcelFileName:String);
var
LAdoQueryExcel : TADOQuery;
LADOAccesCmd : TADOCommand;
begin
LAdoQueryExcel:=TADOQuery.Create(nil);
LADOAccesCmd:=TADOCommand.Create(nil);
try
//set the connection string for access
LADOAccesCmd.ConnectionString:=Format('Provider=Microsoft.ACE.OLEDB.12.0;Data Source=%s;',[AccessDb]);
LADOAccesCmd.Parameters.Clear;
LADOAccesCmd.CommandText:='INSERT INTO Sales (id,name) VALUES (:id,:name)';
LADOAccesCmd.ParamCheck:=False;
//set the connection string for excel
LAdoQueryExcel.ConnectionString:=Format('Provider=Microsoft.ACE.OLEDB.12.0;Data Source=%s;Extended Properties="Excel 12.0 Xml;HDR=YES;IMEX=1"',[ExcelFileName]);
LAdoQueryExcel.SQL.Add('SELECT * FROM [Sheet1$]');
LAdoQueryExcel.Open;
while not LAdoQueryExcel.eof do
begin
LADOAccesCmd.Parameters.ParamByName('id').Value := LAdoQueryExcel.FieldByname('id').AsInteger;
LADOAccesCmd.Parameters.ParamByName('name').Value := LAdoQueryExcel.FieldByname('name').AsString;
LADOAccesCmd.Execute;
LAdoQueryExcel.Next;
end;
finally
LAdoQueryExcel.Free;
LADOAccesCmd.Free;
end;
end;
begin
try
CoInitialize(nil);
try
ImportDataADO('C:\Datos\Database1.accdb','Sales','C:\Datos\Sales.xlsx');
Writeln('Done');
finally
CoUninitialize;
end;
except
on E:EOleException do
Writeln(Format('EOleException %s %x', [E.Message,E.ErrorCode]));
on E:Exception do
Writeln(E.Classname, ':', E.Message);
end;
Writeln('Press Enter to exit');
Readln;
end.
【讨论】:
当涉及到 Excel 时,我一直使用 ADO 来处理这类事情。快速且易于实施 +1 我一定会试试这两种方法,看看能不能搞定,非常感谢大家 @RRUZ 我已经尝试了上面的示例代码,但我收到一个错误:[DCC Error] Unit1.pas(26): E2004 Identifier redeclared: 'System.SysUtils'。所以我无法让程序编译 @Japster,也许您正在另一个项目中使用此代码,如果是这种情况,请检查SysUtils
单元被声明一次。
@RRUZ 我已经解决了这个错误,我似乎宣布了两次。我用了你的第一个例子,效果很好。我只是遇到了海拔问题,如果我在 Windows 7 中切换 UAC,它工作正常,但我担心如果使用该应用程序的人没有切换 UAC,那么该应用程序将不会导入数据以上是关于如何使用delphi将Excel文件导入Access数据库的主要内容,如果未能解决你的问题,请参考以下文章
delphi 如何在Delphi中执行将Excel表格里的内容导入数据库中相应表