c#快速导出到Excel

C#快速导出数据到Excel

SQL code

导入/导出Excel    
 
--从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"密码"'  
   
 
/*--说明:  
  c:/test.xls     为导入/导出的Excel文件名.  
  sheet1$             为Excel文件的工作表名,一般要加上$才能正常使用.  
  --
*/  
     
   
 
--下面是导出真正Excel文件的方法:  
   
 
if   exists   (select   *   from   dbo.sysobjects   where   id   =   object_id(N'[dbo].[p_exporttb]')   and   OBJECTPROPERTY(id,   N'IsProcedure')   =   1)  
 
drop   procedure   [dbo].[p_exporttb]  
 
GO  
   
 
/*--数据导出EXCEL  
     
    导出表中的数据到Excel,包含字段名,文件为真正的Excel文件  
    ,如果文件不存在,将自动创建文件  
    ,如果表不存在,将自动创建表  
    基于通用性考虑,仅支持导出标准数据类型  
   
  --邹建   2003.10(引用请保留此信息)--
*/  
   
 
/*--调用示例  
   
    p_exporttb   @tbname='地区资料',@path='c:/',@fname='aa.xls'  
  --
*/  
 
create   proc   p_exporttb  
 
@tbname   sysname,         --要导出的表名  
  @path   nvarchar(1000),       --文件存放目录  
  @fname   nvarchar(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=@tbname+'.xls'  
   
 
--检查文件是否已经存在  
  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   8.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,@constr  
 
if   @err<>0   goto   lberr  
   
 
/*--如果覆盖已经存在的表,就加上下面的语句  
  --创建之前先删除表/如果存在的话  
  select   @sql='drop   table   ['+@tbname+']'  
  exec   @err=sp_oamethod   @obj,'execute',@out   out,@sql  
  --
*/  
   
 
--创建表的SQL  
  select   @sql='',@fdlist=''  
 
select   @fdlist=@fdlist+',['+a.name+']'  
    ,
@sql=@sql+',['+a.name+']   '  
     
+case    
       
when   b.name   like   '%char'    
       
then   case   when   a.length>255   then   'memo'  
         
else   'text('+cast(a.length   as   varchar)+')'   end  
       
when   b.name   like   '%int'   or   b.name='bit'   then   'int'  
       
when   b.name   like   '%datetime'   then   'datetime'  
       
when   b.name   like   '%money'   then   'money'  
       
when   b.name   like   '%text'   then   'memo'  
       
else   b.name   end  
 
FROM   syscolumns   a   left   join   systypes   b   on   a.xtype=b.xusertype  
 
where   b.name   not   in('image','uniqueidentifier','sql_variant','varbinary','binary','timestamp')  
   
and   object_id(@tbname)=id  
 
select   @sql='create   table   ['+@tbname  
   
+']('+substring(@sql,2,8000)+')'  
    ,
@fdlist=substring(@fdlist,2,8000)  
 
exec   @err=sp_oamethod   @obj,'execute',@out   out,@sql  
 
if   @err<>0   goto   lberr  
   
 
exec   @err=sp_oadestroy   @obj  
   
 
--导入数据  
  set   @sql='openrowset(''MICROSOFT.JET.OLEDB.4.0'',''Excel   8.0;HDR=YES;IMEX=1  
        ;DATABASE=
'+@path+@fname+''',['+@tbname+'$])'  
   
 
exec('insert   into   '+@sql+'('+@fdlist+')   select   '+@fdlist+'   from   '+@tbname)  
   
 
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  
     
   
   
 
if   exists   (select   *   from   dbo.sysobjects   where   id   =   object_id(N'[dbo].[p_exporttb]')   and   OBJECTPROPERTY(id,   N'IsProcedure')   =   1)  
 
drop   procedure   [dbo].[p_exporttb]  
 
GO 

/*--数据导出EXCEL  
     
    导出查询中的数据到Excel,包含字段名,文件为真正的Excel文件  
    如果文件不存在,将自动创建文件  
    如果表不存在,将自动创建表  
    基于通用性考虑,仅支持导出标准数据类型  
   
  --邹建   2003.10(引用请保留此信息)--
*/  
   
 
/*--调用示例  
   
    p_exporttb   @sqlstr='select   *   from   地区资料'  
      ,@path='c:/',@fname='aa.xls',@sheetname='地区资料'  
  --
*/  
 
create   proc   p_exporttb  
 
@sqlstr   varchar(8000),       --查询语句,如果查询语句中使用了order   by   ,请加上top   100   percent  
  @path   nvarchar(1000),       --文件存放目录  
  @fname   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)  
   
 
--参数检测  
  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   8.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,@constr  
 
if   @err<>0   goto   lberr  
   
 
--创建表的SQL  
  declare   @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   like   '%char'    
       
then   case   when   a.length>255   then   'memo'  
         
else   'text('+cast(a.length   as   varchar)+')'   end  
       
when   b.name   like   '%int'   or   b.name='bit'   then   'int'  
       
when   b.name   like   '%datetime'   then   'datetime'  
       
when   b.name   like   '%money'   then   'money'  
       
when   b.name   like   '%text'   then   'memo'  
       
else   b.name   end  
 
FROM   tempdb..syscolumns   a   left   join   tempdb..systypes   b   on   a.xtype=b.xusertype  
 
where   b.name   not   in('image','uniqueidentifier','sql_variant','varbinary','binary','timestamp')  
   
and   a.id=(select   id   from   tempdb..sysobjects   where   name=@tbname)  
   
 
if   @@rowcount=0   return  
   
 
select   @sql='create   table   ['+@sheetname  
   
+']('+substring(@sql,2,8000)+')'  
    ,
@fdlist=substring(@fdlist,2,8000)  
   
 
exec   @err=sp_oamethod   @obj,'execute',@out   out,@sql  
 
if   @err<>0   goto   lberr  
   
 
exec   @err=sp_oadestroy   @obj  
   
 
--导入数据  
  set   @sql='openrowset(''MICROSOFT.JET.OLEDB.4.0'',''Excel   8.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   
   

 

另:excel只能存储65535行数据,如果你的数据量过大你要考虑分割excel哦。

 

具体内容请参考我的BLOG:http://blog.csdn.net/smallwhiteyt/archive/2009/11/08/4784771.aspx 如果你耐心仔细看完本文,相信以后再遇到导出EXCLE操作的时候你会很顺手觉得SO EASY,主要给新手朋友们看的,老鸟可以直接飘过了,花了一晚上的时间写的很辛苦,如果觉得对你有帮助烦请留言支持一下,我会写更多基础的原创内容来回报大家。 C#导出数据EXCEL表格是个老生常谈的问题了,写这篇文章主要是给和我一样的新手朋友提供两种导出EXCEL的方法并探讨一下导出的效率问题,本文中的代码直接就可用,其中部分代码参考其他的代码并做了修改,抛砖引玉,希望大家一起探讨,如有不对的地方还请大家多多包涵并指出来,我也是个新手,出错也是难免的。 首先先总结下自己知道的导出EXCEL表格的方法,大致有以下几种,有疏漏的请大家补充。 1.数据逐条逐条的写入EXCEL 2.通过OLEDB把EXCEL做为数据源来写 3.通过RANGE范围写入多行多列内存数据EXCEL 4.利用系统剪贴板写入EXCEL 好了,我想这些方法已经足够完成我们要实现的功能了,方法不在多,在精,不是么?以上4中方法都可以实现导出EXCEL,方法1为最基础的方法,意思就是效率可能不是太高,当遇到数据量过大时所要付出的时间也是巨大的,后面3种方法都是第一种的衍生,在第一种方法效率低下的基础上改进的,这里主要就是一个效率问题了,当然如果你数据量都很小,我想4种方法就代码量和复杂程度来说第1种基本方法就可以了,或当你的硬件非常牛逼了,那再差的方法也可以高效的完成也没有探讨的实际意义了,呵呵说远了,本文主要是在不考虑硬件或同等硬件条件下单从软件角度出发探讨较好的解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值