25.11.2020, 16:03 | #1 |
Участник
|
Быстрый отчет 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 |
Участник
|
Самое быстрое решение, которое я нашел - это выгрузка 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 |
Участник
|
Пусть COM использовать по каким-то причинам нельзя.
А почему нельзя использовать NET? Там тоже есть RecordSet. Понятно, если вообще нельзя использовать сам Excel, но если можно, то и NET в помощь. Последний раз редактировалось Raven Melancholic; 25.11.2020 в 16:39. |
|
25.11.2020, 16:40 | #4 |
Участник
|
Может быть EPPlus - https://stackoverflow.com/questions/...le-excel-files - там в комментариях утверждают, что 500К строк и 70 столбцов выгружаются махом, но сохранение работает порядка 20 минут, хотя сам автор комментария в целом относится скептически к использованию данного способа.
Подозреваю, даже если файл вы в итоге сформируете, то сколько он будет открываться и есть ресурсов не сложно представить.
__________________
Sergey Nefedov |
|
|
За это сообщение автора поблагодарили: Ace of Database (3). |
25.11.2020, 16:41 | #5 |
Участник
|
Я не пробовал, но можно попробовать схитрить, вдруг получится.
Сформировать html файл или xml файл, который Excel понимает. Думаю что скорость их формирования буде сопоставима со скоростью записи в обычный csv. А расширение поставить xlsx. Возможно excel поймет. |
|
25.11.2020, 17:13 | #6 |
Участник
|
Нет, Эксель строго следит за соответствием расширения файла его содержимому. Ругается если не соответствует.
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/ |
|
25.11.2020, 17:13 | #7 |
Участник
|
А как можно использовать "сам Excel" в пакетной обработке ?
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/ |
|
25.11.2020, 17:48 | #8 |
Участник
|
|
|
25.11.2020, 18:08 | #9 |
Участник
|
Цитата:
А как можно использовать "сам Excel" в пакетной обработке ?
|
|
25.11.2020, 19:10 | #10 |
Участник
|
Источник данных - это что? Текстовый файл? Так в чем проблема сформировать из него CSV и открывать "как есть"?
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
25.11.2020, 19:13 | #11 |
Участник
|
Объект XMLDocument, кроме тормозов еще имеет и ограничение по размеру. Точно не помню, но то ли 4К, то ли 8К. В любом случае, его использование не годится для работы с большими объемами данных.
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
25.11.2020, 19:31 | #12 |
Участник
|
Цитата:
Можно было бы в обычный экселевский файл вставить его как источник данных. Это единственный способ, который я знаю, который позволяет внутрь экселевского файла в любое место вставить другой экселевский (и не-экселевский) файл. Но как это делать в пакетной обработке, в которой нельзя использовать COM, я не знаю. Т.е. проблема такая: как в Экселевский файл с красивой шапкой вставить SCV без использования COM ?
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/ Последний раз редактировалось Ace of Database; 25.11.2020 в 19:35. |
|
25.11.2020, 19:35 | #13 |
Участник
|
Т.е. проблема такая: как в Экселевский файл с красивой шапкой начиная с нужной строки вставить SCV без использования COM ?
На входе я имею экселевский файл с красивой шапкой и файл CSV в 500 тыс. строк - как их объединить ?
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/ |
|
25.11.2020, 19:41 | #14 |
Участник
|
Клиент не разрешает ставить офис на сервере. На то он и "клиент", что не любит "сервер".
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/ |
|
25.11.2020, 19:52 | #15 |
Участник
|
А сначала открыть 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 |
Участник
|
Цитата:
Вставить еще строку. Распаковать посмотреть. Понять, посмеяться, закодить. Можно иметь заготовку из xml файлов. Дописать туда свои данные через текстовый файл. Зазиповать. Все что надо для этого - аксапта. Винда сама зиповать умеет. |
|
25.11.2020, 20:24 | #17 |
Участник
|
Отчет сформировался за 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 |
Участник
|
Попробуйте GemBox.Spreadsheet https://www.gemboxsoftware.com/spreadsheet
Это будет работать на сервере быстро и без экселя. Только этот компонент платный |
|
26.11.2020, 09:43 | #19 |
северный Будда
|
Если не секрет - зачем нужен такой файл?
500 тыс записей - значит, не для ручного анализа... красивый заголовок - значит, не для последующего импорта...
__________________
С уважением, Вячеслав |
|
26.11.2020, 09:54 | #20 |
Модератор
|
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). |
|
|