如何将查询出来的数据导出成excel形式

如何将查询出来的数据导出成excel形式,第1张

数据库表查询结果导出为excel文件

1、准备好查询语句

2、选择数据库,启动导入和导出向导

3、选择数据源

4、选择目标

5、

6、

7、

8、

后续步骤一直点“下一步”按钮就好。

方法二:但是当要分别在每个表取样,那就相当麻烦了。

导出到Excel

使用说明:

 1.执行时所连接的服务器决定文件存放在哪个服务器

2.远程查询语句中,要加上数据库名

ALTER PROC ExportFile 

     @QuerySql VARCHAR(max) 

    ,@Server VARCHAR(20) 

    ,@User VARCHAR(20) 

    ,@Password VARCHAR(20) 

    ,@FilePath NVARCHAR(100) = 'c:\ExportFile.xls'

AS

    DECLARE @tmp VARCHAR(50) = '[##Table' + CONVERT(VARCHAR(36),NEWID())+']'

    BEGIN TRY

        DECLARE @Sql VARCHAR(max),@DataSource VARCHAR(max)=''

判断是否为远程服务器

        IF @Server <>'.' AND @Server <>'127.0.0.1'

            SET @DataSource = 'OPENDATASOURCE(''SQLOLEDB'',''Data Source='+@Server+'User ID='+@User+'Password='+@Password+''').'

        --将结果集导出到指定的数据库

        SET @Sql = REPLACE(@QuerySql,' from ',' into '+@tmp+ ' from ' + @DataSource)

        PRINT @Sql

        EXEC(@Sql)

        

        DECLARE @Columns VARCHAR(max) = '',@Data NVARCHAR(max)=''

        SELECT @Columns = @Columns + ',''' + name +''''--获取列名(xp_cmdshell导出文件没有列名)

            ,@Data = @Data + ',Convert(Nvarchar,[' + name +'])'--将结果集所在的字段更新为nvarchar(避免在列名和数据union的时候类型冲突)

        FROM tempdb.sys.columns WHERE object_id = OBJECT_ID('tempdb..'+@tmp)

        SELECT @Data  = 'SELECT ' + SUBSTRING(@Data,2,LEN(@Data)) + ' FROM ' + @tmp

        SELECT @Columns =  'Select ' + SUBSTRING(@Columns,2,LEN(@Columns))

        --使用xp_cmdshell的bcp命令将数据导出

        EXEC sp_configure 'xp_cmdshell',1

        RECONFIGURE

        DECLARE @cmd NVARCHAR(4000) = 'bcp "' + @Columns+' Union All ' + @Data+'" queryout ' + @FilePath + ' -c -T'

        PRINT @cmd

        exec sys.xp_cmdshell @cmd

        EXEC sp_configure 'xp_cmdshell',0

        RECONFIGURE

        EXEC('DROP TABLE ' + @tmp)

    END TRY

    BEGIN CATCH

        --处理异常

        IF OBJECT_ID('tempdb..'+@tmp) IS NOT NULL

            EXEC('DROP TABLE ' + @tmp)

        EXEC sp_configure 'xp_cmdshell',0

        RECONFIGURE

        

        SELECT ERROR_MESSAGE()

    END CATCH

先不要着急使用,该版本是基于xp_cmdshell的,因为要创建文件,所以要保证用户能有文件管理的权限,通常简单点的方法就是将sql server的启动用户设置为本地系统用户

现在来执行看看:

查询分析器连接哪个服务器,文件就在哪个服务器上

本地导出

EXEC dbo.ExportFile @QuerySql = 'select * from sys.objects', -- varchar(max)

   @Server = '.', -- varchar(20)

   @FilePath = N'c:\objects.xls' -- nvarchar(100)

远程导出

EXEC dbo.ExportFile @QuerySql = 'select * from master.sys.objects', -- varchar(max)

   @Server = '192.168.1.52', -- varchar(20)

   @User = 'sa', -- varchar(20)

   @Password = 'sa', -- varchar(20)

   @FilePath = N'c:\52objects.xls' -- nvarchar(100)

执行结果如下,显示导出条数,就没有报错,再看看C盘,多了2个文件就大功告成了:

楼上导出的只是普通文本格式不是真正的excel文件,导出excel文件需要引用excel组件,在你的项目bin目录中右键选择引用找到 类似Interop.Microsoft.Office.Interop.Excel.dll的文件引入进去,然后调用相关函数就可以了

以下代码是我从我的项目中扣出来的,请自己改一下相关数据。

using Microsoft.Office.Interop.Excel

GC.Collect()

Application excel

_Workbook xBk

_Worksheet xSt

excel = new ApplicationClass()

xBk = excel.Workbooks.Add(true)

xSt = (_Worksheet)xBk.ActiveSheet

//

//设置标题

//

//设置标题

excel.Cells[1, 1] = "姓名"

excel.Cells[1, 2] = "身份证"

xSt.get_Range(excel.Cells[1, 1], excel.Cells[1, colCountStaff]).HorizontalAlignment = XlVAlign.xlVAlignCenter //设置标题格式为居中对齐

for (int i = 1i <= rowCountStaffi++) {

excel.Cells[i+1 , 1] = "'" + listStaff[i-1].Name

excel.Cells[i+1 , 2] = "'" + listStaff[i-1].CardNO

}

for (int i = 1i <= rowCountCompanyi++) {

excel.Cells[i + 1, 5] = "'" + listCompany[i - 1].ID

excel.Cells[i + 1, 6] = "'" + listCompany[i - 1].Name

excel.Cells[i + 1, 7] = "'" + listCompany[i - 1].ParentID

}

//

//显示效果

//

//设置选中的部分的颜色

xSt.get_Range(xSt.Cells[1, 1], xSt.Cells[1, colCountStaff]).Select()

xSt.get_Range(xSt.Cells[1, 1], xSt.Cells[1, colCountStaff]).Interior.ColorIndex = 19//设置为浅黄色,共计有56种

xSt.get_Range(xSt.Cells[1, 1], xSt.Cells[rowCountStaff + 1, colCountStaff]).Columns.AutoFit()

//绘制边框

xSt.get_Range(xSt.Cells[1, 1], xSt.Cells[rowCountStaff + 1, colCountStaff]).Borders.LineStyle = 1

excel.Visible = false

string fileName = DateTime.Now.ToString("yyyyMMddhhmmss")//设置导出文件的名称

xBk.SaveCopyAs(Server.MapPath("~") + "\\Excel\\download\\" + fileName + ".xls")

//ds = null

xBk.Close(false, null, null)

excel.Quit()

System.Runtime.InteropServices.Marshal.ReleaseComObject(xBk)

System.Runtime.InteropServices.Marshal.ReleaseComObject(excel)

System.Runtime.InteropServices.Marshal.ReleaseComObject(xSt)

xBk = null

excel = null

xSt = null

GC.Collect()

string path = Server.MapPath("~") + "\\Excel\\download\\" + fileName + ".xls"

System.IO.FileInfo file = new System.IO.FileInfo(path)

Response.Clear()

Response.Charset = "GB2312"

Response.ContentEncoding = System.Text.Encoding.UTF8

// 添加头信息,为"文件下载/另存为"对话框指定默认文件名

Response.AddHeader("Content-Disposition", "attachmentfilename=" + Server.UrlEncode(file.Name))

// 添加头信息,指定文件大小,让浏览器能够显示下载进度

Response.AddHeader("Content-Length", file.Length.ToString())

// 指定返回的是一个不能被客户端读取的流,必须被下载

Response.ContentType = "application/ms-excel"

// 把文件流发送到客户端

Response.WriteFile(file.FullName)

// 停止页面的执行

Response.End()


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/256617.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-15
下一篇2023-04-15

发表评论

登录后才能评论

评论列表(0条)

    保存