Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как из MSSQL создать Excel-файл? / 20 сообщений из 20, страница 1 из 1
24.07.2019, 10:59
    #39840831
-SWAN-
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из MSSQL создать Excel-файл?
О ГУРУ MSSQL, Здравствуйте!
Подскажите, как из MSSQL создать Excel-файл?
Заполнить уже имеющийся Excel-файл я могу, но для этого файл уже должен быть создан:
Код: sql
1.
2.
3.
insert into OPENROWSET('Microsoft.ACE.OLEDB.12.0', 
    'Excel 8.0;Database=\\WDMYCLOUD\Public\обмен\tmpLebed\testLEBED.xlsx;', 
    'SELECT * FROM [Лист1$]') select [name] from [FB].[dbo].[Brand]



Спасибо заранее за любую помощь!
...
Рейтинг: 0 / 0
24.07.2019, 13:58
    #39840951
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из MSSQL создать Excel-файл?
-SWAN-,

Существует - использование CLR процедур, ReportingServices (рисуете отчет) или Integration Services (C# скрипт для рыбы + выгрузка потоками).
...
Рейтинг: 0 / 0
24.07.2019, 14:13
    #39840957
-SWAN-
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из MSSQL создать Excel-файл?
нашел вот такой вариант одновременного создания и заполнения Excel (правда только .xls , с .xlsx не получается):
Код: sql
1.
2.
3.
4.
5.
declare @sql varchar(8000), @file_name varchar(100)
set @file_name='\\WDMYCLOUD\Public\обмен\tmpLebed\MYNEWLEBEDTEST.xls'

set @sql='exec master..xp_cmdshell ''bcp "select * from dbp.[dbo].[tblCDEK_CitiesFORTEST] " queryout "' + @file_name +'" -C ACP -T -c'''
exec(@sql)


ещё минус этого варианта - не выводятся наименования столбцов (может есть способ создания названия столбцов?)
...
Рейтинг: 0 / 0
24.07.2019, 14:14
    #39840959
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из MSSQL создать Excel-файл?
...
Рейтинг: 0 / 0
24.07.2019, 14:22
    #39840963
-SWAN-
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из MSSQL создать Excel-файл?
TaPaK, спасибо за ссылку. Как раз копаю её уже час)))

Но тут есть минус - я создаю эту процедуру в одной БД, а вытаскиваю данные из другой - в этом случае названия столбцов отсутствуют.
...
Рейтинг: 0 / 0
24.07.2019, 16:01
    #39841020
Как из MSSQL создать Excel-файл?
Почему не сделать через SSRS? Клепаете rdl + подписка с выгрузкой на FTP
...
Рейтинг: 0 / 0
24.07.2019, 16:51
    #39841046
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из MSSQL создать Excel-файл?
Sergey Syrovatchenko,

народ предпочитает нестабильные решения и с дырами в безопасности.
...
Рейтинг: 0 / 0
25.07.2019, 08:32
    #39841201
uaggster
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из MSSQL создать Excel-файл?
Для простых выгрузок - используйте excel xml 2003.
По форуму бегала вполне рабочая процедура, генерирующая xml файл в формате exel xml 2003.
С т.з. пользователя - разницы никакой. Также по двум кликам экселям открывается.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

---------------------------------------
-- Usage:
-- 
-- Declare @ret int
-- exec @ret = [dbo].[OutToExcelFile] 'dbo.test', '', 'D:\MMSSQL\test.xml'
-- Select @ret
-- 
-- Параметры:
-- @object - table, view или функция, возвращающая табличное значение
-- @query - дополнительный отбор, должен выглядеть как 'Where ... and ...'
-- @path - Имя файла и путь. Папка может быть сетевой, но SQLSERVER должен иметь в нее разрешения. 
---------------------------------------

CREATE proc [dbo].[OutToExcelFile]
	 @object sysname
	,@query nvarchar(4000)
	,@path sysname
as
Begin
	set nocount on;
	set xact_abort on;
	
	DECLARE	@Result Int
	Declare @Command nvarchar(4000)

	SET	 @Command = 'bcp "' 
	+ Replace(Replace(dbo.fnExcelQuery(@object, @query),'"',''''''),'
',' ') -- должно быть именно так, это перевод строки!			
	+ '" queryout "' + @path + '" -S . -T -q -w'

	--print @Command
	EXEC @Result = master.dbo.xp_CmdShell @Command, no_output
		
	IF (@Result = 0) return 0
		ELSE return -1 -- была ошибка
End
GO

CREATE FUNCTION [dbo].[fnExcelQuery] (
	 @Object	SysName
	,@Query		NVarChar(max)
) RETURNS NVarChar(max) AS BEGIN RETURN ((
SELECT	  CASE	WHEN C.column_id = 1
		THEN ' '
		ELSE '
	,'	END + 'NULL AS [text()],'
	+ CASE	WHEN C.system_type_id IN (48,52,56,59,60,62,106,108,122,127)
							THEN '''Number''  '
		WHEN C.system_type_id IN (58,61)	THEN '''DateTime'''
		WHEN C.system_type_id = 104		THEN '''Boolean'' '
							ELSE '''String''  '
		END + 'AS [Cell/Data/@s:Type],'
	+ QuoteName(C.name) + Space(Max(Len(C.name))OVER() - Len(C.name)) + ' AS [Cell/Data/text()]'
		AS [Row/text()]
	, IsNull('<Column s:StyleID="'
	+ CASE	WHEN C.system_type_id IN (48,52,56,59,62,106,108,127)
							THEN 'Number'
		WHEN C.system_type_id IN (60,122)	THEN 'Currency'
		WHEN C.system_type_id IN (58,61)	THEN 'DateTime'
		WHEN C.system_type_id = 104		THEN 'Boolean'
		END + '" />','<Column />')
		AS [Style/text()]
	,'<Cell><Data s:Type="String">' + RePlace((SELECT C.name AS [*] FOR XML Path('')),'''','&apos;') + '</Data></Cell>'
		AS [Name/text()]
FROM	sys.columns C
WHERE	C.[object_id] = Object_ID(@Object)
ORDER BY C.column_id
FOR XML Path(''),Type).query('(<Row>{/Row/text()}</Row>,<Style>{/Style/text()}</Style>,<Name>{/Name/text()}</Name>)').value('fn:concat("
;WITH XMLNAMESPACES(Default ''urn:schemas-microsoft-com:office:spreadsheet'',''urn:schemas-microsoft-com:office:spreadsheet'' AS s)
SELECT	N''<?xml version=""1.0"" encoding=""UTF-16""?><?mso-application progid=""Excel.Sheet""?>'' + Convert(NVarChar(max),IsNull((
SELECT	",(/Row/text())[1],"
FROM	",sql:variable("@Object"),sql:variable("@Query"),"
FOR XML Path(''Row''),Root(''Table''),Type),'''').query(''
<Workbook xmlns=""urn:schemas-microsoft-com:office:spreadsheet"" xmlns:s=""urn:schemas-microsoft-com:office:spreadsheet"">
 <Styles>
  <Style s:ID=""Boolean""><NumberFormat s:Format=""True/False"" /></Style>
  <Style s:ID=""Currency""><NumberFormat s:Format=""Currency"" /></Style>
  <Style s:ID=""Number""><NumberFormat s:Format=""General Number"" /></Style>
  <Style s:ID=""DateTime""><NumberFormat s:Format=""General Date"" /></Style>
 </Styles>
 <Worksheet s:Name=""",sql:variable("@Object"),""">
  <Table>
   ",(/Style/text())[1],"   &lt;Row&gt;
   ",(/Name/text())[1],"   &lt;/Row&gt;
   {/Table/Row}
  </Table>
 </Worksheet>
</Workbook>''))")','NVarChar(max)')
) END
GO



Авторство не моё, на этом же форуме нашел.
Автору - спасибо!
...
Рейтинг: 0 / 0
25.07.2019, 10:12
    #39841237
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из MSSQL создать Excel-файл?
uaggsterПо форуму бегала вполне рабочая процедура, генерирующая xml файл в формате exel xml 2003.
Всегда удивляло желание сделать что угодно непременно средствами сервера - отправить XmlHttpRequest, что-то сделать в AD, или вот как здесь - эксель сгенерить. Зачем нужен этот хардкор с динамическим XQuery, когда вполне можно задействовать CLR-процедуру, или внешнюю программу, которая в лаконичном и удобоваримом виде сделает то же самое с помощью нормально читаемого XSL-шаблона (или с помощью всего предложенного выше).
...
Рейтинг: 0 / 0
25.07.2019, 12:09
    #39841324
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из MSSQL создать Excel-файл?
Сон Веры Павловны,

объясняется просто - всё от недостатка образования.
...
Рейтинг: 0 / 0
25.07.2019, 13:04
    #39841354
-SWAN-
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из MSSQL создать Excel-файл?
Владислав КолосовSergey Syrovatchenko,

народ предпочитает нестабильные решения и с дырами в безопасности.

Объясните, пожалуйста, где же в том коде, что я нашел, дыра безопасности? И почему решение нестабильно?

У меня задача изначально стояла такая - автоматически из MSSQL (задание по расписанию) генерить и отправлять письма с вложениями (Excel-файлы) с данными из Сайта и MSSQL и нашего клиента MS Access.
Можете предложить другой вариант решения?
...
Рейтинг: 0 / 0
25.07.2019, 13:16
    #39841364
Критик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из MSSQL создать Excel-файл?
-SWAN-У меня задача изначально стояла такая - автоматически из MSSQL (задание по расписанию) генерить и отправлять письма с вложениями (Excel-файлы) с данными из Сайта и MSSQL и нашего клиента MS Access.
Можете предложить другой вариант решения?

Джоб и SSIS-пакет
...
Рейтинг: 0 / 0
25.07.2019, 13:23
    #39841369
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из MSSQL создать Excel-файл?
-SWAN-У меня задача изначально стояла такая - автоматически из MSSQL (задание по расписанию) генерить и отправлять письма с вложениями (Excel-файлы) с данными из Сайта и MSSQL и нашего клиента MS Access.
Можете предложить другой вариант решения?
SSRS-отчет и подписка

в виде бонуса получишь возможность разных экселевских "бантиков" в отчете, в плане шрифтов, фонов и т.д.
...
Рейтинг: 0 / 0
25.07.2019, 13:42
    #39841376
-SWAN-
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из MSSQL создать Excel-файл?
Джоб и SSIS-пакет
SSRS-отчет и подписка
...
Данными средствами возможно "вытянуть данные" с сайта (MySQL) и одновременно запустить пару-тройку процедур в MSSQL?
А после этого сформировать письмо на Email Получателя (с вложениями) с определенного почтового адреса?
...
Рейтинг: 0 / 0
25.07.2019, 16:49
    #39841516
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из MSSQL создать Excel-файл?
-SWAN-Джоб и SSIS-пакет
SSRS-отчет и подписка
...
Данными средствами возможно "вытянуть данные" с сайта (MySQL) и одновременно запустить пару-тройку процедур в MSSQL?
А после этого сформировать письмо на Email Получателя (с вложениями) с определенного почтового адреса?SSIS-пакетом можно.

Но, конечно, всё зависит от конкретной задачи.

1) Вариант от uaggster очень хорош, быстрый, стабильный и надёжный, но не позволяет конструировать документы по шаблонам.

2) Решение на SSIS более трудоёмко, громоздко, требует более квалифицированного программиста, то есть дороже. Медленее вносить изменения. Медленнее работает (ИМХО). Ну и сложнее (существенно дороже) в эксплуатации.
Но зато с шаблонами, а это очень ценно.

3) Вариант с OPENROWSET, как любой вариант с работающим из MSSQL Эксель-провайдером, ненадёжный и требует плясок с драйверами (притом на сервере!). Но зато три строки кода. Но заставить работать эти три строки кода дано не каждому.
Вот одно из обсуждений: https://stackoverflow.com/questions/909933/sql-server-export-to-excel-with-openrowset
, и там такой код (провайдер, как видите, другой):
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
DECLARE @myfile varchar(800)

SET @myfile = 'C:\template.xls'

EXEC ('
insert into OPENROWSET(''Microsoft.Jet.OLEDB.4.0'', 
''Excel 8.0;Database=' + @myfile + ';'', 
''SELECT * FROM [SheetName$]'') 
select * from myTable
')
...
Рейтинг: 0 / 0
25.07.2019, 18:46
    #39841582
zindur
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из MSSQL создать Excel-файл?
правда не совсем "Excel" но можно сохранить как CSV файл - правда надо немножко поправить скрипт
...
Рейтинг: 0 / 0
25.07.2019, 19:10
    #39841595
vikkiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из MSSQL создать Excel-файл?
xlsx это зазипованный xml с которым SQL Server прекрасно работает
(так-же как и наличие возможности вызова внешних команд/скриптов, cmd PowerShell и пр.),
так что рассыпай ворох граблей, изобретай велосипед и начинай там ездить сколько угодно.
хоть как советуют выше - сначала в CSV а потом конвертация в xlsx
...
Рейтинг: 0 / 0
26.07.2019, 03:59
    #39841711
Lepsik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из MSSQL создать Excel-файл?
просто копируйте пустой файл на место его и открывайте
...
Рейтинг: 0 / 0
26.07.2019, 17:33
    #39842026
zindur
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из MSSQL создать Excel-файл?
zindurправда не совсем "Excel" но можно сохранить как CSV файл - правда надо немножко поправить скрипт

DumpDataFromTable

почемуто линк потерялся по пути

DumpDataFromTable
...
Рейтинг: 0 / 0
29.07.2019, 11:04
    #39842445
uaggster
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из MSSQL создать Excel-файл?
Сон Веры ПавловныuaggsterПо форуму бегала вполне рабочая процедура, генерирующая xml файл в формате exel xml 2003.
Всегда удивляло желание сделать что угодно непременно средствами сервера - отправить XmlHttpRequest, что-то сделать в AD, или вот как здесь - эксель сгенерить. Зачем нужен этот хардкор с динамическим XQuery, когда вполне можно задействовать CLR-процедуру, или внешнюю программу, которая в лаконичном и удобоваримом виде сделает то же самое с помощью нормально читаемого XSL-шаблона (или с помощью всего предложенного выше).
Ну, во-первых, хардкор с динамическим sql - там только с вызовом bcp из текста хранимой процедуры.
Если на сервере взведено Filestream, то ничего этого не нужно, можно создавать файлы прямо в filetable одним запросом.
А во вторых - чем сборка "выходного" xml, сделанная таким образом хуже, и малочитабельней чем xslt преобразование, которое, к тому же, выполняется черте где?
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как из MSSQL создать Excel-файл? / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]