Выгружать результаты запроса в excel

Автор Пустовалов Артем, 17 ноя 2015, 12:29

0 Пользователей и 1 гость просматривают эту тему.

Всем привет :) Есть у меня вопрос как лучше вывести данные из запроса в файл ехсеl и word. У кого какие мысли? Подтолкните в нужное русло?)


Запрос в таблицу Значений. Таблицу значений в ексель, ворд




vitasw, Забыл про это)) :ooifh:


Цитата: vitasw от 17 ноя 2015, 12:41Есть. Метод табличного документа Записать(<ИмяФайла>,<ТипФайла>)

Это метод относится к ComОбъекту?Я правильно понял?

Или я что то не так делаю?

Запрос.УстановитьПараметр("Ссылка",Документ);
ТабДок = Документ.ПолучитьОбъект();
ТабДок.Записать(ДиалогОткрытияФайла.ПолноеИмяФайла,ТипФайлаТабличногоДокумента.XLSX);


Поидее
РезЗапроса = Запрос.Выполнить().Выгрузить();
РезЗапроса.Записать(«D:111.xls»);

не..так не получилось.

ТабличныйДокумент это то куда выводится перед печатью.
перед ТабДок.Показать();

а вот как из Запроса получить ТабличныйДокумент?)



Цитата: Sinsinmin от 17 ноя 2015, 13:50
Поидее
РезЗапроса = Запрос.Выполнить().Выгрузить();
РезЗапроса.Записать(«D:111.xls»);

не..так не получилось.

ТабличныйДокумент это то куда выводится перед печатью.
перед ТабДок.Показать();

а вот как из Запроса получить ТабличныйДокумент?)

Ну у меня внешняя обработка.Вот  я подумал а можно ли в внешнюю обработку передать макет печатной формы? и его и записать)?


В общем есть три варианта. Коими я пользуюсь.
Первый: Ставишь точку остановки в отладчике сразу после выполнения запроса.
Жмёшь вычислить выражение выделив РезЗапроса.
И в открывшемся окне жмёшь в правом вернем углу иконку с принтером. Называется вывести список.
Второй вариант: Создаёшь макет. На нём создаёшь параметры, с именами такими же как имена полей в запросе.
И циклом пишешь ТабДок.Параметры.Заполнить(Строка);

Третий вариант.
Циклом выводишь в эксель.:zebzdr:

Добавлено: 17 ноя 2015, 14:02


Если ты знаешь где у тебя лежит макет. То просто скопируй его себе в обработку. Жмёшь на макете CTRL+C а у себя в обработке на макете CTRL+V


Теги:

  • Форум 1С

  • Форум 1С — ПРЕДПРИЯТИЕ 8.0 8.1 8.2 8.3 8.4

  • Конфигурирование, программирование в 1С Предприятие 8

  • Из запроса в Excel

Похожие темы (5)

Рейтинг@Mail.ru

Rambler's Top100

Поиск

Сколько раз вам приходилось писать быстрый запрос в SQL Management Studio для кого-то, а затем экспортировать данные в Excel? Экспорт данных из SQL Server — это довольно длительный процесс, состоящий из нескольких этапов, но если вы сделаете это несколько раз, это неплохо.

Из сохранения результатов SQL-запроса в формате Excel или CSV я узнал, что лучше всего использовать мастер импорта и экспорта SQL, а не пытаться щелкнуть правой кнопкой мыши результаты и сохранить их.

экспорт sql в excel

Вы всегда можете щелкнуть правой кнопкой мыши и выбрать «Сохранить результаты как», однако полученный CSV-файл не будет содержать заголовков столбцов! Это королевская боль, если у вас есть 50 столбцов.

Чтобы правильно экспортировать данные SQL, щелкните правой кнопкой мыши базу данных (не таблицу) и выберите Задачи, Экспорт данных.

задачи экспорта данных

Далее вам нужно выбрать источник данных. Если вы щелкнули правой кнопкой мыши на имени базы данных, то все должно появиться автоматически.

выберите источник данных sql

Теперь вам нужно выбрать пункт назначения. Идите вперед и выберите Microsoft Excel из выпадающего списка. После этого вам нужно будет нажать кнопку «Обзор» и выбрать местоположение для выходного файла Excel. Также не забудьте установить флажок «У первой строки есть имена столбцов».

Данные SQL, чтобы преуспеть

Затем вы можете либо экспортировать всю таблицу / представление в Excel, либо написать собственный запрос. В моем случае я напишу конкретный запрос для данных, которые я хочу экспортировать.

экспортировать данные в Excel

Введите свой запрос и затем нажмите Parse, чтобы убедиться, что все правильно.

экспорт sql запроса

Наконец, нажмите Далее, а затем нажмите Готово. Ваши данные SQL будут выведены в файл Excel, и он будет также включать все заголовки столбцов! Наслаждайтесь!

The typical way to achieve this is to export to CSV and then load the CSV into Excel.

TL;DR:

  • For a server-side Excel-friendly CSV file from a SELECT query, run this:

    SELECT ... FROM someTable WHERE etc
    INTO OUTFILE 'someTableExport.csv' CHARACTER SET utf8mb4
    FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY ''
    LINES TERMINATED BY 'rn';
    
  • For a server-side Excel-friendly CSV file use mysqldump like so:

    mysqldump -h serverHostName -u mysqlUserName -p --tab="someTableExport.csv" --fields-optionally-enclosed-by=0x22 --fields-escaped-by='' --fields-terminated-by=0x2C --lines-terminated-by=0x0D0A --databases databaseName --tables table1 table2 table3
    
  • For a client-side Excel-friendly CSV file using mysqlsh (MySQL Shell) like so:

    mysqlsh --user="mysqlUserName" --host="serverHostName" --port=3306 --schema="databaseName"
    # Once connected, run this:
    util.exportTable("tableName", "file:///C:/Users/You/Desktop/test.csv", { dialect: "csv", fieldsEscapedBy: ""})
    

First, a caution about Excel:

Excel’s vs. MySQL’s default CSV formats:

Remember that Excel has its own underdocumented ideas about how CSV files should be formatted and these stand in-contrast to MySQL’s own ideas about CSV files; though Excel is largely compliant with RFC 4180 you still need to prod and poke MySQL and its associated tooling to generate CSV files that Excel won’t misinterpret:

Excel MySQL (default) MySQL (when configured)
SQL NULL Zero-length value Literal N Literal NULL
Text values that don’t contain commas, quotes, or line-breaks Not enclosed Not enclosed Enclosed in "
Text values that contain commas, quotes, or line-breaks Enclosed in " Not enclosed Enclosed in "
Non-text values Not enclosed Not enclosed Not enclosed
Line-breaks and tabs in text values Literal Escaped as [r]n Literal
Double-quotes in text values Doubled-up "" Escaped as " Doubled-up ""
Field separator , t (Tab) ,
Record separator rn n rn
Commas inside non-quoted text values (Results in broken table data) Not escaped Will always be quoted if the value contains a comma
UTF-8 support
  • Excel 2007-2013: — Requires leading UTF-8 BOM
  • Excel 2016+: — Handles BOM-less UTF-8 with some prodding
Use utf8mb4.
Do not specify the older broken utf8 or utf8mb3 encodings.
Use utf8mb4

As per the table above, MySQL can generate Excel-friendly CSV files, excepting that SQL NULLs will always be interpreted by Excel as literal text, though it’s trivial to use PowerQuery or even just Find-and-Replace in Excel to replace them with empty cells.

Excel and special CSV text markers

  • If any of your text values start with = then you’ll need to manually fudge those as even when quoted Excel will interpret the text following = as a formula instead of literal text.
  • Also watch out for leading text like sep= too.

Excel and UTF-8 encoding:

Surprisingly, it wasn’t until Excel was 31 years old (Excel 2016) when Excel added built-in support for UTF-8 encoding in files without needing a BOM, but it still defaults to importing and exporting CSV files using your system-default non-Unicode encoding (e.g. Windows-1252).

  • When importing CSV into Excel, be sure to select Codepage 65001 for correct UTF-8 handling as Excel still defaults to non-Unicode-based codepages for some reason.
    • Note that opening a CSV file in Excel won’t display the Text Import Wizard. (As of Excel 2021) you need to copy-and-paste CSV text into Excel and use the popup menu to use the legacy (frozen-in-1994) wizard, or use Data > From Text/CSV on the ribbon to use the newer (but less flexible, imo) PowerQuery-based CSV import wizard:

Your options:

Option SELECT INTO OUTFILE mysqldump --tab mysqldump > file.csv mysqlsh MySQL Workbench
Server-side CSV True True True True Broken
Remote (client-side) CSV False False False True Broken
MySQL Server version support All versions All versions All versions Only 5.7 and later All versions

Option 1: Exporting an Excel-friendly CSV using INTO OUTFILE:

  • You can do a server-side CSV export by using the INTO OUTFILE clause of a SELECT query.
    • Because this is «normal» SQL that’s executed by the MySQL server this works regardless of whatever MySQL client tool you’re using, so you don’t need to install MySQL Workbench.
    • …but because this is a server-side export you need to have permission to write to the server’s filesystem which you might not have, in which case consider using specialty export tools like mysqldump (see below).
  • MySQL’s OUTFILE clause has a number of optional subclauses that must be specified for some-level of compatibility with Excel’s own CSV reader:
    • FIELDS...
      • TERMINATED BY (default: 't', for Excel use ',')
      • [OPTIONALLY] ENCLOSED BY (default: '', should be '"' with the OPTIONALLY keyword)
      • ESCAPED BY (default: '\', for Excel use '')
    • LINES...
      • TERMINATED BY (default: 'n', for Excel use 'rn')
      • STARTING BY (default: '', for Excel you can omit this or use the MySQL default).
    • Do not use ENCLOSED BY (without the preceding OPTIONALLY keyword) as that will enquote all values, regardless of type (i.e. it will enquote int values which will cause Excel (by default) to interpret them as text (strings) instead of numbers).
  • Note that there is no option to instruct MySQL to output SQL NULLs as empty-fields, and so Excel will interpet them as unquoted strings of text (i.e. as "NULL"), so you’ll want to do a Find-and-Replace in Excel after importing the file.
  • If your INTO OUTFILE <fileName> filename (e.g. 'someTableExport.csv' above) is not an absolute path then it will be saved into your database’s datadir directory. Run SHOW VARIABLES LIKE 'datadir'; to get the path. Note that you might not necessarily have read/write permission for new files under that directory.

So your query (SELECT * FROM document WHERE documentid...) would look something like this:

SELECT
    *
FROM
    document 
WHERE
    documentid IN ( SELECT documentid FROM TaskResult WHERE taskResult = 2429 )
INTO
    OUTFILE 'someTableExport.csv'
    FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"', ESCAPED BY ''
    LINES TERMINATED BY 'rn';

Option 2: Exporting an Excel-friendly CSV using mysqldump:

  • To store dump into CSV file using the --tab command-line option, as per mysqldump‘s documentation.
  • Unfortunately mysqldump‘s --tab= option won’t work for remote MySQL servers: this is because --tab="fileName.csv" can only represent a path on the server.
    • While you can use stdout redirection to generate a local file (i.e. mysqldump --etc > output.csv) you cannot use the --fields-terminated-by and other format options with stdout, making it useless for Excel-compatible output. So if you’re remote and cannot ssh-in then you will need to use MySQL Shell (mysqlsh) instead (see below).
  • Note that mysqldump does not support SELECT queries for dumping data: it does support simple WHERE-style filters with the --where=<expr> option but this doesn’t support things like filtering using an INNER JOIN (though as a workaround you could SELECT into a new table, then run mysqldump on that new table. Note that you cannot use TEMPORARY TABLE with mysqldump as Temporary Tables are connection-scoped).

In the OP’s case, due to limitations inherent in how the --where= command-line option works, they’ll want to export both tables (document and TaskResult) and apply their filter logic in Excel PowerQuery or similar. Perform the export like so:

mysqldump -h serverHostName -u mysqlUserName -p --tab="someTableExport.csv" --fields-optionally-enclosed-by=0x22 --fields-escaped-by='' --fields-terminated-by=0x2C --lines-terminated-by=0x0D0A --databases databaseName --tables document TaskResult
  • The above command-line should work without modification in Windows’ cmd.exe, macOS’s zsh, and bash on Linux — provided mysqldump is in your PATH.

  • The use of hex-encoded chars means sidestepping the hassle of figurig out how to pass double-quotes and line-breaks as literals in your shell and terminal (0x22 is ", 0x2C is ,, and 0x0D0A is rn).

  • Avoid using the --password=<value> (aka -p<value>) option on
    the mysqldump command-line, as it will mean your password will be saved in plaintext to your terminal or console history file, which is an obvious massive security risk.

    • So if you’re in an interactive command-line session need to specify a password then mysqldump will prompt you for the password immediately when the program runs so it won’t be saved to your history file.
    • If you want to run mysqldump in a non-interactive context (e.g. from within a web-application, daemon, or other process) then there’s (normally) no history file to worry about, but you should still consider alternative approaches before resorting to handling passwords in an insecure way.
  • If you don’t specify an absolute path but use a short (unqualified) filename like INTO OUTFILE 'output.csv' or INTO OUTFILE './output.csv' theb it will store the output file to the directory specified by SHOW VARIABLES LIKE 'datadir';.

Option 3: Exporting an Excel-friendly CSV using MySQL Workbench:

Unfortunately, you can’t (unless you don’t have any double-quotes anywhere in your data): As of late 2022 MySQL Workbench has an open bug regarding its own CSV export feature: output files never escape double-quote characters in text, so pretty much all CSV-handling software out there will report a malformed CSV file or import data to the wrong columns — so this makes it completely unsuitable for use with Excel.

Option 4: Exporting an Excel-friendly CSV using MySQL Shell (aka mysqlsh):

  • This is probably the simplest option, but you might need to install the MySQL Shell as it doesn’t come in-box in most MySQL installations.
  • MySQL Shell supports connecting to MySQL Server 5.7 and later (but not older versions). If you’re still using MySQL Server 5.6 or earlier (then you really should update to 5.7 or later anyway) you’ll have to stick with mysqldump run locally on the MySQL Server itself (but you can use an ssh session, of course).
    • The new «MySQL X» protocol (mysqlx://user@host/schema) is not supported by MySQL 5.7, but mysqlsh supports non-X connections with old-style command-line parameters.
  1. Install MySQL Shell if it isn’t already installed.
  2. If you start MySQL Shell without any command-line arguments (e.g. because you use the Start Menu shortcut on Windows)) then use the connect command to connect.
    • For MySQL 5.7 use connect mysql://username@hostname

    • For MySQL 8.0+ there are a variety of ways to connect, including the «MySQL X» protocol as well as «Classic» connections. Consult the docs for more info.

    • If your username contains literal @ characters then you need to percent-encode them (e.g. if you’re using Azure MySQL then your full username will be like username%40servername@servername.mysql.database.azure.com).

    • Immediately after you submit the connect command you will be prompted for your password interactively.

  3. If you can start mysqlsh with arguments, then you can run mysqlsh --user="userName" --host="hostName" --port=3306 --schema="dbName" directly without using the connect command.
  4. Once connected, run the util.exportTable(tableName, outputUri, options) command with the following arguments:
    • tableName: your table name.
      • Unfortunately there doesn’t seem to be a way to apply a WHERE filter or export the results of a SELECT query, (though as with mysqldump you could always save your query results to a new TABLE, then export that table, then DROP TABLE when you’re done with it. Remember that TEMPORARY TABLE won’t work here as tables created in one session aren’t visible from any other session — and mysqlsh will have its own session.
    • outputUri: To save the file locally use a file:/// URI.
      • On Windows you can use a forward-slash as a directory-name separator instead of a backslash. e.g. file:///C:/Users/Me/Desktop/export.csv.
    • options: To ensure compatibility with Excel specify { dialect: "csv", fieldsEscapedBy: ""}.
      • The dialect: "csv" option sets Excel-compatible defaults for all-but-one of the OUTFILE parameters, so you must also specify fieldsEscapedBy: "", otherwise SQL NULL will be be rendered as N (literally) while double-quotes and line-breaks inside text values will be backslash-escaped, which Excel doesn’t support.
   Help_1c

02.04.14 — 16:04

Как получить результат запроса?и выгрузить его в Документ Excel?

   Help_1c

1 — 02.04.14 — 16:07

Например мы делаем Запрос по Номенклатуре надо данные полученные Выгрузить в Документ Excel!?

   RomaH

2 — 02.04.14 — 16:07

,,,,,,,,,,,,,,,,,,,,,,,,,,,,

   Aswed

3 — 02.04.14 — 16:08

………………….

   mikecool

4 — 02.04.14 — 16:08

(0) получи табдокумент и выгрузи! будь мужиком

   Kondarat

5 — 02.04.14 — 16:09

ДокументExcel = Новый ДокументExcel;

ДокументExcel.Загрузить(РезультатЗапроса.Выгрузить());

   программистище

6 — 02.04.14 — 16:10

по средам и такие темы?

   Aleks73

7 — 02.04.14 — 16:11

(5) Зачем шутишь над подаваном ? ведь он так и сделает…

ТС, выгрузки в таблицу значений и правой мышью получишь табличку, которую можешь сохранить в екселе.

   RomaH

8 — 02.04.14 — 16:11

давай жалостливую историю — типа, я тут работаю уборщиком, а директор приказал сделать XYZ анализ номенклатуры

   salvator

9 — 02.04.14 — 16:11

Выгрузить результат запроса в ТЗ на форму, в режиме предприятия «Вывести список», далее сохранить в Excel

   Help_1c

10 — 02.04.14 — 16:11

(5)  так просто! документ Excel находится на ПК.

   RomaH

11 — 02.04.14 — 16:12

(1) выгружай в ТД — умеешь?

   RomaH

12 — 02.04.14 — 16:13

(9) точно, нафига заморачиваться — СКД наше все

запрос — сохранить — открыть выполнить — контролс — контроли

   mikecool

13 — 02.04.14 — 16:13

как научиться создавать не умные темы?

   Help_1c

14 — 02.04.14 — 16:15

ТД-Текстовой документ — Да умею, но в Excel не умею :(

   RomaH

15 — 02.04.14 — 16:16

(14) контрол + С — контрол +V

   Aleks73

16 — 02.04.14 — 16:16

(14) см (7), потом сохранить докмуент в формате икс- эль

   RomaH

17 — 02.04.14 — 16:16

(14) или погугли

   Maxus43

18 — 02.04.14 — 16:16

Табличный документ если заполнишь данными — его можно просто сохранить в формате экселя

   Help_1c

19 — 02.04.14 — 16:19

Ладно спасибо всем с этим разберусь ))

но вот еще тема некто не помогает если не трудно посмотрите :)

v8: Как Выгрузить Документ в Макет?/Как Загрузить данные из Макет в Документа?

   Help_1c

20 — 02.04.14 — 16:27

Все понял о чем вы :) Не в пользовательском режиме Выгрузить!

А программно надо !

Сперва желательно создать документ Эксель на пк ДИСК D:

Потом запрос по номенклатуре получить результат выгрузить его в Эксель и сохранить файл.

Как-то так :)

   salvator

21 — 02.04.14 — 16:30

(20) В яндексе забанили? Заставь себя набрать несколько букв в поисковике.

   Йохохо

22 — 02.04.14 — 16:31

ТабличныйДокумент.Записать (SpreadsheetDocument.Write)

ТабличныйДокумент (SpreadsheetDocument)

Записать (Write)

Синтаксис:

Записать(<ИмяФайла>, <ТипФайлаТаблицы>)

Параметры:

<ИмяФайла> (обязательный)

Тип: Строка.

Имя файла, в котором сохраняется табличный документ.

<ТипФайлаТаблицы> (необязательный)

Тип: ТипФайлаТабличногоДокумента.

Формат, в котором будет сохранен табличный документ.

Значение по умолчанию: MXL

Описание:

Записывает табличный документ в файл.

  

Help_1c

23 — 02.04.14 — 16:50

попробую сделать на полученную инф. СПС.

Время на прочтение
7 мин

Количество просмотров 1.9K

Итак, у нас есть часто применяемый в государственных структурах 1С-Битрикс и опрос с 30 или 50 вопросами и несколькими десятками тысяч ответов. При попытке экспортировать результаты опроса силами стандартных механизмов 1С-Битрикс все это выполняется от получаса и более, что является не очень рабочим сценарием. Конечно, можно запустить процесс формирования выгрузки фоном, и в конце высылать на почту сформированный xls-файлик… Но практика показала, что при формировании больших xls-файлов силами php серверу еще частенько и памяти не хватает… Окончательным «гвоздем» в подобные решения стало то, что автор стати не владеет PHP, но владеет SQL. Отсюда и родилась мысль написать SQL-запрос, который можно выполнить через Workbench или DBeaver (кто его ставит — не забудьте сразу снять галочку, что пустые строки разделяют запросы), и его результаты загрузить в Excel. В дальнейшем этот запрос можно будет запускать и из PHP с дальнейшим формированием файла с выгрузкой.

Первой же проблемой, с которой столкнулся автор, стало то, что мы заранее не знаем сколько столбцов в результатах опроса, потому что в общем случае мы не знаем количество вопросов. Можно, конечно, каждый раз переписывать запрос по какому-то шаблону, но лень — двигатель прогресса, который решил сделать следующим образом. Из-за того, что нам в подавляющем количестве случаев результаты все равно нужны в Excel, мы формируем в результатах запроса одно текстовое поле, которое будет строкой csv-файла. При этом пришлось пойти на небольшие допущения. Пришлось внести изменения в данные в процессе выгрузки: двойные кавычки (их используем в качестве ограничителя строк в csv) заменяем на одинарные, а переносы строк просто удаляем.

Второй проблемой стало то, что автор не сумел «запихать» всю логику в один запрос без использования CTE. А CTE до определенного момента не поддерживались в mySQL. Поэтому в своё время была написана хранимая процедура, формирующую временную таблицу и работающая уже с ней.

Ниже привожу два варианта SQL-кода. Первый представляет собой одиночный запрос с использованием CTE (может использоваться в относительно новых версиях СУБД mySQL и MariaDB). Если ваша СУБД не поддерживает CTE, то используйте второй вариант с созданием хранимой процедуры. Подставляете в нужные места идентификаторы опроса и сроки для выгрузки и используете в соответствии с комментариями (особое внимание на сохранение в ANSI). Лично я копипасчу результаты выполнения запроса из DBeaver в Notepad++ и сохраняю в csv-файл. Такой csv-файл Excel корректно открывает по умолчанию по двум кликам. Но если этого не произошло — используйте функционал импорта из текста в соответствии с изображением:

В общем, запускайте запросы, встраивайте их в свой код, формируйте ответы и радуйте своих заказчиков.

Запрос с CTE

/*запрос позволяет вытащить результаты любого голосования в Битрикс Управление Сайтом в форме csv
 Внесите идентификатор опроса в двух местах в запросе (сейчас поставлено 24), укажите период
 за который нужна выгрузка, выполните запрос, сохраните результаты в csv-файле (в ANSI) и отройте его в Excel
 В текстах будут удалены переносы и табуляции, а двойные кавычки заменены на одинарные
 */
with 
cte_headers (id, uuser, ddate, answers) as ( 	-- формируем строку, которая станет заголовком столбцов в csv. 
	select 	'ID',								-- потом склеим её с результатами через union
			'Посетитель (ID)' ,
			'Дата',
-- меняем двойные кавычки на одинарные (чтобы корректно работал разделитель). Здесь и далее ячейки в csv будут обернуты двойными кавычками и разделены точкой с запятой
			(select group_concat(replace(coalesce(b_vote_question.question,''),'"',Char(39)) separator '";"')       
    from b_vote_question 
    where b_vote_question.vote_id=24  -- внести идентификатор опроса
    order by  b_vote_question.c_sort)),
cte_b_vote_event_id as ( -- выбираем факты голосования, которые нам нужны
	select id, date_vote, vote_user_id 
	from b_vote_event 
	where 	b_vote_event.vote_id=24 and -- внести идентификатор опроса
			b_vote_event.date_vote>'2017-01-01 00:00:00' and  	-- внести дату начала выборки
			b_vote_event.date_vote<'2023-01-01 00:00:00'),   	-- внести дату окончания выборки
cte_vote_data (id, uuser, ddate, answers) as( -- выбираем все ответы, "склеиваем" их в CSV. Ячейка ограничена двойными кавычками. Разделитель - точка с запятой
	select 	cte_b_vote_event_id.id as id, 
			coalesce(concat(b_user.login,' ', coalesce(b_user.name,''),' ',coalesce(b_user.last_name,''),' (',b_user.id,')'),'неавторизованный пользователь') as user, 
			cte_b_vote_event_id.date_vote as ddate,
			(select group_concat(coalesce((	select group_concat(trim(concat(replace(coalesce(b_vote_answer.message,' '),'"',Char(39)),' ',replace(coalesce(b_vote_event_answer.message,' '),'"',Char(39)) )) separator ' && ') -- && разделяет если ответов несколько
											from b_vote_event_answer -- так как ответ может быть внесен пользователем "руками" или выбран из готового, то просто конкатим эти строки
												left join b_vote_answer on b_vote_answer.id=b_vote_event_answer.answer_id
											where b_vote_event_answer.event_question_id=b_vote_event_question.id 
								),' ') separator '";"')
			from b_vote_question
					left join b_vote_event_question on b_vote_event_question.question_id=b_vote_question.id and b_vote_event_question.event_id=cte_b_vote_event_id.id              
			where b_vote_question.vote_id=24) as content -- внести идентификатор опроса
	from  cte_b_vote_event_id
				left join b_vote_user on b_vote_user.id=cte_b_vote_event_id.vote_user_id
				left join b_user on b_user.id=b_vote_user.auth_user_id
	order by id desc)              
-- в итоговом запросе склеиваем заголовки с ответами и убираем переносы,  чтобы не "ломался" csv-файл
select replace(replace(concat('"',id,'";"',uuser,'";"',ddate,'";"',answers,'"'),char(10),''),char(13),'') 
from cte_headers
union
select replace(replace(concat('"',id,'";"',uuser,'";"',ddate,'";"',answers,'"'),char(10),''),char(13),'') 
from cte_vote_data

Запрос без CTE (если в вашей СУБД CTE не поддерживается)

/*скрипт позволяет вытащить результаты любого голосования в Битрикс Управление Сайтом в форме csv
 Внесите идентификатор опроса в двух местах в запросе (сейчас поставлено 24), укажите период
 за который нужна выгрузка, выполните запрос, сохраните результаты в csv-файле (в ANSI) и отройте его в Excel
 В текстах будут удалены переносы и табуляции, а двойные кавычки заменены на одинарные
 
 */

/* При вызове всего этого скрипта из кода необходимо проверять существоваение хранимки get_b_votes и только если она есть - выполнять дальнейший код, что бы не пересекаться с другими сессиями */
SET @@session.group_concat_max_len = 100000; /*этот параметр можно выставить в кофигурации mysql, он ограничивает максимальную длину, возвращаемую GROUP_CONCAT*/
SET SQL_SAFE_UPDATES = 0;
DROP PROCEDURE IF EXISTS get_b_votes;
delimiter $$
create procedure get_b_votes(
in _vote_id int,
in _date_from timestamp,
in _date_to timestamp
)
begin
/*Создаем курсор и обвязку для формирования осташейся части таблицы*/
    Declare done int default 0;
    Declare now_vote_event_id int;  
    Declare vote_event_cursor Cursor for (select id from b_vote_event where b_vote_event.vote_id=_vote_id and b_vote_event.DATE_VOTE<_date_to and b_vote_event.DATE_VOTE>_date_from order by id desc);
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;

/*Создаем временные таблицу, содержимое которых потом вернем*/
    DROP TABLE IF EXISTS get_b_votes_temp_table;
    CREATE TEMPORARY TABLE get_b_votes_temp_table (
    `id` varchar(255),
    `user` varchar(255),
    `ddate` varchar(255),
    `content` longtext
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    DROP TABLE IF EXISTS get_b_votes_return_table;
    CREATE TEMPORARY TABLE get_b_votes_return_table (
    `content` longtext
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

/*Формируем первую строку таблицы (заголовки)*/    
    insert into get_b_votes_temp_table (id, user, ddate, content)
    (
    select 'ID','Посетитель (ID)' ,'Дата',
        (select group_concat(replace(coalesce(b_vote_question.question,''),'"',Char(39)) separator '","')       
    from b_vote_question 
    where b_vote_question.vote_ID=_vote_id 
    order by  b_vote_question.c_sort));

/*Формируем оставшуюся часть таблицы*/    
    open vote_event_cursor;

    read_loop:LOOP
        FETCH vote_event_cursor INTO now_vote_event_id;
        IF done THEN LEAVE read_loop;  END IF;
            insert into get_b_votes_temp_table (id,user,ddate,content)       
            select 
                b_vote_event.id as id, 
                coalesce(concat(b_user.login,' ', coalesce(b_user.name,''),' ',coalesce(b_user.last_name,''),' (',b_user.id,')'),'неавторизованный пользователь') as user, 
                b_vote_event.date_vote as ddate,
                   (select group_concat(coalesce((select group_concat(trim(concat(replace(coalesce(b_vote_answer.message,' '),'"',Char(39)),' ',replace(coalesce(b_vote_event_answer.message,' '),'"',Char(39)) )) separator ' && ') -- && разделяет если ответов несколько
                                                from b_vote_event_answer
                                                left join b_vote_answer on b_vote_answer.ID=b_vote_event_answer.answer_id
                                                where b_vote_event_answer.event_question_ID=b_vote_event_question.id 
                                                ),' ') separator '","')
                from b_vote_question
                left join b_vote_event_question on b_vote_event_question.question_ID=b_vote_question.id and b_vote_event_question.EVENT_ID=now_vote_event_id               
                where b_vote_question.VOTE_ID=_vote_id) as content
                from  b_vote_event
                    left join b_vote_user on b_vote_user.id=b_vote_event.vote_user_id
                    left join b_user on b_user.id=b_vote_user.auth_user_id
                    where b_vote_event.id=now_vote_event_id;

    END LOOP;
/*закрываем курсор*/         
    close vote_event_cursor;    
/*Проводим окончательную обработку - сливаем все в один столбец*/    
    insert into get_b_votes_return_table (content) select replace(replace(concat('"',get_b_votes_temp_table.id,'","',get_b_votes_temp_table.user,'","',get_b_votes_temp_table.ddate,'","',get_b_votes_temp_table.content,'"'),char(10),''),char(13),'') from get_b_votes_temp_table;
/*Возвращаем что получилось*/    
    select * from get_b_votes_return_table as result;
  end $$
delimiter ;
/*это - пример вызова созданной процедуры. Сюда нужно подставлять индентификатор опроса (зд. опрос битрикса а не хайлоад-блок) и сроки для выборки с... по...*/
call get_b_votes(24,'2017-01-01 00:00:00','2023-05-01 00:00:00');

DROP PROCEDURE IF EXISTS get_b_votes;

Для желающих поковырять выкладываю схему взаимосвязей таблиц модуля Vote с основными полями:

P.S. Автор не занимается продвижением или критикой 1С-Битрикс, а взаимодействует с ним таким, какой он есть. Также автор не претендует на звание гуру SQL и оформления кода.

95 / 91 / 16

Регистрация: 13.04.2015

Сообщений: 545

1

28.01.2016, 12:51. Показов 5725. Ответов 9


Студворк — интернет-сервис помощи студентам

Всем привет!
Уважаемые форумчане, выручите пожалуйста!
Можно ли как-то выгрузить результаты запроса в книгу эксель по кнопке.
много чего находил но все не то и не так, либо не работает либо прописывать пути и имена надо.
как-то можно сделать по такому принципу:
жмем кнопку, вводим код (счетчик) от и до, создается книга, экспортируются позиции в этом диапазоне, открывается пользователю готовый файл и он сохраняет его !!сам!!



0



896 / 286 / 50

Регистрация: 02.12.2014

Сообщений: 1,229

28.01.2016, 13:06

2

Если «он сохраняет его сам», то, мне кажется, вам нужно это делать через автоматизацию.
То есть в коде кнопки объявить объектную переменную для Экселя, и дальше работать с кодом так же, как с макросами Экселя (с небольшими правками). В общем, про автоматизацию в двух словах не напишешь, почитайте каких-нибудь обучалок на тему «автоматизация в Access».

Добавлено через 1 минуту
Например, вот по этой ссылке есть пример для Экселя и ворда:
http://info-comp.ru/obuchenies… excel.html
И вот здесь толково и объемно написано:
http://compress.ru/article.aspx?id=12230



0



texnik-san

шапоклякистка 8-го дня

3674 / 2234 / 391

Регистрация: 26.06.2015

Сообщений: 4,647

Записей в блоге: 1

28.01.2016, 13:22

3

Лучший ответ Сообщение было отмечено Aleks777 как решение

Решение

Visual Basic
1
        DoCmd.OutputTo acOutputQuery, "ИмяОтчета", acFormatXLSX, ("ИмяОтчета.xlsx"), True



1



95 / 91 / 16

Регистрация: 13.04.2015

Сообщений: 545

28.01.2016, 13:34

 [ТС]

4

texnik-san, Огромнейшее спасибо!!! Чтоб я делал без вас, не первый раз выручаете.

Подпилю чтоб название файла с датами было и вообще красота будет



0



95 / 91 / 16

Регистрация: 13.04.2015

Сообщений: 545

01.02.2016, 07:02

 [ТС]

5

texnik-san, а как сохранить его под заданным именем в заданной директории?
хочу отправить по почте….есть код который отправляет. Думал выгрузить, сохранить, а потом при отправке вложить.
Или можно как-то проще?



0



шапоклякистка 8-го дня

3674 / 2234 / 391

Регистрация: 26.06.2015

Сообщений: 4,647

Записей в блоге: 1

01.02.2016, 11:24

6

Лучший ответ Сообщение было отмечено Aleks777 как решение

Решение

Цитата
Сообщение от Aleks777
Посмотреть сообщение

сохранить его под заданным именем в заданной директории?

Прбовали вместо «ИмяОтчета.xlsx» полностью путь прописывать? По идее должно сработать.



1



95 / 91 / 16

Регистрация: 13.04.2015

Сообщений: 545

01.02.2016, 12:28

 [ТС]

7

texnik-san, Да, открывает книгу.
В первом случае как раз так и надо было, чтоб книга открылась.
А теперь надо другой запрос вложить в письмо

Добавлено через 2 минуты
texnik-san, все ок, false поставил и путь прописал, теперь все отлично работает
Спасибо большое!
Остается только вложение в письмо сделать

Добавлено через 47 минут
texnik-san, а можно программно после отправки удалить этот файл?



0



mobile

Эксперт MS Access

26777 / 14456 / 3192

Регистрация: 28.04.2012

Сообщений: 15,782

01.02.2016, 12:52

8

Цитата
Сообщение от Aleks777
Посмотреть сообщение

после отправки удалить этот файл?

Visual Basic
1
Kill "ПутьИмяФайла.xlsx"



2



Модератор

Эксперт MS Access

11342 / 4661 / 748

Регистрация: 07.08.2010

Сообщений: 13,505

Записей в блоге: 4

01.02.2016, 13:09

9

если файл открыт или его нет —обработать ошибку



2



95 / 91 / 16

Регистрация: 13.04.2015

Сообщений: 545

01.02.2016, 13:18

 [ТС]

10

Цитата
Сообщение от shanemac51
Посмотреть сообщение

если файл открыт

планирую сделать так, чтоб пользователь даже не знал за его существование

Добавлено через 1 минуту

Цитата
Сообщение от mobile
Посмотреть сообщение

Kill «ПутьИмяФайла.xlsx»

спасибо, будем убивать его



0



 0 

   

Распечатать

1С 8.x : Выбрать Остатки и Обороты по указанным счетам, отбор по субконто и выгрузка результата в EXCEL

Код 1C v 8.х

  Запрос=Новый Запрос;
Запрос.Текст="
|ВЫБРАТЬ
| ХозрасчетныйОстаткиИОбороты.Счет,
| ХозрасчетныйОстаткиИОбороты.Субконто1,
| ХозрасчетныйОстаткиИОбороты.Субконто2,
| ХозрасчетныйОстаткиИОбороты.Субконто3,
| ХозрасчетныйОстаткиИОбороты.Организация,
| ХозрасчетныйОстаткиИОбороты.СуммаОборот,
| ХозрасчетныйОстаткиИОбороты.СуммаОборотДт,
| ХозрасчетныйОстаткиИОбороты.СуммаОборотКт
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(
| &ДатаНач,
| &ДатаКон,
| Период,
| ,
| Счет В (&Cчета),
| ,";
//Если задан отбор по контрагенту
Если Не Контрагент.Пустая() Тогда
Запрос.Текст=Запрос.Текст+"
| Субконто1 = &Контрагент
| ИЛИ Субконто2 = &Договор";
КонецЕсли;
Запрос.Текст=Запрос.Текст+"
|) КАК ХозрасчетныйОстаткиИОбороты
|";

//Создадим список счетов
СписокСчетов=Новый СписокЗначений;
СписокСчетов.Добавить(ПланыСчетов.Хозрасчетный.РасчетыСПоставщикамиИПодрядчиками); //60,01
СписокСчетов.Добавить(ПланыСчетов.Хозрасчетный.РасчетыПоАвансамВыданным); //60,02
Запрос.УстановитьПараметр("Cчета",СписокСчетов);
Запрос.УстановитьПараметр("ДатаКон",ДатаК);
Запрос.УстановитьПараметр("ДатаНач",ДатаН);
Запрос.УстановитьПараметр("Договор",Договор);
Запрос.УстановитьПараметр("Контрагент",Контрагент);
Результат = Запрос.Выполнить();
ТабДок=ЭлементыФормы.ТД;
ТабДок.Очистить();
ПечатьТЗвТаб(ТабДок, Результат);

//Выгрузка выведенного результата запроса в Excel
Режим = РежимДиалогаВыбораФайла.Сохранение;
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
ДиалогОткрытияФайла.ПолноеИмяФайла = "";
Фильтр = "Excel(*.xls)|*.xls";
ДиалогОткрытияФайла.Фильтр = Фильтр;
ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
ДиалогОткрытияФайла.Заголовок = "Выберите куда сохранить файл Excel";
Если ДиалогОткрытияФайла.Выбрать() Тогда
ПутьКФайлу = ДиалогОткрытияФайла.ПолноеИмяФайла;
КонецЕсли;
ТабДок.Записать(ПутьКФайлу,ТипФайлаТабличногоДокумента.XLS97);

Понравилась статья? Поделить с друзьями:

А вот еще интересные статьи:

  • Выгружать котировку в excel
  • Выводить последнюю ячейку в excel
  • Выводить последнюю дату в excel
  • Выводить на печать диапазон excel не активно
  • Выводить день недели по дате в excel

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии