delphi如何提高数据循环导入(从excel中提取数据)的速度,万条记录以上,本人使用adoquery和adotable控件
2个回答
2013-08-13
展开全部
要用DELPHI中的ADO系列控件访问Excel数据文件,首先应该建立一些基本概念。你需要将一个Excel数据文件想象为一个关系数据库,Excel文件中的每个工作表就对应该数据库中的一个表,而工作表中的每一列当然就是表的列了。然后,按照下列进行就可以: 1.设置ADOConnection的ConnectionString 构造ConnectionString时,OLE DB的提供者要选择Microsoft Jet 4.0 OLE DB Provider作为ADO的驱动程序。这本来是用于连接Access数据库的驱动程序,但也可打开Excel文件。 连接的数据库名称当然就是你要打开的Excel文件,注意扩展名是*.xls,而不是*.mdb。 最关键的一点是,还要设置扩展属性Extended Properties为“Excel 8.0”,否则,测试连接时会报告无法识别数据格式的错误。Extended Properties的属性值在“所有”参数页中输入。 最后,设置完成后的ConnectionString中的各项参数为: Provider=Microsoft.Jet.OLEDB.4.0 Data Source=MyExcelFile.xls Extended Properties=Excel 8.0 Persist Security Info=False 2.设置ADODataSet或ADOTable 将ADODataSet或ADOTable连接到刚才的ADOConnection。如果不用ADOConnection,也可以参照上面的方法直接设置ADODataSet或ADOTable的ConnectionString属性。 对于ADODataSet,需要将CommandType属性设置为cmdTableDirect,而对于ADOTable,则将TableDirect属性设置为True。因为,访问Excel文件是直接的数据文件访问,不是通过SQL语句来操作游标访问的。如果不设置直接访问,则系统会报告SQL语句格式错误等信息。 然后,当你下拉ADODataSet中的CommandText属性或ADOTable的TableName属性时,就可以选择到要打开的工作表了。注意,表名后面多了加一个$符号。 3.打开ADODataSet或ADOTable
展开全部
可以自己做个函数
//=======================================================================
//========================Excel数据导入Sql表函数======================
//=======================================================================
Function ExcelToSQL(ExcelFileName:String;SQLTableName:String;InputField:String;Gauge:TGauge):String;
Var ExcelApp,WorkBook,Sheet:OleVariant;
i,j:integer;
ExcelRowCount:Integer;
TableColCount:Integer;
InsertValue,InsertSql:String;
CellValue:String;
begin
//检测计算机中是否安装了Excel,是否可以建立对象
Try
ExcelApp:=CreateOleObject('Excel.Application');
Except
Begin
Application.MessageBox('你的计算机中没有安装Excel,无法导出到Excel!','警告',0);
Exit;
end;
end;
ExcelApp.Visible:=False;
WorkBook:=ExcelApp.WorkBooks.Open(ExcelFileName);
Sheet:=WorkBook.WorkSheets[1];
ExcelRowCount:=Sheet.UsedRange.Rows.Count; //Excel表行数
DM.ADOQ_Find.Close;
DM.ADOQ_Find.SQL.Clear;
DM.ADOQ_Find.SQL.Add('Select '+InputField+' From '+SQLTableName);
DM.ADOQ_Find.Open;
TableColCount:=DM.ADOQ_Find.FieldCount; //SQL表中列数
Gauge.MaxValue:=ExcelRowCount;
Gauge.Progress:=0;
For i:=2 to ExcelRowCount do
Begin
InsertValue:='';
For j:=1 to TableColCount do
Begin
CellValue:=Sheet.Cells[i,j];
If InsertValue='' then //利用StringReplace 替换掉字段中的空格
InsertValue:=InsertValue+''''+StringReplace(CellValue,' ','',[rfReplaceAll, rfIgnoreCase])+''''
Else
InsertValue:=InsertValue+','+''''+StringReplace(CellValue,' ','',[rfReplaceAll, rfIgnoreCase])+'''' ;
end;
InsertSql:='Insert Into '+SQLTableName+'('+InputField+')'+' Values('+InsertValue+')';
//ShowMessage(insertsql);
Try
With DM.ADOQ_Find DO
Begin
Close;
Sql.Clear;
Sql.Add(InsertSql);
ExecSql;
end;
except
Application.MessageBox('导入失败,请检查Excel文件或数据格式!','操作提示',0);
Exit;
end;
Gauge.Progress:=i;
end;
Gauge.Progress:=0;
ExcelApp.Quit;
//Application.MessageBox('导入成功!','操作提示',0);
end;
调用时
ExcelToSQL(lEdit_DicFile.Text,TableName,InputField,Gauge);
lEdit_DicFile.Text, 是文件名
TableName 表名
InputField 字段名
Gauge 进度条
//=======================================================================
//========================Excel数据导入Sql表函数======================
//=======================================================================
Function ExcelToSQL(ExcelFileName:String;SQLTableName:String;InputField:String;Gauge:TGauge):String;
Var ExcelApp,WorkBook,Sheet:OleVariant;
i,j:integer;
ExcelRowCount:Integer;
TableColCount:Integer;
InsertValue,InsertSql:String;
CellValue:String;
begin
//检测计算机中是否安装了Excel,是否可以建立对象
Try
ExcelApp:=CreateOleObject('Excel.Application');
Except
Begin
Application.MessageBox('你的计算机中没有安装Excel,无法导出到Excel!','警告',0);
Exit;
end;
end;
ExcelApp.Visible:=False;
WorkBook:=ExcelApp.WorkBooks.Open(ExcelFileName);
Sheet:=WorkBook.WorkSheets[1];
ExcelRowCount:=Sheet.UsedRange.Rows.Count; //Excel表行数
DM.ADOQ_Find.Close;
DM.ADOQ_Find.SQL.Clear;
DM.ADOQ_Find.SQL.Add('Select '+InputField+' From '+SQLTableName);
DM.ADOQ_Find.Open;
TableColCount:=DM.ADOQ_Find.FieldCount; //SQL表中列数
Gauge.MaxValue:=ExcelRowCount;
Gauge.Progress:=0;
For i:=2 to ExcelRowCount do
Begin
InsertValue:='';
For j:=1 to TableColCount do
Begin
CellValue:=Sheet.Cells[i,j];
If InsertValue='' then //利用StringReplace 替换掉字段中的空格
InsertValue:=InsertValue+''''+StringReplace(CellValue,' ','',[rfReplaceAll, rfIgnoreCase])+''''
Else
InsertValue:=InsertValue+','+''''+StringReplace(CellValue,' ','',[rfReplaceAll, rfIgnoreCase])+'''' ;
end;
InsertSql:='Insert Into '+SQLTableName+'('+InputField+')'+' Values('+InsertValue+')';
//ShowMessage(insertsql);
Try
With DM.ADOQ_Find DO
Begin
Close;
Sql.Clear;
Sql.Add(InsertSql);
ExecSql;
end;
except
Application.MessageBox('导入失败,请检查Excel文件或数据格式!','操作提示',0);
Exit;
end;
Gauge.Progress:=i;
end;
Gauge.Progress:=0;
ExcelApp.Quit;
//Application.MessageBox('导入成功!','操作提示',0);
end;
调用时
ExcelToSQL(lEdit_DicFile.Text,TableName,InputField,Gauge);
lEdit_DicFile.Text, 是文件名
TableName 表名
InputField 字段名
Gauge 进度条
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询