Cómo importar un archivo de Excel a la base de datos de Access, usando delphi

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?

preguntado el 02 de mayo de 12 a las 19:05

un enfoque más largo sería guardarlo como csv usando COM, y luego analizar el archivo CSV y también validarlo. -

1 Respuestas

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 or haz tu propia pregunta.