2万多条数据的datatable 导出到excel中,非常慢,有什么好办法没有,希望有现成代码

解决方案 »

  1.   

    直接用excel连数据库试试
    http://blog.csdn.net/bdmh/article/details/5857470
      

  2.   

    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:   
      s存储过程直接导出