您的位置:首页 > 编程语言 > Delphi

DELPHI 读取EXCEL 以及将EXCEL写入到ACCESS 数据库

2020-02-14 01:13 549 查看

最近准备为公司的项目写一个小工具,要用到EXCEL文件来存放数据,并且要储存到数据,心想用惯了SQL SERVER数据库,何不直接用ACCESS数据,反正同出一家,故上网找到相关的资料,发现ADO的ADOCONNECTION 和ADOQUERY可以都读取EXCEL文件的数据和连接ACCESS数据库。于是乎,折腾了两天终于折腾了出来

1 。首先是读取EXCEL文件中的数据并显示到DBGrid中,这里用到了ADOQuery 控件,DataSource控件,以及DBGRID控件,话不多说,直接上代码:

[code]var
FilePath:string;
str1,SqlStr:string;

// 这里是选取要读取的EXCEL文件
begin
if dlgOpen_FileSelect.Execute then
begin
if dlgOpen_FileSelect.FileName<>'' then
begin
FilePath:=dlgOpen_FileSelect.FileName;
Edit1.Text:=FilePath;
end
else
ShowMessage('请选择正确的文件');
end;

// 这里连接EXCEL文件
try

str1:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+FilePath+';Extended Properties=Excel 8.0;Persist Security Info=False';
ADOQuery1.Close;
ADOQuery1.ConnectionString:=str1;

//    ShowMessage(str1);

SqlStr:='select * from [Sheet1$]' ;
//    ShowMessage(SqlStr);

ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add(SqlStr);
ADOQuery1.Open;

ds1.DataSet:=ADOQuery1;
RzDBGrid1.DataSource:= ds1;
finally

end;

第一部分选择EXCEL文件就不讲了,连接EXCEL文件直接采用多ADOQUERY控件连接字符串赋值的方法,str1:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+FilePath+';Extended Properties=Excel 8.0;Persist Security Info=False';

其中Microsoft.Jet.OLEDB.4.0表示读取的EXCEL表格式为【97--2003】的EXCEL文件,即后缀为.xls的文件,至于.xlsx的文件会报错,网上找了下好好像必须将Microsoft.Jet.OLEDB.4.0改为Microsoft.Jet.OLEDB.8.0.然后EXCEL8.0 改为EXCEL 12.0?然而我ADO空间里的连接属性并没有Microsoft.Jet.OLEDB.8.0选项,如果有大佬测试成功请评论告知我

剩下简单的控件设置,直接将DBGRID连到ADOQUERY1就行,测试结果如下(由于篇幅关系只截取前两列):

 

2 将EXCEL数据写如ACCESS 数据库

好了接下来是重头戏,如何将EXCEL表中写入ACCESS数据库中呢?,首先我们先看下代码:

[code]var
FilePath:string;
ConStr:string;
SQLstr:string;
s1:TStringList;
tableName:string;
I:Integer;
begin
if Application.MessageBox('是否真要的导入数据?导入将会覆盖之前的数据','提示',MB_YESNO)= mrYes then
begin
if Edit1.Text='' then
begin
ShowMessage('请选择要输入的数据文件');
end
else
begin
try
// 方法 1:
//连接要写入的EXECL文件
FilePath:=Edit1.Text;
ADOConnection1.Connected:=False;
ConStr:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+FilePath+';Extended Properties=Excel 8.0;Persist Security Info=False';
ADOConnection1.ConnectionString:=ConStr;
ADOConnection1.Connected:=True;

s1:=TStringList.Create;
ADOConnection1.GetTableNames(s1);// 获取表的名称,S1是一个列表,保存所有的表名
tableName:=s1[0];

// 这里应该是将EXCEL表的所有的数据保存到ADOquery

ADOEXCEL.Close;
ADOEXCEL.SQL.Clear;
tableName := '[' + tableName + ']' ;
ADOEXCEL.SQL.Text:='Select * From '+tableName;
//          ShowMessage(ADOEXCEL.SQL.Text);
ADOEXCEL.Open;
s1.Free;

// 先清空数据表
ADOConnection2.Connected:=True;
ADOQuery2.SQL.Clear;
// 这里用TEXT 会报凑,提示没有结果集返回,因为表被清空了,用ADD +EXCCSQL
ADOQuery2.SQL.Add('delete * from [TEST] where ID>0' );
ADOQuery2.ExecSQL;
ADOQuery2.Close;

// 打开要连接的数据库中的表
ADOQuery2.SQL.Clear;
ADOQuery2.SQL.Text:='select * from  TEST';
ADOQuery2.Open;

//          ShowMessage(ADOEXCEL.RecordCount.ToString);

// 将EXCEL数据导入ACCESS数据库中的表
if ADOEXCEL.RecordCount>0 then
begin
ADOEXCEL.First;
for I := 1 to ADOEXCEL.RecordCount do
BEGIN
ADOQuery2.Append;
ADOQuery2.FieldValues['ID']:=ADOEXCEL.FieldValues['ID'];
ADOQuery2.FieldValues['PNum']:=ADOEXCEL.FieldValues['PNum'];
ADOQuery2.FieldValues['PName']:=ADOEXCEL.FieldValues['PName'];
ADOQuery2.FieldValues['PDepartment']:=ADOEXCEL.FieldValues['PDepartment'];
ADOQuery2.FieldValues['Date_In']:=ADOEXCEL.FieldValues['Date_In'];
ADOQuery2.FieldValues['Date_Year']:=ADOEXCEL.FieldValues['Date_Year'];
ADOQuery2.FieldValues['VocationDays']:=ADOEXCEL.FieldValues['VocationDays'];
ADOQuery2.FieldValues['AreadyDays']:=ADOEXCEL.FieldValues['AreadyDays'];
ADOQuery2.FieldValues['LastDays']:=ADOEXCEL.FieldValues['LastDays'];
ADOQuery2.FieldValues['DepartmentNum']:=ADOEXCEL.FieldValues['DepartmentNum'];
ADOQuery2.Post;

ADOEXCEL.Next;
END;
//
//
end;

// 方法2:
//           将数据写进数据库 :不能扩充选定范围
//           FilePath:=Trim(Edit1.Text) ;
//           ADOQuery1.Close;
//           ADOQuery1.SQL.Clear;
//           SQLstr:='INSERT INTO Test (ID,PNum,PName,PDepartment,Date_In,Date_Year,VocationDays,AreadyDays,LastDays,DepartmentNum)'
//           +'select' +
//           ' ID,PNum,PName,PDepartment,Date_In,Date_Year,VocationDays,AreadyDays,LastDays,DepartmentNum'+
//           ' FROM [excel 8.0;database=' + FilePath + '].[Sheet1$]';
//           ShowMessage(SQLstr);
//
//           ADOQuery1.ParamCheck:=False;
//           ADOQuery1.SQL.Text:=SQLstr;
//           ADOQuery1.ExecSQL;

finally
ShowMessage('数据导入成功');
end;
end;
end;

通过资料查找发现有两者方法来实现数据的导入,我们先来看看第一种,这里用的还是ADO控件,简单的说就是准备两个ADOCONNECTION 控件和两个ADOQUERY控件,其中,Adoconnection1和Adoquery1用来连接数据库中的表,(没有表的请手动建立或者自行添加创建表语句)Adoconnection2和Adoquery2 用来连接要储存的EXCEL表,然后就是简单的SELECT语句把数据库表中的数据作为结果集存在Adoquery1中,把excel表的数据存放再Adoquery2 中,然后循环读取:ADOQuery1.FieldValues['字段名']:=Adoquery2 .FieldValues['字段名'],然后就OK了,这里要注意ACCESS没有清空表的语句,但可以用DELETE * FROM XX WHERE 条件的方法来清除,是不是很简单,最终取得的结果如下:

第二种方法是直接使用语句:

[code]SQLstr:='INSERT INTO Test (ID,PNum,PName,PDepartment,Date_In,Date_Year,VocationDays,AreadyDays,LastDays,DepartmentNum)'
+'select' +
' ID,PNum,PName,PDepartment,Date_In,Date_Year,VocationDays,AreadyDays,LastDays,DepartmentNum'+  ' FROM [excel 8.0;database=' + FilePath + '].[Sheet1$]';

如代码所示,这里要注意语句的空格,但是这种方式报错,显示不能【不能超出显示范围】,这个我也是一直没测试通过,等可以后我再更新把

  • 点赞
  • 收藏
  • 分享
  • 文章举报
werido0 发布了2 篇原创文章 · 获赞 0 · 访问量 335 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: