求助,原码,如何在delphi中编程把excel中的数据导入到指定的SQL Server数据库指定表中(100分)

  • 主题发起人 主题发起人 笨重20
  • 开始时间 开始时间

笨重20

Unregistered / Unconfirmed
GUEST, unregistred user!
如何在delphi中编程把excel中的数据导入到指定的SQL Server数据库指定表中
 
你可以在这里搜索使用sql语言的载入方式。
我给你一段代码参考,方法效率很低,供参考。
function InputDataFromExcel(FileName:string; tablename:string; Append_flag:Boolean; keyFieldName:string):integer;
var no,i,j:integer;
tt:TStrings;
SheetName:string; //
begin
with datam.DataM1 do //首先查找数据库中是否已经存在。如果存在,则修改已经存在的数据。
begin
ExcelConnection.Close;
ExcelConnection.ConnectionString:='Provider=MSDASQL.1;Persist Security Info=False;Extended Properties="DSN=Excel Files;'+
'DBQ='+FileName+';DriverId=790;MaxBufferSize=2048;PageTimeout=5;"';
ExcelConnection.Open;
tt:=tstringlist.Create;
ExcelConnection.GetTableNames(tt,true);
SheetName:=tt.Strings[0];
ExcelQuery1.Close;
ExcelQuery1.SQL.Clear;
ExcelQuery1.SQL.Add('select * from ['+SheetName+'] '); //全部数据
ExcelQuery1.Open; //打开EXCEL文件.
if ExcelQuery1.IsEmpty then Exit; //excel中无数据,无法载入.
if Append_flag=false then
begin
command1.CommandText:='delete from '+tablename;
command1.Execute;
end;
inputdata.Close; //打开要载入数据的表.
inputdata.SQL.Clear;
inputdata.SQL.Add('select * from '+tablename);
inputdata.Open;
tt.Clear;
//寻找载入数据库中,字段对应的情况.
for i:=0 to inputdata.FieldCount-1 do
begin
for j:=0 to ExcelQuery1.FieldCount-1 do
begin
if uppercase(Trim(inputdata.fields.fields.FullName))=uppercase(Trim(ExcelQuery1.fields.fields[j].FullName)) then
// if Trim(inputdata.fields.fields.FullName)=Trim(ExcelQuery1.fields.fields[j].FullName) then
begin
tt.Add(Trim(inputdata.fields.fields.FullName));
end;
end;
end;
no:=0;
if Append_flag=false then
begin//全新追加,不考虑该项数据,
repeat
if ExcelQuery1.fieldbyname(tt.Strings[0]).IsNull then break;
inputdata.Append;
inputdata.Edit;
for i:=0 to tt.Count-1 do
begin
inputdata.fieldbyname(tt.Strings).AsVariant:=ExcelQuery1.fieldbyname(tt.Strings).AsVariant;
end;
inputdata.Post;
inc(no);
ExcelQuery1.Next;
Application.ProcessMessages;
until ExcelQuery1.Eof;
end
else
begin//覆盖,先检查是否已经存在,存在的覆盖。
for i:=0 to tt.Count-1 do
begin//寻找关键字段的序号
if keyFieldName=tt.Strings then
begin
j:=i;
break;
end;
end;
repeat
if ExcelQuery1.fieldbyname(tt.Strings[0]).IsNull then break;
if not inputdata.Locate(keyFieldName,ExcelQuery1.fieldbyname(tt.Strings[j]).AsVariant, [loCaseInsensitive]) then
inputdata.Append; //如果该想数据不存在, 则追加新的,
inputdata.Edit;
for i:=0 to tt.Count-1 do
begin
inputdata.fieldbyname(tt.Strings).AsVariant:=ExcelQuery1.fieldbyname(tt.Strings).AsVariant;
end;
inputdata.Post;
inc(no);
ExcelQuery1.Next;
Application.ProcessMessages;
until ExcelQuery1.Eof;
end;
ExcelConnection.Close;
end;
InputDataFromExcel:=no;
// messagedlg('数据载入完毕,共载入数据:'+IntToStr(no)+' 项。',mtinformation, [mbok],0);
end;
 
把excel看成是数据源。用SQL语句
 
同意楼上,把excel看成是数据源,用SQL语句 select into即可 。
不过这需要设置ado控件的direct属性为true,然后再设置该ado的 table(tablename)
的属性为该execl (表,此时它已经当作表了),然后就是与普通表一样使用了。

楼主可以搜索离线数据库“direct属性”查查,应该有的。
呵呵,祝你好运!
 
比较简单的方法

xlsFileName:='C:/Documents and Settings/...xls';
eclApp:=CreateOleObject('Excel.Application');
eclApp.WorkBooks.Open(xlsfilename );
eclApp.WorkSheets[1].Activate;
//linecount, columncount 是excel中的行及列
for i:=linecount to linecount do
begin
for j:=columncount to columncount do
begin
if j=1 then A:=trim(eclapp.cells.item[i,j]);
//读取excel中的cell赋值给变量A
next;
end;
//用query直接向数据库insert记录
with adoquery1 do begin
close;
sql.Clear;
sql.add('INSERT INTO table');
sql.add(format('VALUES (''%s'',[A]));
open;
end;
next;
end;
eclApp.WorkBooks.Close;
eclApp.Quit;
showmessage('success');
 
下面好简单拉
太棒拉
 
可以在SQLServer中建立一个指向Excel表的数据库链接
 
procedure TForm1.btn_EXCEL2MSSQLClick(Sender: TObject);
begin
//EXCEL2MSSQL
ADOConnection1.ConnectionString:='Provider=SQLOLEDB.1;Password=KCSOFT58;Persist Security Info=True;User ID=SA;Initial Catalog=KCSOFT_HIS;Data Source=CHEN';
 ADOConnection1.Execute('SELECT * into [abc] FROM OpenDataSource( '
 +QuotedStr('Microsoft.Jet.OLEDB.4.0')+','
 +QuotedStr('Data Source="G:/mysmallexe/excel2sql/yp.xls";Extended Properties=excel 8.0')+')...[Abc]');
end;
 
分为两种,一客户端导入,二,服务器导入,
一,把EXECL表做一个表读。
insert into execltable select * from sqltable
二。调用inputdata.fieldbyname(
 
后退
顶部