Как да импортирате файл на Excel в база данни на Access, като използвате delphi

Пиша приложение за база данни, използвайки Delphi и трябва да импортирам данни в лист на Excel и да ги запазя в база данни за достъп. Нямам представа как да направя това, какви компоненти да използвам или ако изобщо е възможно, можете ли да ми помогнете.


person Japster    schedule 02.05.2012    source източник
comment
по-дълъг подход би бил да го запишете като csv с помощта на COM и след това да анализирате CSV файла и също да го валидирате.   -  person    schedule 03.05.2012


Отговори (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.
person RRUZ    schedule 02.05.2012
comment
Винаги съм използвал ADO за този тип неща, когато става въпрос за Excel. Бърз и лесен за изпълнение +1 - person ; 03.05.2012
comment
Определено ще опитам тези два метода и ще видя дали мога да се справя, благодаря много момчета - person Japster; 03.05.2012
comment
@RRUZ Опитах вашия примерен код по-горе, но получавам грешка: [DCC Error] Unit1.pas(26): E2004 Identifier redeclared: 'System.SysUtils'. Така че не можах да не накарам програмата да се компилира - person Japster; 06.05.2012
comment
@Japster, може би използвате този код в друг проект, ако случаят е такъв, проверете коя единица SysUtils е била декларирана веднъж. - person RRUZ; 06.05.2012
comment
@RRUZ Подредих грешката, декларирах я два пъти, изглежда. Използвах първия ви пример и той работи добре. Току-що имах проблеми с повишаването, ако превключа UAC в Windows 7, работи добре, но се притеснявам, ако хората, които използват приложението, не превключат там UAC, приложението няма да импортира данни - person Japster; 06.05.2012