2012-05-02 25 views
4

Delphiを使用してデータベースアプリケーションを作成し、Excelシートでデータをインポートしてアクセスデータベースに保存する必要があります。私はこれをどうやって行うのか、どのコンポーネントを使うべきか、それが可能なのかどうかわからない。あなたが私を助けてくれますか?デルファイを使用してAccessデータベースにExcelファイルをインポートする方法

+0

より長いアプローチは、COMを使用してCSVファイルを保存し、CSVファイルを解析して検証することです。 – ComputerSaysNo

答えて

12

あなたはいくつかの選択肢があり、DoCmd.TransferSpreadsheet機能を使用して)これらの

1の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

私は間違いなくこれらの2つの方法を試してみて、私が管理できるかどうか、たくさんの人に感謝 – Japster

+0

@RRUZ上記のサンプルコードを試しましたが、エラーが発生します:[DCCエラー] Unit1.pas (26):E2004識別子が再宣言されました: 'System.SysUtils'。だから、私はプログラムを – Japster

関連する問題