2012-05-02 4 views
4

델파이를 사용하여 데이터베이스 애플리케이션을 작성하고 Excel 시트에서 데이터를 가져 와서 액세스 데이터베이스에 저장해야합니다. 나는 이것을 어떻게하는지, 어떤 구성 요소를 사용하는지, 심지어 가능할 지 모른다면 나를 도울 수 있습니까?델파이를 사용하여 엑셀 파일을 Access 데이터베이스로 가져 오는 방법

+0

더 긴 방법은 COM을 사용하여 CSV를 저장 한 다음 CSV 파일을 구문 분석하고 유효성을 검사하는 것입니다. – ComputerSaysNo

답변

12

당신은 DoCmd.TransferSpreadsheet 기능을 사용하여)이

1 중 하나를 시도, 몇 가지 옵션이 있습니다,이 방법은 간단하지만 매우 유연하지 않습니다.

{$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) AD 구성 요소를 사용하면 더 유연한 방법을 사용할 수 있습니다.

{$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. 
+0

Excel과 관련하여 필자는 항상 ADO를 사용했습니다. 빠르고 쉽게 구현 +1 – Gerard

+0

나는이 두 가지 방법을 시도해보고 관리 할 수 ​​있는지 확인합니다. 많은 사람들에게 감사합니다. – Japster

+0

@RRUZ 위의 예제 코드를 시도했지만 오류가 발생했습니다 : [DCC 오류] Unit1.pas (26) : E2004 식별자가 다시 선언되었습니다 : 'System.SysUtils'. 그래서 컴파일 할 프로그램을 얻을 수 없었습니다 – Japster

관련 문제