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

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

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

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数据库中呢?,首先我们先看下代码:

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 条件的方法来清除,是不是很简单,最终取得的结果如下:

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

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$]';

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

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值