自动将SQL视图导出到Excel

时间:2018-08-06 14:03:34

标签: sql-server excel

我有一个用SQL Server编写的视图。我需要将数据导出到Excel,以便每个可能的两个字母的国家/地区代码都有单独的Excel文件。文件名为“报告-国家 日期 .xslx”,例如“报告-澳大利亚06082018.xlsx”。

到目前为止,我刚刚将视图连接到Excel并针对每个国家/地区重复执行以下步骤:

  1. 在SQL视图中更改国家/地区代码
  2. 使用与相关国家/地区匹配的名称保存Excel文件

大约有100个不同的国家/地区,因此这项工作非常重复且乏味。查询结果中的行太多,无法同时导出多个国家/地区的数据。有没有一种方法可以自动执行此过程,甚至只是其中的一部分?

2 个答案:

答案 0 :(得分:1)

好的,通常我会推荐SSIS来做到这一点。它是处理您的问题的绝佳工具。但是,如果您真的想在SQL中执行此操作,则可以执行以下操作:

NB的

  
      
  1. 我只能通过使用xls excel文件来使其工作。
  2.   
  3. 它会警告您它的来源不受信任,但是您只需单击“确定”即可。
  4.   
  5. 我尚未对其进行深入测试,因此可能需要进行错误或修复:)
  6.   

准备步骤:加载示例数据

CREATE TABLE [dbo].[TestExcel](
    [CountryCode] [varchar](50) NULL,
    [Names] [varchar](50) NULL,
    [Sales] [int] NULL
)

Insert into dbo.TestExcel (CountryCode,Names,Sales)
Values

('DA','Thomas', 10),
('DA','Jens',   20),
('DA','John',   40),
('EN','Mark',   10),
('EN','Adam',   5 )

步骤1: 创建一个存储过程

Create procedure proc_generate_excel_with_columns
(
    @db_name    varchar(100),
    @table_name varchar(100),   
    @file_name  varchar(100),
    @CountryCode varchar(10)
)
as

--Generate column names as a recordset
declare @columns varchar(8000), @sql varchar(8000), @data_file varchar(100)
select 
    @columns=coalesce(@columns+',','')+column_name+' as '+column_name 
from 
    information_schema.columns
where 
    table_name=@table_name
select @columns=''''''+replace(replace(@columns,' as ',''''' as '),',',',''''')

PRINT 'Headers'
PRINT @columns

PRINT 'Create a dummy file to have actual data'
select @data_file=substring(@file_name,1,len(@file_name)-charindex('\',reverse(@file_name)))+'\data_file_'+cast(cast(GETDATE() as date) as nvarchar)+'.xls'

print @data_file

print 'Generate column names in the passed EXCEL file'
set @sql='exec master..xp_cmdshell ''bcp " select * from (select '+@columns+') as t" queryout "'+@file_name+'_'+@CountryCode+cast(cast(GETDATE() as date) as nvarchar)+'.xls" -S "EGC25199\SQL2016" -T -c'''
print @sql
exec(@sql)

print 'Generate data in the dummy file'
set @sql='exec master..xp_cmdshell ''bcp "select * from '+@db_name+'..'+@table_name+' where CountryCode = '''''+@CountryCode+'''''" queryout "'+@data_file+'" -S "EGC25199\SQL2016" -T -c'''
print @sql
exec(@sql)

--Copy dummy file to passed EXCEL file
set @sql= 'exec master..xp_cmdshell ''type '+@data_file+' >> "'+@file_name+'_'+@CountryCode+cast(cast(GETDATE() as date) as nvarchar)+'.xls"'''
exec(@sql)

--Delete dummy file 
set @sql= 'exec master..xp_cmdshell ''del '+@data_file+''''
exec(@sql)

第2步:执行存储过程

USE [LegOgSpass]
GO

DECLARE @RC int
DECLARE @db_name varchar(100) = 'LegOgSpass'
DECLARE @table_name varchar(100) = 'TestExcel'
DECLARE @file_name varchar(100) = 'D:\Test\TestExcel'
DECLARE @CountryCode varchar(10) = 'EN'

-- TODO: Set parameter values here.

EXECUTE @RC = [dbo].[proc_generate_excel_with_columns] 
   @db_name
  ,@table_name
  ,@file_name
  ,@CountryCode

结果-文件夹图片 enter image description here

DA的结果

enter image description here

EN的结果

enter image description here

答案 1 :(得分:0)

Python还可以帮助自动化SQL数据-> Excel。此示例代码使用pyexcelerate创建了4个excel工作表。

#•pyexcelerate 
import pyexcelerate as px
from datetime import date 
wb = px.Workbook()
ws = wb.new_sheet("Report")
n = date.today()
ReportDate = "{:02.0f}{:02.0f}{}".format(n.day,n.month,n.year)
ws.range("B2", "C3").value = [[1, 2], [3, 4]]
Countrylist = ['USA', 'Australia','China','Nigeria']
#"Report - Australia 06082018.xlsx". 
for c in countrylist:
        wb.save("Report -"+c+' '+str(ReportDate)+".xlsx")