zoukankan      html  css  js  c++  java
  • sql 导出/入Excel

     

    SQL Code
    go

    /*--数据导出EXCEL

    导出表中的数据到Excel,包含字段名,文件为真正的Excel文件
    ,如果文件不存在,将自动创建文件
    ,如果表不存在,将自动创建表
    基于通用性考虑,仅支持导出标准数据类型
    --作者: 邹建 --*/

    /*--调用示例

    p_exporttb @tbname='地区资料',@path='c:\',@fname='aa.xls'
    --*/
    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   
      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)  
       print @sqlstr
      --参数检测  
      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="mailto:'+@sql+'%22;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 

    /*--导出,以下是我的调用示例,上面的存储过程都是出自邹建笔下,顶啊--*/
    go
    create proc outExcel
    @ToID int,@stortype int,@os int,@Url varchar(60)
    as
    declare @Name nvarchar(60)
    set @Name = '盘点单'+(select replace(replace(replace(CONVERT(varchar, getdate(), 120 ),'-',''),' ',''),':',''))
    set @Name = @Name+'.xls'
    declare @sqlstr varchar(8000)
    set @sqlstr='select ID,Code as 编码,[Name] as 名称,Unit as 单位,Model as 产品型号,(SELECT isnull(sum(CC0),0)
    FROM cInventory WHERE (GoodsID = cgoods.ID)
    AND (ToID='+ltrim(@ToID)+')
    and stortype='+ltrim(@stortype)+' and os='+ltrim(@os)+')
    as 账面库存,''0'' as 实际数量,ImgNum as 货号,'''' as 备注
    from cgoods'
    exec p_exporttb @sqlstr,@Url,@Name,'盘点单'

    /*--导入--*/
    SELECT * FROM OpenDataSource(
     'Microsoft.Jet.OLEDB.4.0','Data Source="d:\盘点单.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')
    ...[盘点单$]

  • 相关阅读:
    开放源码的对象关系映射工具ORM.NET 插入数据 Insert/Update Data
    开放源码的对象关系映射工具ORM.NET 快档开发入门 Quick Start
    .NET 动态脚本语言Script.NET 开发指南
    开放源码的对象关系映射工具ORM.NET 删除数据 Deleting Records using ORM.NET
    .NET Remoting过时了吗?为什么公司的项目还是选择用.NET Remoting,而不是WCF?
    开放源码的对象关系映射工具ORM.NET 查看和显示数据 View and Display data using ORM.NET
    开放源码的对象关系映射工具ORM.NET 查询表 调用存储过程 增加自定义代码
    技术人生:坚持,每日一博
    CQRS:CQRS + DDD + MDP 实现快速应用程序开发
    NodeJs:Happy代码生成器,重构了代码,更新了文档,完善了示例,欢迎下载使用
  • 原文地址:https://www.cnblogs.com/myssh/p/1536935.html
Copyright © 2011-2022 走看看