Cómo importar un archivo de Excel a la base de datos de Access, usando delphi
Frecuentes
Visto 8,218 veces
4
Estoy escribiendo una aplicación de base de datos, usando Delphi y necesito importar datos en una hoja de Excel y guardarlos en una base de datos de acceso. No tengo idea de cómo hacer esto, qué componentes usar, o si es posible, ¿pueden ayudarme?
1 Respuestas
11
Tienes varias opciones, prueba una de estas
1) usando el DoCmd.TransferSpreadsheet
function , este método es más simple pero no muy flexible.
{$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) utilizando los componentes ado, una forma más flexible.
{$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.
Respondido el 10 de Septiembre de 12 a las 11:09
Siempre he usado ADO para este tipo de cosas cuando se trata de Excel. Rápido y fácil de implementar +1 - user34411
Definitivamente probaré estos dos métodos y veré si puedo manejarlos, muchas gracias chicos. Japster
@RRUZ Probé el código de ejemplo anterior, pero aparece un error: [Error de DCC] Unit1.pas(26): E2004 Identificador redeclarado: 'System.SysUtils'. Así que no pude hacer que el programa compilara - Japster
@Japster, tal vez esté usando este código dentro de otro proyecto, si ese es el caso, verifique cuál es el SysUtils
unidad fue declarada una vez. - RRUZ
@RRUZ He solucionado el error, lo declaré dos veces al parecer. Usé tu primer ejemplo y funcionó bien. Acabo de tener problemas con la elevación, si cambio el UAC en Windows 7, funciona bien, pero me preocupa que las personas que usan la aplicación no cambien el UAC, la aplicación no importará datos. Japster
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas database delphi ms-access delphi-xe2 import-from-excel or haz tu propia pregunta.
un enfoque más largo sería guardarlo como csv usando COM, y luego analizar el archivo CSV y también validarlo. - user497849