Комментарии 27
Разработчики Apache POI проделали титанический труд по reverse engineering бинарных форматов документов MS Office
Office Open XML
Лучше использовать OpenDocument, который для РФ является госстандартом.
Файлы МС Офиса (в т.ч. Экселя) есть XML файл, ужатый zip-ом (+ дополнения к этому XML файлу).
Поэтому добавить в Xylophone ODF-вывод является нетрудной задачей, и более того, есть уже даже класс ODFReportWriter, который, однако, в текущий момент — заглушка. За всё время реализовать поддержку ODF так и не потребовалось. Но мы принимаем пулл реквесты))
Работаем с API документа, доступны все возможности (ну или почти все, хотя я не натыкался на ситуацию, чтобы чего-то не хватило). Для привязки значений к шаблону можно использовать именованные ячейки, диапазоны и таблицы. На основе этого не сложно сделать свою библиотеку, максимально упрощающую реализацию конкретных задач.
Кстати, Apache POI вешал Tomcat на том объёме данных, которые EPPlus обрабатывал не поперхнувшись.
Еще в мире .NET есть библиотека ClosedXML, которая предоставляет гораздо менее громоздкий (чем OpenXML) API для работы с книгами XLSX (сама библиотека использует OpenXML, т.е. по сути является "оберткой"). А конкретно для формирования отчетов по готовым шаблонам очень удобно использовать библиотеку ClosedXML.Report, явялющуюся надстройкой над ClosedXML. Вот тут есть примеры, как быстро создать отчет.
В шаблоне прописываются источники данных в виде наименований полей CLR-объектов (поддерживаются выражения, в т.ч. Linq):

И само формирование отчета производится в несколько строк:
const string outputFile = @".\Output\report.xlsx";
var template = new XLTemplate(@".\Templates\report.xlsx");
using (var db = new DbDemos())
{
// You can get the value from anywhere, not only from the database
var cust = db.customers.LoadWith(c => c.Orders).First();
template.AddVariable(cust);
template.Generate();
}
template.SaveAs(outputFile);
//Show report
Process.Start(new ProcessStartInfo(outputFile) { UseShellExecute = true });
Обе библиотеки распространяются под свободной лицензией и поддерживают .NET Core. Когда-нибудь, надеюсь, дойдут руки написать более подробную статью о них на Хабре.
Просто во многих отчётных библиотеках элементы копируются по вертикали, что позволяет делать выгрузку документов. Но иногда бывает нужно динамически задавать не только строки, но и столбцы (как в примере, разобранном в статье).
Да, можно посмотреть тут https://closedxml.github.io/ClosedXML.Report/docs/ru/Flat-tables, раздел Горизонтальные области
Генерация XML-Excel-файла напрямую.… Такой подход довольно популярен, но к недостаткам следует отнести то, что всякое решение, основанное на прямом редактировании XML-Excel-формата, является одноразовым «хаком», лишенным общности.
Наконец, возможна генерация Excel-файлов с использованием open source библиотек, из которых особо известна Apache POI. Разработчики Apache POI проделали титанический труд по reverse engineering бинарных форматов документов MS Office, и продолжают на протяжении многих лет поддерживать и развивать эту библиотеку.
Хм, то есть Apache POI, редактирующий XML-Excel-формат напрямую (используя OOXML) — это все же не хак? А все остальные подобные решения — так сразу и хак?
Вся Ваша статья после данных высказываний — сплошной XML, правда через Apache POI и его надстройку. Так что это можно отнести к #3 в Вашем списке.
В остальном — интересные выкладки, спасибо! Учту принцип, если придется что-то подобное ваять на JS (с использованием какой-либо JS библиотеки, наверное)…
Так что вариант 3 это крайне ограниченно годный вариант, лучше уж валидный XLSX или честный CSV, чем псевдо-XLS.
various file formats based upon the Office Open XML standards (OOXML) and Microsoft's OLE 2 Compound Document format (OLE2)…
OLE2 files include most Microsoft Office files such as XLS, DOC, and PPT as well as MFC serialization API based file formats. The project provides APIs for the OLE2 Filesystem (POIFS) and OLE2 Document Properties (HPSF).
Раз есть официальные названия, то можно и поискать библиотеки, умеющие с ними работать. И использовать в своих проектах, где не подойдет Apache POI
Как известно, Excel поддерживает XML-формат сохранения документа, который потенциально можно сгенерировать/модифицировать с помощью любого средства работы с XML. Этот файл можно сохранить с расширением .xls, и хотя он, строго говоря, при этом не является xls-файлом, Excel его хорошо открывает.
Ничего не понимаю. Это все на случай если кто-то пользуется офисом на Windows XP? XLSX format это ZIP file с обычным XML текстовыми файлами внутри. Если файл содержит только данные и немного форматирования, то его очень легко построить и редактировать. Я сам это делал в notepad.
Apache POI, например, используется в Libre Office для реализации сохранения документов в форматах, совместимых с MS Office
Откуда такая информация? Насколько я знаю, для работы LibreOffice уже давно не нужна java, а Apache POI написан на java.
«As a general policy we collaborate as much as possible with other projects [...] Examples include: [...] Open Office.org with whom we collaborate in documenting the XLS format [...] When practical, we donate components directly to those projects for POI-enabling them.»
- нацелена как на Word, так и на Excel (Xylophone нацелен только на Excel),
- потому возможная структура генерируемых отчётов именно на Excel навскидку у Yarg проще, чем у Xylophone. Не вижу примеров с горизонтальной итерацией или итерацией по листам книги (хотя может быть просто плохо смотрю, и тут кубаводы может быть что-то могут сказать)
- заточено на использование совместно с кубой (в документации видим визуальные билдеры). Xylophone полностью самодостаточен (хотя опять же, может быть, я недооцениваю самодостаточность yarg)
Модель вывода чуть проще, но благодаря этому мы поддерживаем много форматов вывода: DOC/DOCX, XLS/XLSX, PDF, HTML, CSV и множество вариантов загрузки данных: SQL/JPQL/Groovy/JSON/Custom.
До кучи, YARG можно запускать как микросервис, даже если вы не пишете на Java.
Многостраничная (с динамическим числом страниц) генерация в YARG пока возможна только в custom форматтерах, это направление пока только планируем развивать.
Значит, Yarg больше нацелен на широту форматов вывода.
Xylophone работает только на электронных таблицах, всё строится вокруг модели прямоугольных диапазонов, которые «прирастают» снизу или сбоку и worksheet-ов. В PDF выводить он может, но это понятно что — это таблица, отрисовываемая через XSL-FO. Потенциально можно было бы сделать HTML-вывод, но не было такого юзкейса.
Мы пытались сделать по аналогии репортер для ворда, но недовольны результатом: самое сложное в репортинге в документ ворда — это таблицы, с их merge-ем ячеек получается целая история. Нет, в общем, такой же красивой модели, как в случае с электронной таблицей.
Cлучай, когда заказчик хочет отчёт именно в ворде — довольно редкая история, но случающаяся. В остальных случаях, конечно, проекрасно подходит PDF.
Для интеграции с не-Java-миром: говорите, YARG может работать как микросервис. А какие сервисы он предоставляет как микросервис? Можно ли сформировать из ERP-системы JSON, который скормить YARG-у и он отрисует красивый отчёт на базе этого JSON?
Выгружаем данные в Excel. Цивилизованно