AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
DAX
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 25.11.2020, 16:03   #1  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
873 / 649 (23) +++++++
Регистрация: 14.10.2004
Быстрый отчет 500 тысяч строк в Эксель
Привет всем!
АХ 2012.
Есть необходимость вывода в Эксель отчета, который состоит из 500 тысяч строк.
В пакетном режиме. Чтобы это работало приемлемое время (не более 20 минут).

Нельзя использовать буфер обмена, нельзя использовать COM (ни COMExcelDocument, ни ADO Recordset).
Я попробовал через класс, производный от XMLExcelReport_RU, вывод 500 тысяч строк через Open XML, выполняется за 2,5 часа.

У меня есть текстовый файл из 500 тысяч строк, мне надо загнать его в Эксель. Формат текстового файла я могу сделать любой, какой будет удобною

Два вопроса:
1) как это сделать начиная с некоторой строки имеющегося файла Экселя.
2) как это сделать в новый файл Эксель.
В приоритете вопрос № 1. Вопрос № 2 больше от безысходности.

Я видел информацию, что XLSX-файл - это на самом деле ZIP-архив, и сформировать отчет можно просто записав на диск файл в нужном формате. Но, глянув на файлы внутри этого ZIP-файла, я ничего не понял.
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/
Старый 25.11.2020, 16:15   #2  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
873 / 649 (23) +++++++
Регистрация: 14.10.2004
Самое быстрое решение, которое я нашел - это выгрузка HTML вместо Экселя. Получается очень красиво и быстро - всего 15 минут уходит на заполнение файла с учетом форматирования. И современные онлайн-редакторы позволяют редактировать шаблоны HTML очень удобно, так что Эксель даже не всегда является наиболее удобным вариантом.
Но клиент хочет Эксель, и форматирование не обязательно (кроме шапки отчета).

Я сделал преобразование из HTML в Эксель, но для 500 тысяч строк оно зависает. Может часов через 5 отвиснет, я пока больше, чем три часа, не ждал.
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/

Последний раз редактировалось Ace of Database; 25.11.2020 в 16:20.
Старый 25.11.2020, 16:36   #3  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,163 / 1293 (48) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Пусть COM использовать по каким-то причинам нельзя.
А почему нельзя использовать NET? Там тоже есть RecordSet.
Понятно, если вообще нельзя использовать сам Excel, но если можно, то и NET в помощь.

Последний раз редактировалось Raven Melancholic; 25.11.2020 в 16:39.
Старый 25.11.2020, 16:40   #4  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
371 / 562 (19) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
Может быть EPPlus - https://stackoverflow.com/questions/...le-excel-files - там в комментариях утверждают, что 500К строк и 70 столбцов выгружаются махом, но сохранение работает порядка 20 минут, хотя сам автор комментария в целом относится скептически к использованию данного способа.

Подозреваю, даже если файл вы в итоге сформируете, то сколько он будет открываться и есть ресурсов не сложно представить.
__________________
Sergey Nefedov
За это сообщение автора поблагодарили: Ace of Database (3).
Старый 25.11.2020, 16:41   #5  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,928 / 3227 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Я не пробовал, но можно попробовать схитрить, вдруг получится.
Сформировать html файл или xml файл, который Excel понимает. Думаю что скорость их формирования буде сопоставима со скоростью записи в обычный csv.
А расширение поставить xlsx. Возможно excel поймет.
Старый 25.11.2020, 17:13   #6  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
873 / 649 (23) +++++++
Регистрация: 14.10.2004
Цитата:
Сообщение от Logger Посмотреть сообщение
Я не пробовал, но можно попробовать схитрить, вдруг получится.
Сформировать html файл или xml файл, который Excel понимает. Думаю что скорость их формирования буде сопоставима со скоростью записи в обычный csv.
А расширение поставить xlsx. Возможно excel поймет.
Нет, Эксель строго следит за соответствием расширения файла его содержимому. Ругается если не соответствует.
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/
Старый 25.11.2020, 17:13   #7  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
873 / 649 (23) +++++++
Регистрация: 14.10.2004
Цитата:
Сообщение от Raven Melancholic Посмотреть сообщение
Пусть COM использовать по каким-то причинам нельзя.
А почему нельзя использовать NET? Там тоже есть RecordSet.
Понятно, если вообще нельзя использовать сам Excel, но если можно, то и NET в помощь.
А как можно использовать "сам Excel" в пакетной обработке ?
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/
Старый 25.11.2020, 17:48   #8  
AlexeyS is offline
AlexeyS
Участник
 
404 / 339 (12) ++++++
Регистрация: 15.06.2004
Адрес: москва
Экспорт в эксель через XML
Старый 25.11.2020, 18:08   #9  
Pandasama is offline
Pandasama
Участник
 
456 / 134 (5) +++++
Регистрация: 11.08.2014
Адрес: Барнаул
Цитата:
А как можно использовать "сам Excel" в пакетной обработке ?
а в чем проблема в пакетной обработке? на сервере офис поставьте, выгружайте в эксель чем обычно (тот же ADO) и сохраняйте файл, куда надо
Старый 25.11.2020, 19:10   #10  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,686 / 1189 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Источник данных - это что? Текстовый файл? Так в чем проблема сформировать из него CSV и открывать "как есть"?
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 25.11.2020, 19:13   #11  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,686 / 1189 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от AlexeyS Посмотреть сообщение
Объект XMLDocument, кроме тормозов еще имеет и ограничение по размеру. Точно не помню, но то ли 4К, то ли 8К. В любом случае, его использование не годится для работы с большими объемами данных.
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 25.11.2020, 19:31   #12  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
873 / 649 (23) +++++++
Регистрация: 14.10.2004
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Источник данных - это что? Текстовый файл? Так в чем проблема сформировать из него CSV и открывать "как есть"?
Да, текстовый файл. Но открывать его "как есть" нельзя, потому что нужна красивая шапка.

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

Т.е. проблема такая: как в Экселевский файл с красивой шапкой вставить SCV без использования COM ?
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/

Последний раз редактировалось Ace of Database; 25.11.2020 в 19:35.
Старый 25.11.2020, 19:35   #13  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
873 / 649 (23) +++++++
Регистрация: 14.10.2004
Т.е. проблема такая: как в Экселевский файл с красивой шапкой начиная с нужной строки вставить SCV без использования COM ?
На входе я имею экселевский файл с красивой шапкой и файл CSV в 500 тыс. строк - как их объединить ?
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/
Старый 25.11.2020, 19:41   #14  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
873 / 649 (23) +++++++
Регистрация: 14.10.2004
Цитата:
Сообщение от Pandasama Посмотреть сообщение
а в чем проблема в пакетной обработке? на сервере офис поставьте, выгружайте в эксель чем обычно (тот же ADO) и сохраняйте файл, куда надо
Клиент не разрешает ставить офис на сервере. На то он и "клиент", что не любит "сервер".
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/
Старый 25.11.2020, 19:52   #15  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,686 / 1189 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
А сначала открыть CSV в Excel "как есть", а потом тупо скопировать в него шапку из образца? Ну, как работает класс XMLExcelReport_RU

1. Открываем файл шаблона с красивой шапкой
2. Открываем файл CSV в новом экземпляре Excel "как есть"
2.1. Вставляем нужное количество пустых строк в шапку
2.2. Копируем строки шапки из образца в итоговый файл

Если необходимо, можно потом добавить форматирование столбцов

-------------------------

Если сам Excel не установлен там, где выполняется обработка, то, конечно, этот способ не годится. Но тогда непонятно, как вообще формировать файл Excel в этом случае. Т.е. можно, конечно, сконструировать XML, но подозреваю, что это будет долго

Т.е. имеем обработку на стороне сервера, где Excel не установлен и надо сформировать файл Excel. Источником этого файла является файл Excel с образцом шапки и текстовый файл с данными.
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...

Последний раз редактировалось Владимир Максимов; 25.11.2020 в 19:58.
Старый 25.11.2020, 20:13   #16  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,928 / 3227 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от Ace of Database Посмотреть сообщение
Клиент не разрешает ставить офис на сервере. На то он и "клиент", что не любит "сервер".
Попробуйте расковырять формат xlsx. Распаковать файл пустышку посомтреть содержимое. Вставить одну строку. распаковать посмотреть содержимое.
Вставить еще строку. Распаковать посмотреть.
Понять, посмеяться, закодить.

Можно иметь заготовку из xml файлов.
Дописать туда свои данные через текстовый файл.
Зазиповать.

Все что надо для этого - аксапта. Винда сама зиповать умеет.
Старый 25.11.2020, 20:24   #17  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
873 / 649 (23) +++++++
Регистрация: 14.10.2004
Отчет сформировался за 7 часов. Из них 1 час ушел на основной алгоритм выборки данных и заполнение файла HTML и 6 часов ушло на преобразование из HTML в Excel.
Попробую переделать заполнение Excel через класс XMLExcelDocument_RU. Вроде клиент согласен на 4 часа работы отчета. Но если бы согласился на HTML, то получил бы отчет за 1 час.
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/
Старый 26.11.2020, 09:09   #18  
someOne is offline
someOne
Участник
Аватар для someOne
 
173 / 429 (15) +++++++
Регистрация: 11.12.2008
Адрес: Москва
Попробуйте GemBox.Spreadsheet https://www.gemboxsoftware.com/spreadsheet

Это будет работать на сервере быстро и без экселя. Только этот компонент платный
Старый 26.11.2020, 09:43   #19  
pitersky is offline
pitersky
северный Будда
Аватар для pitersky
Ex AND Project
Соотечественники
 
1,506 / 428 (18) +++++++
Регистрация: 26.09.2007
Адрес: Солнечная система
Если не секрет - зачем нужен такой файл?
500 тыс записей - значит, не для ручного анализа...
красивый заголовок - значит, не для последующего импорта...
__________________
С уважением,
Вячеслав
Старый 26.11.2020, 09:54   #20  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
1. Вам уже правильно сказали, или csv, или напрямую писать в xlsx
2. Если хотите напрямую - то гуглите XLSX File Format Specifications. Например: XLSX File Format или официальное описание на сайте MS.
3. Использовать подобный объём данных в Excel - бессмысленно. Вам нужен BI для этого. Быстро будет работать только в Qlik, так как там in-memory движок, или грузите в кубы, если предпочитаете стек MS.
4. Если использовать BI-решение, то вопрос - а зачем это все в Ёхель выгружать? Развертываете BI, забираете данные напрямую из DAX.
5. А можно прикладной смысл анализа 500 000 строк? Это анализ логов, анализ чеков, продажи vs остатки?

С Уважением,
Георгий
За это сообщение автора поблагодарили: Ace of Database (3).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
instructorbrandon: Exam MB-500 Instructor Brandon Study Guide: Microsoft Dynamics 365: Finance and Supply Chain Apps Developer Blog bot DAX Blogs 0 20.05.2020 15:16
Как получить указатель на отчёт когда пользователь выбрал Печать на принтер в просмотрщике, в форму SysPrintForm? rkorchagin DAX: Программирование 10 17.04.2008 11:59
Тормозит копирование строк в буфер обмена ivas DAX: Программирование 20 21.08.2007 15:05
Пользовательский генератор строк-перечислений...- 2: Доп.вкладка для SysQueryForm Gustav DAX: База знаний и проекты 1 04.05.2007 18:04
Предельное количество строк в Report Владимир Максимов DAX: Программирование 1 22.12.2005 15:02

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 02:28.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.