Поточная (конвеерная) выгрузка в формат Excel
От: shestero  
Дата: 27.02.16 21:27
Оценка:
Не знаю в какой топик стоит запостить, наверное всё же сюда, по прикладной теме, хотя по-сути вопрос больше по MS Excel.

У меня из базы происходит поточная выгрузка пользователям. Поточная — это значит выгрузка большая и долгая, нельзя её всю сохранить во временный файл. Когда есть "голова" "хвост" ещё не известен.

Для этой цели мы использовали CSV и TSV, ещё и опцонально сжимали это поточным фильтром копрессии bz2.

Однако у тупых простых пользователей вечные проблемы с CSV.

Поэтому очень хочется перейти на другой формат. Позавчера случайно наткнулся на статью https://habrahabr.ru/post/236107/ и сходу на основе этого удалось сделать что надо!
XML я формирую один, одной простынёй, лист вкладываю в книгу.
Хотя нигде в Интернете не нашёл, что так можно — проверка показала что полученная таблица открывается как MS Excel так и Open Office Calc (правда разные версии не проверял) нормально и без всякой ругани.

Однако вопрос. Хотелось бы сжать это. Во-первых везде написано что должно быть сжато. Во-вторых как бы и трафик-место поэкономить. Как?
Поступить так как сделал автор статьи (вызов внешней комманды zip -m) не могу — так как в моём случае обработка должна быть поточной, конвеерной. Я не могу сохранить данные во временной файл!
Сделал штатный фильтр PHP zlib.deflate — что получилось не открывают офисы!

PS В статье PHP, но вопрос в общем не относится к web-программированию или к конкретному языку. Ищу ответ на любом нормальном языке — C++, Java, Scala, C# ...
Re: Поточная (конвеерная) выгрузка в формат Excel
От: wildwind Россия  
Дата: 28.02.16 13:05
Оценка:
Здравствуйте, shestero, Вы писали:

S>Сделал штатный фильтр PHP zlib.deflate — что получилось не открывают офисы!


Структуру архива-то соблюднул?

S>Ищу ответ на любом нормальном языке — C++, Java, Scala, C# ...


gzip вполне поточный и открытый.
Re: Поточная (конвеерная) выгрузка в формат Excel
От: Иль  
Дата: 28.02.16 13:34
Оценка:
Здравствуйте, shestero, Вы писали:

S>Не знаю в какой топик стоит запостить, наверное всё же сюда, по прикладной теме, хотя по-сути вопрос больше по MS Excel.

S>У меня из базы происходит поточная выгрузка пользователям. Поточная — это значит выгрузка большая и долгая, нельзя её всю сохранить во временный файл. Когда есть "голова" "хвост" ещё не известен.
S>Для этой цели мы использовали CSV и TSV, ещё и опцонально сжимали это поточным фильтром копрессии bz2.
S>Однако у тупых простых пользователей вечные проблемы с CSV.
S>Поэтому очень хочется перейти на другой формат.

...

В рамках Java можно отдавать потоком прямо в .xlsx через Apache POI (и разумеется дополнительно потоком же сжимать в архив).
См. SXSSF вот тут (в тексте есть ссылка на пример кода).
Отредактировано 28.02.2016 13:43 Иль . Предыдущая версия . Еще …
Отредактировано 28.02.2016 13:43 Иль . Предыдущая версия .
Отредактировано 28.02.2016 13:36 Иль . Предыдущая версия .
Re[2]: Поточная (конвеерная) выгрузка в формат Excel
От: shestero  
Дата: 28.02.16 15:16
Оценка:
Здравствуйте, wildwind, Вы писали:

Ок.
Можно конкретней что печатать в листинг. Что бы поток правильно заверенуть в архив нужного типа с корректным форматом.
На любом нормальном языке программирования.
Re[2]: Поточная (конвеерная) выгрузка в формат Excel
От: shestero  
Дата: 28.02.16 15:24
Оценка:
Спасибо. Да я уже наткнулся на Apache POI SXSSF до того, как написал сюда.
Но мне показалось слишком муторно разбираться со всем ради такой тривиальной вероятно операции (подозреваю что то что мне нужно делается от 1 до 10 строчками кода).
К тому же вкралось подозрение, что имея поточный программный интерфейс SXSSF на самом деле сгружает блоки данных во временные файлы. А архивирует все под конец.
Будьте добры, киньте прямую ссылку на пример, который вы имели в виду. Там тыща примеров и я не найду нужный — где бы происходила конвеерная запись.
Re[3]: Поточная (конвеерная) выгрузка в формат Excel
От: Иль  
Дата: 29.02.16 05:23
Оценка:
Здравствуйте, shestero, Вы писали:

S>К тому же вкралось подозрение, что имея поточный программный интерфейс SXSSF на самом деле сгружает блоки данных во временные файлы. А архивирует все под конец.


Да, действительно он сбрасывает накопленное во временный файл. Правда для приложения это незаметно. Я, например, даже не знал, что в новых версиях библиотеки появился метод dispose(). В то время как я реализовал отдачу XLSX потоком такого метода не было. И в нашем случае при этом никаких временных файлов на дисках не остаётся.

Архивирование финального файла библиотека не обеспечивает. Это необходимо делать самостоятельно. Пример кода здесь (любой из двух примеров).
Re[3]: Поточная (конвеерная) выгрузка в формат Excel
От: wildwind Россия  
Дата: 29.02.16 11:28
Оценка:
Здравствуйте, shestero, Вы писали:

S>Можно конкретней что печатать в листинг. Что бы поток правильно заверенуть в архив нужного типа с корректным форматом.


Готового кода у меня нет. Но формат открытый, спецификацию можно скачать бесплатно и без смс.
Re: Поточная (конвеерная) выгрузка в формат Excel
От: Xronosd  
Дата: 29.02.16 11:44
Оценка:
Попробуйте DevExpress XL Export Library нашу библиотеку (C#), для потокового экспорта в XLSX, XLS, CSV больших данных и быстро. От команды пишушей компонент Spreadsheet (под Win/WPF/Asp.net/невизуальный).
Re: Поточная (конвеерная) выгрузка в формат Excel
От: shestero  
Дата: 29.02.16 12:59
Оценка:
Прошу прощения — был не внимателен и допутил некоторую путаницу.

Формат который я реалиовал в тестовом скрипте — Excel XML ( https://technet.microsoft.com/ru-ru/magazine/2006.01.blogtales(en-us).aspx )
Это не то же самое, что XLSX. В Интернете даже есть информация, что под него MS Office 2003 резервировал-ассоциировал особое расширение XMLS.
Так что мой файл открылся двумя офисами без запинки, а вот MS Excel "профессиональный плюс 2010" открывать его отказался, ругнувшись.
И ссылку я не ту указал, а на смежную статью. Вот статья, которую я на самом деле использовал: https://habrahabr.ru/post/235973

XLSX формат должен быть оформлен в виде ZIP-архива с заголовками, то есть истинно конвеерное заполнение его не возможно в принципе.
Excel XML напротив может быть писан и читан в поточном SAX-стили. Про сжатие его нигде ничего не сказано. Хотя конечно ничего не мешает обернуть его конвеерно скажем в bz2.

Так что вопрос в общем исчерпан.
Остались только неясности с совместимостью (какие офисные электронные таблицы его будут открывать).

И ещё — какие вы ещё знаете форматы для конвеерной переноски табличных данных (кроме TSV, CSV, XML, вот Excel XML, ну и SQL-дампов)?
Re[2]: Поточная (конвеерная) выгрузка в формат Excel
От: hrensgory Россия  
Дата: 29.02.16 14:15
Оценка:
On 29.02.2016 15:59, shestero wrote:

> XLSX формат должен быть оформлен в виде ZIP-архива с заголовками, то

> есть истинно конвеерное заполнение его не возможно в принципе.
Именно так и есть, да. А почему всё-таки нельзя временные файлы
заводить? Выглядит каким-то надуманным ограничением, если честно.

> И ещё — какие вы ещё знаете форматы для конвеерной переноски табличных

> данных (кроме TSV, CSV, XML, вот Excel XML, ну и SQL-дампов)?
А кому они переносятся? Если живым человекам, то пожалуй и всё, если
машина читать будет то можно ещё DBF добавить (но им и CSV сгодится).

--
WBR,
Serge.
Posted via RSDN NNTP Server 2.1 beta
Re[3]: Поточная (конвеерная) выгрузка в формат Excel
От: shestero  
Дата: 10.03.16 01:09
Оценка:
gnumeric ?
Re[2]: Поточная (конвеерная) выгрузка в формат Excel
От: wildwind Россия  
Дата: 11.03.16 07:50
Оценка:
Здравствуйте, shestero, Вы писали:

S>И ещё — какие вы ещё знаете форматы для конвеерной переноски табличных данных (кроме TSV, CSV, XML, вот Excel XML, ну и SQL-дампов)?


JSON.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.