在Delphi中如何将Excel的数据导入到Excel及SQL Server中!有高分相送! 将数据一条一条的插入实在是太慢了! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 EXEC sp_addlinkedserver 'ExcelSource', 'Jet 4.0', 'Microsoft.Jet.OLEDB.4.0', 'C:\Documents and Settings\Administrator\桌面\xinxi3.xls', NULL, 'Excel 5.0'EXEC sp_addlinkedsrvlogin ExcelSource, FALSE, NULL, NULLEXEC sp_tables_ex ExcelSource //显示几张表select * from ExcelSource...Sheet1$--EXEC sp_droplinkedsrvlogin ExcelSource, NULL--EXEC sp_dropserver ExcelSource 在后台直接进行入库,弊端是看不到进度,速度较快也可以在前台直接用Ado连接Excel,然后写代码插入数据库,速度必前者稍忙,可以看到整体进度你可以根据需要选择一种 procedure TForm1.Button1Click(Sender: TObject);var ExcelApp: Variant;beginExcelApp := CreateOleObject( 'Excel.Application' );ExcelApp.Visible := True;ADOQuery1.SQL.Text := 'select * from titles'ADOQuery1.Open;ExcelApp.Cells.CopyFromRecordset(ADOQuery1.Recordset,20,20);end;end. 可以在后台用opendatasource传入数据库 是要做成程序给用户用,还是自己导数据啊自已导就用SqlServer的DTS好了要做成程序的话就用 pillarlu(pillarlu) 两种的方法了 干吗不直接先用SQLSERVER或ACCESS导入,在用呢? samying大侠:Sorry,是将Excel中的数据导入到Access或SQL Server中!另外用pillarlu的方法时系统提示:OLE DB 提供程序 'Microsoft.Jet.OLEDB.4.0' 报错。验证失败。[OLE/DB provider returned message: 无法启动应用程序。工作组信息文件丢失,或是已被其它用户以独占方式打开。] 应当如何处理呀? pillarlu先生: 在后台直接入库这种方法的代码能让我参考一下吗? 先执行如下存储过程EXEC sp_addlinkedserver 'ExcelSource', 'Jet 4.0', 'Microsoft.Jet.OLEDB.4.0', 'C:\Documents and Settings\Administrator\桌面\xinxi3.xls', NULL, 'Excel 5.0'EXEC sp_addlinkedsrvlogin ExcelSource, FALSE, NULL, NULL然后执行下面这个存储过程EXEC sp_tables_ex ExcelSource //显示几张表这时会返回几个表的名称(个数与excel中sheet的个数一致)然后你用以下语句:select * from ExcelSource...Sheet1$就可以查出来excel中的数据,然后就可以进行倒入的操作了导入完毕记得执行以下两个存储过程:--EXEC sp_droplinkedsrvlogin ExcelSource, NULL--EXEC sp_dropserver ExcelSource以上所有的操作可以先在查询分析器中test一下,然后你可以写存储过程来实现 如果用第二种方法,adoquery的ConnectionString = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+OpenDialog1.FileName+';Extended Properties=Excel 8.0;Persist Security Info=False';即可,推荐使用此中方式 EXEC master..xp_cmdshell 'bcp 库名.dbo.表名 in e:\temp.xls -c -q -U"" -P""'这个最快 还有另一种方法:我写了如下的两种方法:第一种:procedure TForm1.BitBtn1Click(Sender: TObject);var a,b,c,FileName,SheetName,SqlStr,ConnStr :string ;begin FileName :='D:\abc.xls' ; SheetName :='Sheet1' ; ADOQuery1.Close ; ADOQuery1.SQL.Clear ; ConnStr :='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + FileName + ';Extended Properties=Excel 8.0;Persist Security Info=False'; ADOQuery1.ConnectionString :=ConnStr ; SqlStr :='Select * from ' + SheetName + '$' ; ADOQuery1.SQL.Add(SqlStr) ; ADOQuery1.Prepared ; ADOQuery1.Open ; while not ADOQuery1.Eof do begin a :=ADOQuery1.Fields[0].AsString ; b :=ADOQuery1.Fields[1].AsString ; c :=ADOQuery1.Fields[2].AsString ; end ;end;此时系统会提示:From子句语法错误。我估计是SqlStr :='Select * from ' + SheetName + '$' ;的语法不正确,请问应该如何写呢?第二种方法:procedure TForm1.BitBtn2Click(Sender: TObject);var a,b,c,FileName,SheetName,SqlStr,ConnStr :string ;begin FileName :='D:\abc.xls' ; SheetName :='Sheet1' ; ADOTable1.Close ; ConnStr :='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + FileName + ';Extended Properties=Excel 8.0;Persist Security Info=False'; ADOTable1.ConnectionString :=ConnStr ; ADOTable1.TableName :=SheetName + '$' ; ADOQuery1.Open ; while not ADOTable1.Eof do begin a :=ADOTable1.Fields[0].AsString ; b :=ADOTable1.Fields[1].AsString ; c :=ADOTable1.Fields[2].AsString ; end ;end;我在设计器中试过是很正确的,但在运行期间又会出错的!这个问题的症解又怎么解决呢? [email protected]我的msn,最近比较忙,没有时间上网,明天要去重庆出差 BCP命令只适用于SQLSERVEREXEC master..xp_cmdshell 'bcp 库名.dbo.表名 in e:\temp.xls -c -q -U"" -P""'bcp 实用工具bcp 实用工具在 Microsoft® SQL Server™ 2000 实例和数据文件之间以用户指定的格式复制数据。语法bcp {[[database_name.][owner].]{table_name | view_name} | "query"} {in | out | queryout | format} data_file [-m max_errors] [-f format_file] [-e err_file] [-F first_row] [-L last_row] [-b batch_size] [-n] [-c] [-w] [-N] [-V (60 | 65 | 70)] [-6] [-q] [-C code_page] [-t field_term] [-r row_term] [-i input_file] [-o output_file] [-a packet_size] [-S server_name[\instance_name]] [-U login_id] [-P password] [-T] [-v] [-R] [-k] [-E] [-h "hint [,...n]"]参数database_name指定的表或视图所在数据库的名称。如果未指定,则为用户默认数据库。owner表或视图所有者的名称。如果执行大容量复制操作的用户拥有指定的表或视图,则 owner 是可选的。如果没有指定 owner 并且执行大容量复制操作的用户不拥有指定的表或视图,则 Microsoft® SQL Server™ 2000 将返回错误信息并取消大容量复制操作。table_name是将数据复制到 SQL Server 时 (in) 的目的表名,以及从 SQL Server 复制数据时 (out) 的源表名。view_name是将数据复制到 SQL Server 时 (in) 的目的视图名,以及从 SQL Server 复制数据时 (out) 的源视图名。只有其中所有列都引用同一个表的视图才能用作目的视图。有关将数据复制到视图的限制的更多信息,请参见 INSERT。Query是返回一个结果集的 Transact-SQL 查询。如果查询返回多个结果集,例如指定 COMPUTE 子句的 SELECT 语句,只有第一个结果集将复制到数据文件,随后的结果集被忽略。使用双引号引起查询语句,使用单引号引起查询语句中嵌入的任何内容。在从查询中大容量复制数据时,还必须指定 queryout。in | out | queryout | format指定大容量复制的方向。in 是从文件复制到数据库表或视图,out 是指从数据库表或视图复制到文件。只有从查询中大容量复制数据时,才必须指定 queryout。根据指定的选项(-n、-c、-w、-6 或 -N)以及表或视图分隔符,format 将创建一个格式文件。如果使用 format,则还必须指定 -f 选项。说明 Microsoft SQL Server 6.5 中的 bcp 实用工具不支持大容量复制到包含 sql_variant 或 bigint 数据类型的表。data_file大容量复制表或视图到磁盘(或者从磁盘复制)时所用数据文件的完整路径。当将数据大容量复制到 SQL Server 时,此数据文件包含将复制到指定表或视图的数据。当从 SQL Server 大容量复制数据时,该数据文件包含从表或视图复制的数据。路径可以有 1 到 255 个字符。-m max_errors指定在大容量复制操作取消之前可能产生的错误的最大数目。bcp 无法复制的每一行都将被忽略并计为一个错误。如果没有包括该选项,则默认为 10。-f format_file指定格式文件的完整路径,该格式文件包含以前在同一个表或视图上使用 bcp 时的存储响应。当使用由 format 选项所创建的格式文件大容量复制入或复制出数据时,使用此选项。格式文件的创建是可选的。在提示几个格式问题之后,bcp 将提示是否在格式文件中保存回答。默认文件名为 Bcp.fmt。大容量复制数据时,bcp 可引用一个格式文件,因此不必重新交互输入以前的回答。如果未使用此选项,也没有指定 –n、-c、-w、-6 或 -N,则 bcp 将提示输入格式信息。-e err_file指定错误文件的完整路径,此错误文件用于存储 bcp 无法从文件传输到数据库的所有行。来自 bcp 的错误信息将发送到用户工作站。如果未使用此选项,则不创建错误文件。-F first_row指定要大容量复制的第一行的序数。默认值是 1,表示在指定数据文件的第一行。-L last_row指定要大容量复制的最后一行的序数。默认值是 0,表示指定数据文件中的最后一行。-b batch_size指定所复制的每批数据中的行数。每个批处理作为一个事务复制至服务器。SQL Server 提交或回滚(在失败时)每个批处理的事务。默认情况下,指定的数据文件中的所有数据都作为一批复制。请不要与 -h "ROWS_PER_BATCH = bb" 选项一起使用。-n使用数据的本机(数据库)数据类型执行大容量复制操作。此选项不提示输入每一字段,它将使用本机值。-c使用字符数据类型执行大容量复制操作。此选项不提示输入每一字段;它使用 char 作为存储类型,不带前缀,\t(制表符)作为字段分隔符,\n(换行符)作为行终止符。-w使用 Unicode 字符执行大容量复制操作。此选项不提示输入每一字段;它使用 nchar 作为存储类型,不带前缀,\t(制表符)作为字段分隔符,\n(换行符)作为行终止符。不能在 SQL Server 6.5 版或更早版本中使用。-N对非字符数据使用数据的本机(数据库)数据类型和对字符数据使用 Unicode 字符类型执行大容量复制操作。这是可替代 -w 选项的性能更高的选项,其目的是使用数据文件将数据从一个 SQL Server 传输到另一个 SQL Server 中。它不提示输入每一字段。在需要传输包含 ANSI 扩展字符的数据以及想利用本机模式的性能时,可以使用这一选项。不能在 SQL Server 6.5 版或更早版本中使用 -N 选项。-V (60 | 65 | 70)使用 SQL Server 早期版本中的数据类型执行大容量复制操作。此选项与字符 (-c) 或本机 (-n) 格式一起使用。此选项并不提示输入每一字段,它使用默认值。例如,若要将 SQL Server 6.5 中的 bcp 实用工具所支持(但 ODBC 不再支持)的日期格式大容量复制到 SQL Server 2000,可使用 -V 65 参数。重要 将数据从 SQL Server 大容量复制到数据文件时,即使指定了 –V,bcp 实用工具也不会为任何 datetime 或 smalldatetime 数据生成 SQL Server 6.0 或 SQL Server 6.5 的日期格式。日期将始终以 ODBC 格式写入。另外,由于 SQL Server 6.5 版或更早版本不支持可为空的 bit 数据,因此 bit 列中的空值写为值 0。-6使用 SQL Server 6.0 或 SQL Server 6.5 数据类型执行大容量复制操作。仅为保持向后兼容性。改为使用 –V 选项。-q在 bcp 实用工具和 SQL Server 实例的连接中执行 SET QUOTED_IDENTIFIERS ON 语句。使用该选项指定包含空格或引号的数据库、所有者、表或视图的名称。将由三部分组成的整个表名或视图名引在双引号 (" ") 中。-C code_page仅为保持向后兼容性。作为代替,请在格式文件或交互式 bcp 中为每一列指定一个排序规则名。指定数据文件中的数据代码页。只有当数据中包含字符值大于 127 或小于 32 的 char、varchar 或 text 列时,code_page 才有用。 具体帮助见SQL联机丛书,查找BCP命令即可 问一下控件下级调用上级属性的问题。 为什么32BIT的BMP的颜色容PATTATE总为0????特急!!!! ADOQuery1.ExecSQL的bt问题 急!!! 光标旁边出现一个沙漏动画,是怎么做出来的??能自己画 光标?? 怎样限制文本框输入数字的函数 请问谁有没有DELPHI 5.X分布式多层应用系统篇的源码?(分不够可以再给) 有关 real or double 型转换成 string 型问题 delphi 注册系统服务启动时出错! 怎样删除一个目录下的所有内容? 北京地区招Delphi软件工程师 model maker 怎么调用 小问题(刚开始学delphi) 谁帮看一下
'ExcelSource',
'Jet 4.0',
'Microsoft.Jet.OLEDB.4.0',
'C:\Documents and Settings\Administrator\桌面\xinxi3.xls',
NULL,
'Excel 5.0'EXEC sp_addlinkedsrvlogin ExcelSource, FALSE, NULL, NULL
EXEC sp_tables_ex ExcelSource //显示几张表select * from ExcelSource...Sheet1$--EXEC sp_droplinkedsrvlogin ExcelSource, NULL--EXEC sp_dropserver ExcelSource
也可以在前台直接用Ado连接Excel,然后写代码插入数据库,速度必前者稍忙,可以看到整体进度
你可以根据需要选择一种
var ExcelApp: Variant;begin
ExcelApp := CreateOleObject( 'Excel.Application' );
ExcelApp.Visible := True;
ADOQuery1.SQL.Text := 'select * from titles'
ADOQuery1.Open;ExcelApp.Cells.CopyFromRecordset(ADOQuery1.Recordset,20,20);end;end.
自已导就用SqlServer的DTS好了
要做成程序的话就用 pillarlu(pillarlu) 两种的方法了
[OLE/DB provider returned message: 无法启动应用程序。工作组信息文件丢失,或是已被其它用户以独占方式打开。] 应当如何处理呀?
EXEC sp_addlinkedserver
'ExcelSource',
'Jet 4.0',
'Microsoft.Jet.OLEDB.4.0',
'C:\Documents and Settings\Administrator\桌面\xinxi3.xls',
NULL,
'Excel 5.0'EXEC sp_addlinkedsrvlogin ExcelSource, FALSE, NULL, NULL
然后执行下面这个存储过程EXEC sp_tables_ex ExcelSource //显示几张表
这时会返回几个表的名称(个数与excel中sheet的个数一致)
然后你用以下语句:
select * from ExcelSource...Sheet1$
就可以查出来excel中的数据,然后就可以进行倒入的操作了
导入完毕记得执行以下两个存储过程:
--EXEC sp_droplinkedsrvlogin ExcelSource, NULL--EXEC sp_dropserver ExcelSource
以上所有的操作可以先在查询分析器中test一下,然后你可以写存储过程来实现
这个最快
我写了如下的两种方法:
第一种:
procedure TForm1.BitBtn1Click(Sender: TObject);
var
a,b,c,FileName,SheetName,SqlStr,ConnStr :string ;begin
FileName :='D:\abc.xls' ;
SheetName :='Sheet1' ;
ADOQuery1.Close ;
ADOQuery1.SQL.Clear ;
ConnStr :='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + FileName + ';Extended Properties=Excel 8.0;Persist Security Info=False';
ADOQuery1.ConnectionString :=ConnStr ;
SqlStr :='Select * from ' + SheetName + '$' ;
ADOQuery1.SQL.Add(SqlStr) ;
ADOQuery1.Prepared ;
ADOQuery1.Open ;
while not ADOQuery1.Eof do
begin
a :=ADOQuery1.Fields[0].AsString ;
b :=ADOQuery1.Fields[1].AsString ;
c :=ADOQuery1.Fields[2].AsString ;
end ;
end;此时系统会提示:From子句语法错误。我估计是SqlStr :='Select * from ' + SheetName + '$' ;
的语法不正确,请问应该如何写呢?
第二种方法:
procedure TForm1.BitBtn2Click(Sender: TObject);
var
a,b,c,FileName,SheetName,SqlStr,ConnStr :string ;begin
FileName :='D:\abc.xls' ;
SheetName :='Sheet1' ;
ADOTable1.Close ;
ConnStr :='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + FileName + ';Extended Properties=Excel 8.0;Persist Security Info=False';
ADOTable1.ConnectionString :=ConnStr ;
ADOTable1.TableName :=SheetName + '$' ;
ADOQuery1.Open ;
while not ADOTable1.Eof do
begin
a :=ADOTable1.Fields[0].AsString ;
b :=ADOTable1.Fields[1].AsString ;
c :=ADOTable1.Fields[2].AsString ;
end ;
end;我在设计器中试过是很正确的,但在运行期间又会出错的!这个问题的症解又怎么解决呢?
我的msn,最近比较忙,没有时间上网,明天要去重庆出差
BCP命令只适用于SQLSERVER
EXEC master..xp_cmdshell 'bcp 库名.dbo.表名 in e:\temp.xls -c -q -U"" -P""'
bcp 实用工具
bcp 实用工具在 Microsoft® SQL Server™ 2000 实例和数据文件之间以用户指定的格式复制数据。语法
bcp {[[database_name.][owner].]{table_name | view_name} | "query"}
{in | out | queryout | format} data_file
[-m max_errors] [-f format_file] [-e err_file]
[-F first_row] [-L last_row] [-b batch_size]
[-n] [-c] [-w] [-N] [-V (60 | 65 | 70)] [-6]
[-q] [-C code_page] [-t field_term] [-r row_term]
[-i input_file] [-o output_file] [-a packet_size]
[-S server_name[\instance_name]] [-U login_id] [-P password]
[-T] [-v] [-R] [-k] [-E] [-h "hint [,...n]"]参数database_name指定的表或视图所在数据库的名称。如果未指定,则为用户默认数据库。owner表或视图所有者的名称。如果执行大容量复制操作的用户拥有指定的表或视图,则 owner 是可选的。如果没有指定 owner 并且执行大容量复制操作的用户不拥有指定的表或视图,则 Microsoft® SQL Server™ 2000 将返回错误信息并取消大容量复制操作。table_name是将数据复制到 SQL Server 时 (in) 的目的表名,以及从 SQL Server 复制数据时 (out) 的源表名。view_name是将数据复制到 SQL Server 时 (in) 的目的视图名,以及从 SQL Server 复制数据时 (out) 的源视图名。只有其中所有列都引用同一个表的视图才能用作目的视图。有关将数据复制到视图的限制的更多信息,请参见 INSERT。Query是返回一个结果集的 Transact-SQL 查询。如果查询返回多个结果集,例如指定 COMPUTE 子句的 SELECT 语句,只有第一个结果集将复制到数据文件,随后的结果集被忽略。使用双引号引起查询语句,使用单引号引起查询语句中嵌入的任何内容。在从查询中大容量复制数据时,还必须指定 queryout。in | out | queryout | format指定大容量复制的方向。in 是从文件复制到数据库表或视图,out 是指从数据库表或视图复制到文件。只有从查询中大容量复制数据时,才必须指定 queryout。根据指定的选项(-n、-c、-w、-6 或 -N)以及表或视图分隔符,format 将创建一个格式文件。如果使用 format,则还必须指定 -f 选项。说明 Microsoft SQL Server 6.5 中的 bcp 实用工具不支持大容量复制到包含 sql_variant 或 bigint 数据类型的表。
data_file大容量复制表或视图到磁盘(或者从磁盘复制)时所用数据文件的完整路径。当将数据大容量复制到 SQL Server 时,此数据文件包含将复制到指定表或视图的数据。当从 SQL Server 大容量复制数据时,该数据文件包含从表或视图复制的数据。路径可以有 1 到 255 个字符。-m max_errors指定在大容量复制操作取消之前可能产生的错误的最大数目。bcp 无法复制的每一行都将被忽略并计为一个错误。如果没有包括该选项,则默认为 10。-f format_file指定格式文件的完整路径,该格式文件包含以前在同一个表或视图上使用 bcp 时的存储响应。当使用由 format 选项所创建的格式文件大容量复制入或复制出数据时,使用此选项。格式文件的创建是可选的。在提示几个格式问题之后,bcp 将提示是否在格式文件中保存回答。默认文件名为 Bcp.fmt。大容量复制数据时,bcp 可引用一个格式文件,因此不必重新交互输入以前的回答。如果未使用此选项,也没有指定 –n、-c、-w、-6 或 -N,则 bcp 将提示输入格式信息。-e err_file指定错误文件的完整路径,此错误文件用于存储 bcp 无法从文件传输到数据库的所有行。来自 bcp 的错误信息将发送到用户工作站。如果未使用此选项,则不创建错误文件。-F first_row指定要大容量复制的第一行的序数。默认值是 1,表示在指定数据文件的第一行。-L last_row指定要大容量复制的最后一行的序数。默认值是 0,表示指定数据文件中的最后一行。-b batch_size指定所复制的每批数据中的行数。每个批处理作为一个事务复制至服务器。SQL Server 提交或回滚(在失败时)每个批处理的事务。默认情况下,指定的数据文件中的所有数据都作为一批复制。请不要与 -h "ROWS_PER_BATCH = bb" 选项一起使用。-n使用数据的本机(数据库)数据类型执行大容量复制操作。此选项不提示输入每一字段,它将使用本机值。-c使用字符数据类型执行大容量复制操作。此选项不提示输入每一字段;它使用 char 作为存储类型,不带前缀,\t(制表符)作为字段分隔符,\n(换行符)作为行终止符。-w使用 Unicode 字符执行大容量复制操作。此选项不提示输入每一字段;它使用 nchar 作为存储类型,不带前缀,\t(制表符)作为字段分隔符,\n(换行符)作为行终止符。不能在 SQL Server 6.5 版或更早版本中使用。-N对非字符数据使用数据的本机(数据库)数据类型和对字符数据使用 Unicode 字符类型执行大容量复制操作。这是可替代 -w 选项的性能更高的选项,其目的是使用数据文件将数据从一个 SQL Server 传输到另一个 SQL Server 中。它不提示输入每一字段。在需要传输包含 ANSI 扩展字符的数据以及想利用本机模式的性能时,可以使用这一选项。不能在 SQL Server 6.5 版或更早版本中使用 -N 选项。-V (60 | 65 | 70)使用 SQL Server 早期版本中的数据类型执行大容量复制操作。此选项与字符 (-c) 或本机 (-n) 格式一起使用。此选项并不提示输入每一字段,它使用默认值。例如,若要将 SQL Server 6.5 中的 bcp 实用工具所支持(但 ODBC 不再支持)的日期格式大容量复制到 SQL Server 2000,可使用 -V 65 参数。重要 将数据从 SQL Server 大容量复制到数据文件时,即使指定了 –V,bcp 实用工具也不会为任何 datetime 或 smalldatetime 数据生成 SQL Server 6.0 或 SQL Server 6.5 的日期格式。日期将始终以 ODBC 格式写入。另外,由于 SQL Server 6.5 版或更早版本不支持可为空的 bit 数据,因此 bit 列中的空值写为值 0。
-6使用 SQL Server 6.0 或 SQL Server 6.5 数据类型执行大容量复制操作。仅为保持向后兼容性。改为使用 –V 选项。-q在 bcp 实用工具和 SQL Server 实例的连接中执行 SET QUOTED_IDENTIFIERS ON 语句。使用该选项指定包含空格或引号的数据库、所有者、表或视图的名称。将由三部分组成的整个表名或视图名引在双引号 (" ") 中。-C code_page仅为保持向后兼容性。作为代替,请在格式文件或交互式 bcp 中为每一列指定一个排序规则名。指定数据文件中的数据代码页。只有当数据中包含字符值大于 127 或小于 32 的 char、varchar 或 text 列时,code_page 才有用。