DELPHI 读取EXCEL 以及将EXCEL写入到ACCESS 数据库
最近准备为公司的项目写一个小工具,要用到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$]';
如代码所示,这里要注意语句的空格,但是这种方式报错,显示不能【不能超出显示范围】,这个我也是一直没测试通过,等可以后我再更新把
- 点赞
- 收藏
- 分享
- 文章举报
- delphi TByteArray 装换成base64
- Python for delphi教程
- 检查IP地址是否有效(delphi)
- delphi AddObject 用法
- delphi 动态创建 复选框控件
- delphi 通过点击获取控件名称
- Delphi中@,^,#,$分别表示什么?
- Delphi 运行时错误信息表
- Delphi 编译错误信息表
- Delphi 的运算符列表
- Delphi 快捷键
- Windows API 的数据类型与 Delphi 数据类型对照表
- Delphi7程序调用C#写的DLL解决办法(DLL)
- Delphi 与 C/C++ 数据类型对照表(转)
- Delphi深度之旅——网络游戏外挂制作
- 9月份编程语言排行榜发布-Delphi王者归来
- [原创]用Delphi创建、压缩、修复Access数据库及修改密码
- Delphi 10.1 Berlin 程序运行时点击按钮调用Fastreport设计器不起作用
- Delphi XE 10.1可用的控件、工具
- Delphi clientdataset数值显示格式问题,数值中有=号