我有一个用SQL Server编写的视图。我需要将数据导出到Excel,以便每个可能的两个字母的国家/地区代码都有单独的Excel文件。文件名为“报告-国家 日期 .xslx”,例如“报告-澳大利亚06082018.xlsx”。
到目前为止,我刚刚将视图连接到Excel并针对每个国家/地区重复执行以下步骤:
大约有100个不同的国家/地区,因此这项工作非常重复且乏味。查询结果中的行太多,无法同时导出多个国家/地区的数据。有没有一种方法可以自动执行此过程,甚至只是其中的一部分?
答案 0 :(得分:1)
好的,通常我会推荐SSIS来做到这一点。它是处理您的问题的绝佳工具。但是,如果您真的想在SQL中执行此操作,则可以执行以下操作:
NB的
- 我只能通过使用xls excel文件来使其工作。
- 它会警告您它的来源不受信任,但是您只需单击“确定”即可。
- 我尚未对其进行深入测试,因此可能需要进行错误或修复:)
准备步骤:加载示例数据
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
DA的结果
EN的结果
答案 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")