将NorthWind数据库中的Products表中的全部数据导到E:\Media\JackieAillo.xls 中。
一、创建存储过程(p_export_to_excel):
1、判断p_export_to_excel存储过程是否已经存在,如果存在则将改存储过程删除,您可以在企业管理器中直接删除,也可以在查询分析其中执行下面的代码:
if exists (
select * from dbo.sysobjects
where id = object_id(N'[dbo].[p_export_to_excel]')
and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[p_export_to_excel]
go
2、新建名为p_export_to_excel的存储过程,创建代码如下:
create proc p_export_to_excel
@sqlstr sysname,
--查询语句,该查询语句的查询结果就是写到Excel中的数据。
--如果查询语句中使用了order by ,请加上top 100 percent,@path nvarchar(1000),
--导出路径,路径必须要用双斜杠,如"c:\\aillo\\tt\\"格式,而不能用"c:\aillo\t\"@fname nvarchar(250), --文件名,需包括文件的扩展名,如:123.xls
@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)
--参数检测if isnull(@fname,'')='' set @fname='temp.xls'
if isnull(@sheetname,'')='' set @sheetname=replace(@fname,'.','#')
--检查文件是否已经存在if right(@path,1)<>'' set @path=@path+''
create table #tb(a bit,b bit,c bit)
set @sql=@path+@fname
insert into #tb exec master..xp_fileexist @sql
--数据库创建语句set @sql=@path+@fname
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=Microsoft.Jet.OLEDB.4.0;Extended Properties="Excel 5.0;HDR=YES'
+';DATABASE='+@sql+'"'
--连接数据库exec @err=sp_oacreate 'adodb.connection',@obj out
if @err<>0 goto lberr
exec @err=sp_oamethod @obj,'open',null,@constrif @err<>0 goto lberr
--创建表的SQLdeclare @tbname sysname
set @tbname='##tmp_'+convert(varchar(38),newid())
set @sql='select * into ['+@tbname+'] from('+@sqlstr+') a'
exec(@sql)
select @sql='',@fdlist=''select @fdlist=@fdlist+','+a.name
,@sql=@sql+',['+a.name+'] '
+case when b.name in('char','nchar','varchar','nvarchar') then
'text('+cast(case when a.length>255 then 255 else a.length end as varchar)+')'
when b.name in('tynyint','int','bigint','tinyint') then 'int'
when b.name in('smalldatetime','datetime') then 'datetime'
when b.name in('money','smallmoney') then 'money'
else b.name end
FROM tempdb..syscolumns a left join tempdb..systypes b on a.xtype=b.xusertype
where b.name not in
('image','text','uniqueidentifier','sql_variant','ntext','varbinary','binary','timestamp')and a.id=(select id from tempdb..sysobjects where name=@tbname)
select @sql='create table ['+@sheetname
+']('+substring(@sql,2,8000)+')'
,@fdlist=substring(@fdlist,2,8000)
exec @err=sp_oamethod @obj,'execute',@out out,@sqlif @err<>0 goto lberr
exec @err=sp_oadestroy @obj
--导入数据set @sql='openrowset(''MICROSOFT.JET.OLEDB.4.0'',''Excel 5.0;HDR=YES
;DATABASE='+@path+@fname+''',['+@sheetname+'$])'
exec('insert into '+@sql+'('+@fdlist+') select '+@fdlist+' from ['+@tbname+']')
set @sql='drop table ['+@tbname+']'exec(@sql)
return
lberr:exec sp_oageterrorinfo 0,@src out,@desc out
lbexit:
select cast(@err as varbinary(4)) as 错误号
,@src as 错误源,@desc as 错误描述
select @sql,@constr,@fdlist
GO
二、在ASP.net程序代码(SQL_Export_To_Excel.aspx.cs)中调用存储过程:
在设计界面中添加一个导出按钮,添加如下代码:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;public partial class SQL_To_Excel : System.Web.UI.Page
{
public SqlConnection con()
{
string constr = "server=localhost;uid=sa;pwd=123456;database=NorthWind";
SqlConnection mycon = new SqlConnection(constr);
return mycon;
}
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
SqlConnection connection = con();
SqlCommand cmd = new SqlCommand("p_export_to_excel", connection);
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter p1, p2, p3, p4;
p1 = new SqlParameter("@sqlstr", "select * from Products");
p2 = new SqlParameter("@path", "E:\\Media\\");
p3 = new SqlParameter("@fname", "JackieAillo.xls");
p4 = new SqlParameter("@sheetname", "AAA");
cmd.Parameters.Add(p1);
cmd.Parameters.Add(p2);
cmd.Parameters.Add(p3);
cmd.Parameters.Add(p4);
try
{
connection.Open();
cmd.ExecuteNonQuery();
Response.Write("<script>alert('数据已成功导到Excel中!')</script>");
}
catch (Exception ex)
{
ex.ToString();
}
finally
{
connection.Close();
}
}
}