Как стать автором
Обновить

Комментарии 42

А есть ли возможность отлавливать действия пользователя в отчете? Напримере отчета по книжному магазину, пользватель делает даблклик по книги а мы ему показываем приход-расход по данной книги в магазине.
Отчеты генерируются в разных форматах. Если у Вас будет xls или doc отчет — такое сделать будет проблематично (скорее всего невозможно). Если же отчет в формате HTML — всегда можно javascript дописать, который это будет делать.
А если встроить макрос в xls или doc, который будет запускаться по клику в ячейке и выполнять подгрузку данных?
Думаю так сделать можно, но подгрузка данных уже будет осуществляться именно макросом, а не библиотекой. В каком-то смысле это противоречит самой логике библиотеки — на момент формирования документа все данные должны быть загружены. Но теоретически никаких препятствий для этого нет.
Можно попробовать сделать следующим образом:
1. Сформировать все движения по всем книгам на одном листе
2. На втором листе построить сводную таблицу (PivotTable) по книгам

При двойном клике на книге — ексель будет показывать все данные с первого листа по этой книге.
Имеется ли возможность сгенерировать полноценный документ в DOC (ODT) с произвольным контентом (текст разбитый на главы, таблицы, изображения) и разными стилями страниц? Или все-таки он может только автозамены делать из БД?
1. Вы создаете полноценный шаблон, с главами, таблицами, картинками и т.д.
2. Вставляете алиасы в те места куда должен подставиться текст
3. Есть возможность вставлять картинки в алиасы
4. Есть возможность вставить html, в котором также могут быть таблицы и картинки, и который будет отображаться в Word и Open Office Writer

Я верно понял Ваш вопрос?
Нет. Я имею ввиду ситуацию, когда количество таблиц, глав текста и т.д. не известно заранее и нет возможности с помощью обычной подстановки создать документ(отчет), в этом случае можно использовать YARG?
Можно, если вы будете сами генерировать html кусок (содержащий таблицы) скажем groovy скриптом и этот кусок будет подставляться в алиас. Если честно мы пока не часто сталкиваемся с отчетами, похожими на то, что Вы описали. Если Вы опишете подробнее задачу, я, возможно, смогу дать более развернутый ответ.
Предположим я составляю docx отчет по человеку из соц сети. У него есть сколько-то друзей, по каждому другу я хочу вывести в отчет небольшую статистику, пусть это будет заголовок с его ФИО и табличка со списком общих друзей, если же общих друзей нет, то я не хочу выводить эту табличку.
Можно, генерировать html-таблицу groovy-скриптом. Если друзей нет, просто пустую таблицу вставлять. Второй путь — сделать таблицу с друзьями без заголовка, то есть если друзей не будет — не будет ни одной строки в таблице.
Но мне нужен docX а не html:) И вы, наверное, не совсем меня поняли, если у человека 200 друзей, я хочу в одном отчете получить 200 заголовков и 200 таблиц — по каждому другу. Тут вопрос в том, можно ли привязывать не только таблицу к списку но и кусок документа, содержащий в себе другие элементы.
У себя я решаю похожую задачу, используя Apache POI, понятно, что с шаблонизатором было бы поудобнее)
Я имел ввиду, что html-кусок вставляется в docx и выглядит как часть документа. Такая возможность есть в библиотеке.

Тут вопрос в том, можно ли привязывать не только таблицу к списку но и кусок документа, содержащий в себе другие элементы.


Внутри ячейки таблицы могут находиться любые элементы, в том числе и другие таблицы. То есть будет таблица, в каждой строке которой будет контент связанный с одним другом.
xdocreport что я приводил ниже решит эту проблему.
Если не критично, чтобы именно docx, и .odt тоже подойдёт (который, по сути, то же самое только с другим бантиком), посмотрите на appy.pod
Это «шаблонизатор» для Python. И там как раз можно целые куски документа оборачивать в условия и/или циклы.
Или же Вам стоит использовать xls/xlsx отчеты. Есть возможность генерировать из них pdf.
Можно ли с помощью YARG автоматизировать создание например Спецификации по ЕСКД?

Пример тут: ГОСТ 2.106-96 Приложение Б (страница 33)

Как сделать так, чтобы скрипт определял по каким правилам заполнять каждую ячейку таблицы? Просто тут столбец «Наименование» используется и для вывода наименования изделий, и для вывода наименования групп элементов. При чем между группами должны быть еще пустые строки (на примере это не видно).
А можете пояснить — какие данные нужно вставлять в спецификацию?
Кажется я понял. Если использовать docx, придется наверное вставлять html-разметку для групп чтобы текст был подчеркнут, и проставлен alignment (чтобы по центру надпись отображалась).
Скорее всего даже проще нужно было бы сделать — каждая строка таблицы начинается с названия группы, значит можно разделить 2 алиаса — название группы и список под ней, и стил названия задать какой нужно сразу.
Xdocreport ваш друг. Он позволяет в шаблоне документов использовать шаблонизаторы. В том числе различные условия прописывать для генерации.
Довольно интересная штука, спасибо. Посмотрю. Возможно пригодится.
Я до него использовал как раз таки Docx4j сейчас предпочитаю использовать его, функционала больше.
В docx4j меня привлекла возможность также работать с xlsx и довольно активное развитие.
Xdocreport интересен, но я не уверен, что он все наши требования сможет выполнить.
Он может растущие таблицы как то организовать? А вставку картинок? Вставку html? Заранее спасибо за ответ (его код я пока не успел посмотреть, поэтому спрашиваю Вас).
В docx4j меня привлекла возможность также работать с xlsx и довольно активное развитие.

xdocreport тоже умеет плюс еще умеет работать с odt.

Он может растущие таблицы как то организовать?

Да. Сам такое делал.
А вставку картинок?
Вставку html?

Насколько помню по документации да.
В документации xdocreport не упоминается о возможности работы с xlsx.
Ха и точно я же использовал jxls
Сколько я понял это похоже на FastReport. Извините если что то не увидел, но источником для заполнения может быть не SQL запрос, а модель/массив моделей, Map?
Можно, если Вы используете groovy-скрипт для загрузки данных, из него Вы возвращаете как раз список Map. В нашей платформе мы реализовали расширение, которое позволяет использовать аннотированные jpa-сущности в качестве источника данных.
Искал в своё время что-то похожее для генерации отчётов в PDF из Python.
Чтобы шаблон можно было просто «нарисовать» в MS Word / LibreOffice, а отчёт генерировался в PDF на основании модели из Python.
Нашёл appy.pod, который, по сути, всё это и делает.
Но расстраивает его зависимость от LibreOffice сервера для конвертации в PDF (отчёты в ODT/ODS генерируются без каких либо зависимостей).
Ещё в appy.pod не очень удобный / переносимый способ указания маркеров — через специальные поля (с которыми, по сути, можно работать только в LibreOffice).
У нас есть возможность конвертировать docx в pdf без OpenOffice. Другое дело, что с ним pdf-ки практически идентичны docx, а без него бывают расхождения. Если нет требования тотального соответствия — можно использовать этот вариант (docx -> pdf).
У нас есть пользователи, которые из php-приложения вызывают библиотеку в standalone-режиме. У них тоже была задача создавать docx и конвертировать в pdf. Ее они решили.
Вот так совпадение
Я правильно понимаю что вы используете Docx4j для генерации отчета?
Для генерации docx/xlsx отчетов — да. Также поддерживаются отчеты xls, doc, html(freemarker) — они естественно генерируются с помощью других библиотек.
а чем вам POI не угодил для xlsx? Раз уж вы используету POI-HSSF для генерации xlx, используйте POI-XSSF для xslx. У этих модулей общие интерфейсы, так что код будет один и тот же.
В XSSF тоже можно ковыряться в низкоуровневом XML если уж вам этого хочется.
Кроме того, в POI есть модуль SXSSF (S спереди означает streaming). В HSSF и XSSF модель документа строится в памяти и в случае больших репортов получаются довольно развесистые структуры которые жрут память. В SXSSF данные пишутся сразу в файл. Часть функциональности при этом теряется, зато объем памяти практически константый.
У POI чудовищный размер.
Насколько я знаю — в HSSF/XSSF нет полноценной поддержки графиков (или по крайней мере не было на момент написания соответствующего кода), а это для нас очень важная фича.
с графика, действительно, есть над чем поработать.
Стандартный воркэраунд в XSSF — это создать шаблон с графиком а данные заливать через API.
Интересный фреймворк, поразбирался, но не нашел один момент про колонки.

Есть возможность делать динамические колонки (т.е. из данных берем содержимое и кол-во заголовков и столбцов)?

Аналогично, есть ли возможность делать полудинамические колонки (т.е. набор колонок известен, они заданы в дизайне, но могут в зависимости от параметров шаблона скрываться (например, группировка по разным полям))?
Добрый день.

Для создания «динамических» колонок существует несколько способов:

1) Вертикальная полоса (растет вправо). Это решение подходит, если у Вас фиксированное число строк. Вы можете, например, сделать в xls и xlsx 2 вертикальных полосы, одна из которых будет содержать заголовки колонок, а другая — собственно данные.

2) Вертикальная полоса вложенная в горизонтальную. Это решение подходит, если Вам заранее неизвестно число строк. Так как полосы образуют иерархическую структуру, вы можете объявить горизонтальную полосу, вложенную в нее вертикальную, и уже в вертикальной полосе решать, какие данные показывать.

Если Вам будет интересно, мы сможем добавить пример на гитхабе.

По поводу «полудинамических» колонок — на данный момент такой возможности нет, в будущем может появиться, если будут заинтересованные пользователи.
Это все круто, а что если у меня есть List или на крайний случай Map, и использовать sql запросы или xml у меня нет нужды? Тем более что в java проектах зачастую используется какая-то orm. как мне занести в xslx данные минуя xml?
Добрый день.

Во-первых, xml не обязателен для создания отчета. Вы можете выполнить все действия используя только Java API. Как пример можно взять тест.

Во-вторых, Вы можете реализовать свой собственный ReportDataLoader, который будет отвечать вашим требованиям. Например в нашей платформе CUBA есть DataLoader, который позволяет в отчете как источник данных использовать OpenJpa-сущность. DataLoader может возращать вообще любый данные, главное чтобы они были представлены как список ассоциативных массивов (List<Map<String, Object>>).
Зарегистрируйтесь на Хабре, чтобы оставить комментарий