Я пишу приложение базы данных, используя Delphi, и мне нужно импортировать данные на лист Excel и сохранить их в базе данных доступа. Я понятия не имею, как это сделать, какие компоненты использовать, и если это вообще возможно, не могли бы вы мне помочь.
Как импортировать файл Excel в базу данных Access, используя delphi
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) используя компоненты адо, более гибкий способ.
{$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
Я всегда использовал ADO для таких вещей, когда дело доходит до Excel. Быстро и легко реализовать +1
- person ; 03.05.2012
Я обязательно попробую эти два метода и посмотрю, смогу ли я справиться, большое спасибо, ребята.
- person Japster; 03.05.2012
@RRUZ Я пробовал ваш пример кода выше, но получаю сообщение об ошибке: [Ошибка DCC] Unit1.pas(26): Идентификатор E2004 переобъявлен: «System.SysUtils». Так что я не мог не заставить программу скомпилировать
- person Japster; 06.05.2012
@Japster, возможно, вы используете этот код внутри другого проекта, если это так, проверьте, какой модуль
SysUtils
был объявлен один раз.
- person RRUZ; 06.05.2012
@RRUZ Я разобрался с ошибкой, кажется, я объявил ее дважды. Я использовал ваш первый пример, и он работал нормально. У меня просто были проблемы с повышением прав, если я переключаю UAC в Windows 7, он работает нормально, но я беспокоюсь, если люди, использующие приложение, не отключат UAC, приложение не будет импортировать данные.
- person Japster; 06.05.2012