交流--导入/导出Excel

zjcxc 2003-11-14 08:33:27
从Excel文件中,导入数据到SQL数据库中,很简单,直接用下面的语句:

/*===================================================================*/
--如果接受数据导入的表已经存在
insert into 表 select * from
OPENROWSET('MICROSOFT.JET.OLEDB.4.0'
,'Excel 5.0;HDR=YES;DATABASE=c:\test.xls',sheet1$)

--如果导入数据并生成表
select * into 表 from
OPENROWSET('MICROSOFT.JET.OLEDB.4.0'
,'Excel 5.0;HDR=YES;DATABASE=c:\test.xls',sheet1$)


/*===================================================================*/
--如果从SQL数据库中,导出数据到Excel,如果Excel文件已经存在,而且已经按照要接收的数据创建好表头,就可以简单的用:
insert into OPENROWSET('MICROSOFT.JET.OLEDB.4.0'
,'Excel 5.0;HDR=YES;DATABASE=c:\test.xls',sheet1$)
select * from 表


--如果Excel文件不存在,也可以用BCP来导成类Excel的文件,注意大小写:
--导出表的情况
EXEC master..xp_cmdshell 'bcp 数据库名.dbo.表名 out "c:\test.xls" /c -/S"服务器名" /U"用户名" -P"密码"'

--导出查询的情况
EXEC master..xp_cmdshell 'bcp "SELECT au_fname, au_lname FROM pubs..authors ORDER BY au_lname" queryout "c:\test.xls" /c -/S"服务器名" /U"用户名" -P"密码"'
...全文
264 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
sfgicdgv 2010-06-10
  • 打赏
  • 举报
回复
学到了
非常感谢!~
htt9931 2003-12-26
  • 打赏
  • 举报
回复
如果数据量很大,超过65535条,
请问楼主,那该怎样解决?

我倒觉得fayifu(fayifu) 提供了一种解决方法的途径
ggltechggl 2003-11-21
  • 打赏
  • 举报
回复
可以了,原來沒定義@tbname。
謝謝鄒健
ggltechggl 2003-11-21
  • 打赏
  • 举报
回复

我執行p_exporttb @tbname='aa',@path='c:\',@fname='bb.xls' 怎麼出現下面問題

(1 row(s) affected)

Server: Msg 7405, Level 16, State 1, Line 1
Heterogeneous queries require the ANSI_NULLS and ANSI_WARNINGS options to be set for the connection. This ensures consistent query semantics. Enable these options and then reissue your query.
chifengwatch 2003-11-19
  • 打赏
  • 举报
回复
Mark
tzhguan 2003-11-19
  • 打赏
  • 举报
回复
Mark
zjcxc 2003-11-19
  • 打赏
  • 举报
回复
导回来时有如下问题:
(1)列的次序颠倒。

这个问题太是SQL本身的问题,用openrowset/opendatasource打开外部数据源时,字段的顺序经常是无序的.不只Excel,包括txt/dbf/access等都如此.



(2)我把第一行的列名删除,次序不颠倒了,但是导入时会少倒一行数据(第一条记录)。
--无表头的时候,应该用:
insert into 表 select * from
OPENROWSET('MICROSOFT.JET.OLEDB.4.0'
,'Excel 5.0;HDR=NO;DATABASE=c:\test.xls',sheet1$)
xiaohefeng 2003-11-19
  • 打赏
  • 举报
回复
Question:

1、我用上面的方法把数据库的表导出到Excel成功.
/*--调用示例
p_exporttb @sqlstr='select * from 地区资料'
,@path='c:\',@fname='aa.xls',@sheetname='地区资料'
--*/

2、再用下面的方法把aa.xls再导回来.

--如果接受数据导入的表已经存在
insert into 表 select * from
OPENROWSET('MICROSOFT.JET.OLEDB.4.0'
,'Excel 5.0;HDR=YES;DATABASE=c:\test.xls',sheet1$)

3、导回来时有如下问题:
(1)列的次序颠倒。
(2)我把第一行的列名删除,次序不颠倒了,但是导入时会少倒一行数据(第一条记录)。
(3)对Excel表更改保存后,次序又会颠倒,(我估计是数据类型的问题,但不知怎样改,而且我的OFFICE是xp版的。)

4、求帮助:
(1)有没有什么方法,最好在SQL里写的:对导出的数据,直接导回来。
(2)导回来时只导不重复的记录。(好象要求过份了,哈)

thanks!!
zjcxc 2003-11-18
  • 打赏
  • 举报
回复
楼上的这个为什么老测试不成功?
fayifu 2003-11-18
  • 打赏
  • 举报
回复
/*
存储过程名称:导出数据到Excel
功能描述:导出数据到Excel

EXEC ExportToExcel @server = '.',
@uname = 'sa',
@pwd = '',
@QueryText = 'SELECT * FROM dldata..bbbbbb',
@filename = 'd:\ImportToExcel.xls'
*/

IF OBJECT_ID('ExportToExcel') IS NOT NULL DROP PROC ExportToExcel
GO

CREATE PROCEDURE ExportToExcel (
@server sysname = null,
@uname sysname = null,
@pwd sysname = null,
@QueryText varchar(200) = null,
@filename varchar(200) = 'd:\ImportToExcel.xls'
)
AS
DECLARE @SQLServer int, --SQLDMO.SQLServer对象
@QueryResults int, --QueryResults对象
@CurrentResultSet int,
@object int, --Excel.Application对象
@WorkBooks int,
@WorkBook int,
@Range int,
@hr int,
@Columns int,
@Rows int,
@indColumn int,
@indRow int,
@off_Column int,
@off_Row int,
@code_str varchar(100),
@result_str varchar(255)

IF @QueryText IS NULL
BEGIN
PRINT 'Set the query string'
RETURN
END

--设置服务器名为本地服务器(@@servername返回运行SQL Server的本地服务器名称)
IF @server IS NULL SELECT @server = @@servername

--设置用户名为当前系统用户名(使用SYSTEM_USER返回当前系统用户名)
IF @uname IS NULL SELECT @uname = SYSTEM_USER

SET NOCOUNT ON

--创建SQLDMO.SQLServer对象
EXEC @hr = sp_OACreate 'SQLDMO.SQLServer', @SQLServer OUT
IF @hr <> 0
BEGIN
PRINT 'error create SQLDMO.SQLServer'
RETURN
END

--连接到SQL Server系统
IF @pwd IS NULL
BEGIN
EXEC @hr = sp_OAMethod @SQLServer, 'Connect', null, @server, @uname
IF @hr <> 0
BEGIN
PRINT 'error Connect'
RETURN
END
END
ELSE
BEGIN
EXEC @hr = sp_OAMethod @SQLServer, 'Connect', null, @server, @uname, @pwd
IF @hr <> 0
BEGIN
PRINT 'error Connect'
RETURN
END
END

--The ExecuteWithResults method executes a Transact-SQL command batch
--returning batch result sets in a QueryResults object
SELECT @result_str = 'ExecuteWithResults("' + @QueryText + '")'
EXEC @hr = sp_OAMethod @SQLServer, @result_str, @QueryResults OUT
IF @hr <> 0
BEGIN
PRINT 'error with method ExecuteWithResults'
RETURN
END

--The CurrentResultSet property controls access to the result sets of a QueryResults object
EXEC @hr = sp_OAMethod @QueryResults, 'CurrentResultSet', @CurrentResultSet OUT
IF @hr <> 0
BEGIN
PRINT 'error get CurrentResultSet'
RETURN
END

--The Columns property exposes the number of columns contained
--in the current result set of a QueryResults object
EXEC @hr = sp_OAMethod @QueryResults, 'Columns', @Columns OUT
IF @hr <> 0
BEGIN
PRINT 'error get Columns'
RETURN
END

--The Rows property returns the number of rows in a referenced
--query result set or the number of rows existing in a table
EXEC @hr = sp_OAMethod @QueryResults, 'Rows', @Rows OUT
IF @hr <> 0
BEGIN
PRINT 'error get Rows'
RETURN
END

--创建Excel.Application对象
EXEC @hr = sp_OACreate 'Excel.Application', @object OUT
IF @hr <> 0
BEGIN
PRINT 'error create Excel.Application'
RETURN
END

--获得Excel工作簿对象
EXEC @hr = sp_OAGetProperty @object, 'WorkBooks', @WorkBooks OUT
IF @hr <> 0
BEGIN
PRINT 'error create WorkBooks'
RETURN
END

--在工作簿对象中加入一工作表
EXEC @hr = sp_OAGetProperty @WorkBooks, 'Add', @WorkBook OUT
IF @hr <> 0
BEGIN
PRINT 'error with method Add'
RETURN
END

--Range对象(A1单元格)
EXEC @hr = sp_OAGetProperty @object, 'Range("A1")', @Range OUT
IF @hr <> 0
BEGIN
PRINT 'error create Range'
RETURN
END

SELECT @indRow = 1
SELECT @off_Row = 0
SELECT @off_Column = 1

WHILE (@indRow <= @Rows)
BEGIN
SELECT @indColumn = 1
WHILE (@indColumn <= @Columns)
BEGIN
--The GetColumnString method returns a QueryResults object result set member converted to a String value
EXEC @hr = sp_OAMethod @QueryResults, 'GetColumnString', @result_str OUT, @indRow, @indColumn
IF @hr <> 0
BEGIN
PRINT 'error get GetColumnString'
RETURN
END

EXEC @hr = sp_OASetProperty @Range, 'value', @result_str
IF @hr <> 0
BEGIN
PRINT 'error set value'
RETURN
END

EXEC @hr = sp_OAGetProperty @Range, 'Offset', @Range OUT, @off_Row, @off_Column
IF @hr <> 0
BEGIN
PRINT 'error get Offset'

RETURN
END

SELECT @indColumn = @indColumn + 1

END

SELECT @indRow = @indRow + 1
SELECT @code_str = 'Range("A' + LTRIM(str(@indRow)) + '")'
EXEC @hr = sp_OAGetProperty @object, @code_str, @Range OUT
IF @hr <> 0
BEGIN
PRINT 'error create Range'
RETURN
END

END

SELECT @result_str = 'exec master..xp_cmdshell ''del ' + @filename + ''', no_output'
EXEC(@result_str) --如果存在@filename文件,则先删除
SELECT @result_str = 'SaveAs("' + @filename + '")'
EXEC @hr = sp_OAMethod @WorkBook, @result_str
IF @hr <> 0
BEGIN
PRINT 'error with method SaveAs'
RETURN
END

EXEC @hr = sp_OAMethod @WorkBook, 'Close'
IF @hr <> 0
BEGIN
PRINT 'error with method Close'
RETURN
END

EXEC @hr = sp_OADestroy @object
IF @hr <> 0
BEGIN
PRINT 'error destroy Excel.Application'
RETURN
END

EXEC @hr = sp_OADestroy @SQLServer
IF @hr <> 0
BEGIN
PRINT 'error destroy SQLDMO.SQLServer'
RETURN
END
GO
prcgolf 2003-11-18
  • 打赏
  • 举报
回复
支持邹建!!
tonnyhe 2003-11-17
  • 打赏
  • 举报
回复
感谢
zjcxc 2003-11-17
  • 打赏
  • 举报
回复
--将某个目录上的Excel表,导入到数据库中

--将所有的Excel文件放到一个目录中,假设为c:\test\,然后用下面的方法来做

create table #t(fname varchar(260),depth int,isf bit)
insert into #t exec master..xp_dirtree 'c:\test',1,1
declare tb cursor for select fn='c:\test'+fname from #t
where isf=1 and fname like '%.xls' --取.xls文件(EXCEL)
declare @fn varchar(8000)
open tb
fetch next from tb into @fn
while @@fetch_status=0
begin
--下面是查询语句,需要根据你的情况改为插入语句
--插入已有的表用:insert into 表 selct * from ...
--创建表用:select * into 表 from ...
set @fn='select * from
OPENROWSET(''MICROSOFT.JET.OLEDB.4.0'',''Excel 5.0;HDR=YES;DATABASE='+@fn+''',全部客户$)'
exec(@fn)
fetch next from tb into @fn
end
close tb
deallocate tb
drop table #t
zjcxc 2003-11-17
  • 打赏
  • 举报
回复
to: lrc()
可以.
lynx1111 2003-11-16
  • 打赏
  • 举报
回复
感谢邹建!
lrc 2003-11-16
  • 打赏
  • 举报
回复
表头可否自定义: ?
p_exporttb @sqlstr='select id as 编号,name as 名称 from 地区资料'
--------- -----------
,@path='c:\',@fname='aa.xls',@sheetname='地区资料'
zjcxc 2003-11-16
  • 打赏
  • 举报
回复
有导出DBF的,准备另外开贴讨论.
BluePenguin 2003-11-15
  • 打赏
  • 举报
回复
感谢邹建!

不知道后一种将数据导出到真正EXCEL中的方法能否适用与导出到DBF中?
atlasGS 2003-11-15
  • 打赏
  • 举报
回复
谢谢!zjcxc (邹建) 收下!
txlicenhe 2003-11-15
  • 打赏
  • 举报
回复
再顶一下
加载更多回复(4)

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧