表数据导出到Excel并进行分页处理

表数据导出到Excel并进行分页处理

2023年7月13日发(作者:)

USE [DBNAME]

GO

/****** Object: StoredProcedure [dbo].[ExportToExcel] Script Date: 03/18/2011 13:16:39

******/

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

/*********************************************************************************************************************

导出数据到EXCEL中且每页为65535条数据,包含字段名,文件为真正的Excel文件格式。

如果文件不存在,将自动创建文件,存在将不导出。

如果表不存在,将自动创建表。

基于通用性考虑,仅支持导出标准数据类型。

--Creator by zoujian 2003.10

--增加分页功能,每页65000条。

--Add by xiexiaoman

--修改分页功能,每页65535条。

--Add by liujunxiong 2011.03.18

--1、修改在SQL2005/2008下配置项没有打开,解决权限的问题;

--2、修改表带自增列导出报错的问题。

--调用示例

exec ExportToExcel @ExcSql='select *

[TABLENAME]',@SavePath='D:',@FileName='',@SheetName='[TABLENAME]'

from

--存在的问题:

--1、文件只能导出到服务器进行保存。

***********************************************************************************************************************/

CREATE proc [dbo].[ExportToExcel]

@ExcSql varchar(8000), --查询语句,如果查询语句中使用了order by, 请加上top 100

percent

@SavePath nvarchar(1000),--文件存放目录

@FileName nvarchar(250), --文件名

@SheetName varchar(250)='' --要创建的工作表名, 默认为文件名

as

declare @err int,@src nvarchar(255),@desc nvarchar(255),@out int

declare @obj int,@constr nvarchar(1000),@sql varchar(8000),@fdlist varchar(8000),@tmpsql varchar(8000)

declare @sheetcount int,@sheetnow int, @recordcount int, @recordnow int

declare @sheetsql varchar(8000)--创建页的sql

declare @pagesize int

set @pagesize = 65535 --Sheet分页的大小

--参数检测

if isnull(@FileName,'')='' set @FileName=''

if isnull(@SheetName,'')='' set @SheetName=replace(@FileName,'.','#')

--检查文件是否已经存在

if right(@SavePath,1)<>'' set @SavePath=@SavePath+''

create table #tb(a bit,b bit,c bit)

set @sql=@SavePath+@FileName

insert into #tb p_fileexist @sql

--数据库创建语句

set @sql=@SavePath+@FileName

if exists(select 1 from #tb where a=1)

set @constr='DRIVER={Microsoft Excel Driver (*.xls)};DSN='''';READONLY=FALSE'

+';CREATE_DB="'+@sql+'";DBQ='+@sql

else

set @constr='Provider=.4.0;Extended Properties="Excel 8.0;HDR=YES'

+';DATABASE='+@sql+'"'

--打开配置项

exec sp_configure 'show advanced options',1;

reconfigure;

exec sp_configure 'Ole Automation Procedures',1;

reconfigure;

exec sp_configure 'Ad Hoc Distributed Queries',1;

reconfigure;

--连接数据库

exec @err=sp_oacreate 'tion',@obj out

if @err<>0 goto lberr

exec @err=sp_oamethod @obj,'open',null,@constr

if @err<>0 goto lberr

--创建表的SQL

declare @tbname sysname

set @tbname='##tmp_'+convert(varchar(38),newid()) declare @tbtmpid nvarchar(50)

set @tbtmpid ='tmp_'+convert(varchar(38),newid())+''

--有序列ID @tbtmpid的临时表

--2011.03.18

--From "Identity(int,1,1)" to "newid()"

set @sql='select newid() as ['+@tbtmpid+'], a.* into ['+@tbname+'] from ( select top 100 percent

b.* from ( '+@ExcSql+') b) a'

exec(@sql)

--print(@sql)

--取得记录总数

set @recordcount= @@rowcount

if @recordcount=0 goto lrtn

--print @recordcount

select @sql='',@fdlist=''

select @fdlist=@fdlist+',['++']'

,@sql=@sql+',['++'] '

+case

when like '%char'

then case when >255 then 'memo'

else 'text('+cast( as varchar)+')' end

when like '%int' or ='bit' then 'int'

when like '%datetime' then 'datetime'

when like '%money' then 'money'

when like '%text' then 'memo'

else end

FROM tempdb..syscolumns a left join tempdb..systypes b on =ype

where not in('image','uniqueidentifier','sql_variant','varbinary','binary','timestamp')

and =(select id from tempdb..sysobjects where name=@tbname)

and <> @tbtmpid

set @fdlist=substring(@fdlist,2,8000)

--print @fdlist

--列数为零

if @@rowcount=0 goto lrtn

set @sheetsql = @sql

--print @sheetsql

--导入数据,页数

set @sheetcount = CEILING(@recordcount/CAST(@pagesize as float)) --print @sheetcount

--只是一个页而已

IF @sheetcount = 1 BEGIN

--print '只是一个页而已'

set @sql='create table ['+@SheetName

+']('+substring(@sheetsql,2,8000)+')'

exec @err=sp_oamethod @obj,'execute',@out out,@sql

if @err<>0 goto lberr

set @sql='openrowset(''.4.0'',''Excel 8.0;HDR=YES

;DATABASE='+@SavePath+@FileName+''',['+@SheetName+'$])'

exec('insert into '+@sql+'('+@fdlist+') select '+@fdlist+' from ['+@tbname+']')

END

--多个页

set @sheetnow = @sheetcount

set @recordnow= 0

IF @sheetcount > 1 BEGIN

--print '多个页'

WHILE @sheetnow > 0 BEGIN

--创建页

set @sql='create table ['+@SheetName+'_'+ convert(nvarchar(80),@sheetcount -

@sheetnow + 1)

+']('+substring(@sheetsql,2,8000)+')'

exec @err=sp_oamethod @obj,'execute',@out out,@sql

if @err<>0 goto lberr

--print @sql

--创建页end

IF @sheetnow = @sheetcount BEGIN

set @tmpsql ='select top '+str(@pagesize)+' '+@fdlist+' from ['+@tbname+']'

set @sql='openrowset(''.4.0'',''Excel 8.0;HDR=YES

;DATABASE='+@SavePath+@FileName+''',['+@SheetName+'_'+convert(nvarchar(80),@sheetcount - @sheetnow + 1)+'$])'

exec('insert into '+@sql+'('+@fdlist+') '+ @tmpsql) END

IF @sheetnow < @sheetcount BEGIN

set @tmpsql='select top '+str(@pagesize)+' '+@fdlist+' from ['+@tbname+'] where

['+@tbtmpid

+'] not in ( select top '+str(@recordnow-@pagesize)+' ['+@tbtmpid+'] from ['+@tbname+'])'

set @sql='openrowset(''.4.0'',''Excel 8.0;HDR=YES

;DATABASE='+@SavePath+@FileName+''',['+@SheetName+'_'+

convert(nvarchar(80),@sheetcount - @sheetnow + 1)+'$])'

exec('insert into '+@sql+'('+@fdlist+') '+ @tmpsql)

--print (@tmpsql)

--exec(@tmpsql)

END

--print (@tmpsql)

--exec (@tmpsql)

set @recordnow = @pagesize*(@sheetcount-@sheetnow+2)

set @sheetnow = @sheetnow -1

END

END

set @sql='drop table ['+@tbname+']'

exec(@sql)

exec @err=sp_oadestroy @obj

--结束返回

goto lrtn;

--处理返回

lrtn:

exec sp_configure 'Ole Automation Procedures',0;

exec sp_configure 'Ad Hoc Distributed Queries',0;

exec sp_configure 'show advanced options',0;

reconfigure;

return;

--产生错误了

lberr:

exec sp_oageterrorinfo 0,@src out,@desc out

select cast(@err as varbinary(4)) as 错误号, @src as 错误源, @desc as 错误描述

select @sql, @constr, @fdlist exec sp_configure 'Ole Automation Procedures',0;

exec sp_configure 'Ad Hoc Distributed Queries',0;

exec sp_configure 'show advanced options',0;

reconfigure;

发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1689246668a225628.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信