最近碰到要导出大数据的EXCEL, 发现用ADO.NET导出特别慢,所以就写了个存储过程直接用数据库来导出. 下面是代码:
但是这样导出的EXCEL文件是没有什么样式的EXCEL文件,而且只支持本地导出(WEB服务器和数据库服务器是在同一台机器上)~..... 在存储过程里面都有注释,其实也蛮简单的,主要是用到了网上很容易搜索到的BCP命令~ 用xp_cmdshell 执行它而已.
- create procedure procGenexcelwithcolumns
- (
- @db_name varchar(100),
- @table_name varchar(100),
- @file_name varchar(100)
- )
- as
- --Generate column names as a recordset
- declare @columns varchar(8000), @sql varchar(8000), @data_file varchar(100)
- select
- @columns=coalesce(@columns+',','')+column_name+' as ['+column_name+']'
- from
- information_schema.columns
- where
- table_name=@table_name
- select @columns=''''''+replace(replace(@columns,' as ',''''' as '),',',',''''')
- --Create a dummy file to have actual data
- select @data_file=substring(@file_name,1,len(@file_name)-charindex('/',reverse(@file_name)))+'/data_file.xls'
- --Generate column names in the passed EXCEL file
- set @sql='exec master..xp_cmdshell ''bcp " select * from (select '+@columns+') as t" queryout "'+@file_name+'" -c -q -S"192.168.1.2" -U"sa" -P"sasasa"'''
- exec(@sql)
- -- From 飞鸟工作室 Rights reserved
- --Generate data in the dummy file
- set @sql='exec master..xp_cmdshell ''bcp "select * from '+@db_name+'..'+@table_name+'" queryout "'+@data_file+'" -c -q -S"192.168.1.2" -U"sa" -P"sasasa"'''
- exec(@sql)
- --Copy dummy file to passed EXCEL file
- set @sql= 'exec master..xp_cmdshell ''type '+@data_file+' >> '+@file_name+''''
- exec(@sql)
- --Delete dummy file
- set @sql= 'exec master..xp_cmdshell ''del '+@data_file+''''
- exec(@sql)
- -- From 飞鸟工作室 Rights reserved
调用实例:
procGenexcelwithcolumns 'test','vitemsoldreport','d:/itemsold.xls'
test:数据库名,'vitemsoldReport'视图名',itemsold.xls 是路径
注意:数据量不能超过EXCEL每张SHEET能承受的最大行数:65536