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

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

Добрый день, вы пишите что это Опенсоурс и потом, что это довольно дорогая библиотека. В итоге опен или за деньги уточните пожалуйста?
Добрый день! Спасибо за Ваше замечание. Сейчас поправлю строение предложения для наглядности.

В данном абзаце речь шла не про JasperReports, а про коммерческую версию PDFLib, как об аналоге. JasperReports — это опенсорс библиотека.
Еше подчеркните итоговые выводы: порекомендовали вы бы данные продукт, тк в итоге не совсем понятно. Если продукт стоящий, то и время потратить на его изучение не жалко. Почему JavaScript, репортинг это не совсем та вещь которую нужно размещать в JavaScript или я не прав?
1. У jaspersoft несколько редакций. Я правда не знаю, дают к платным версиям все исходники или нет. Это в основном про сервер.
2. Библиотека вроде бы вся «опен за бесплатно». Можно использовать ее без сервера от Tibco
3. Вообще не совсем правильно спрашивать «опен или за деньги». Бывает open за деньги, бывает closed бесплатно
Все верно.

Платная версия сервера тоже предоставляется с открытым исходным кодом и на МОЙ взгляд, не имеет никаких ощутимых преимуществ над бесплатной.

С разницей между ними можно ознакомиться здесь.
Все верно.

Платная версия сервера тоже предоставляется с открытым исходным кодом и на МОЙ взгляд, не имеет никаких ощутимых преимуществ над бесплатной.

С разницей между ними можно ознакомиться здесь.
Добрый день.
Почему выбор пал именно на JasperReports, какие варианты рассматривались и почему они не подошли (к примеру pentaho, talend, knowage все так же бесплатные и на java)?
Добрый день.

JasperReports неплохо покрывает требования наших проектов, работает с любыми источниками данных, в том числе с web-сервисами, позволяет создавать формы со сложной бизнес логикой, делать красивую верстку в соответствии с дизайном и структурировано хранить все проекты на серверном приложении.

Серверное приложение — хорошее решение, позволяет разработать форму и запрашивать ее из разных систем не внедряя ее в каждую из них — это позволяет, при доработках формы, делать изменения только в одном месте.

В статье я не отделяю JasperReports как лучшее решение из существующих. У нас она хорошо справляется с сотнями тысяч запросов ежедневно и достойна внимания.

Что выбрать Вам? — зависит от ваших требований и специфичности проекта. Надеюсь, такие статьи как эта, помогут остановиться на подходящем решении.
В вашем примере Jasper берет данные непосредственно из БД, а можно ли настроить на формирование отчетов по произвольным данным, когда данные собираются сторонними средствами/микросервисами, и подаются в Jasper для формирование отчета на основе них?
Когда заморочился с jasper — передавал исходные данные в json.
Как вариант!
Да, можно.

Для этого нужно завести переменные поля (параметры) на стороне Jasper'a и передавать из сторонней платформы вызывающей Jasper, данные в эти параметры, как указано в статье. Далее, вы можете использовать полученные данные для заполнения формы/документа.

Есть еще одно решение:

Jasper может принимать на вход json (строкой) и не ходить никуда за данными. Для этого достаточно объявить одно переменное поле (параметр):

<parameter name="JSON" class="java.lang.String"/>


который принимать json и передать его в другой дефолтный параметр библиотеки JasperReports:

<parameter name="JSON_INPUT_STREAM" class="java.io.InputStream">
     <defaultValueExpression>
          <![CDATA[new ByteArrayInputStream($P{JSON}.getBytes())]]>
    </defaultValueExpression>
</parameter>


вам останется распарсить Json и использовать данные. Прочитать про парсинг Json'a можно здесь.
а JSON лучше нормально, как и все остальные источники передавать (данные из БД,XML и т.д.)
посмотреть можно здесь и существует давно, с 4.0.1 версии
можно как угодно, можно из Явы заполнять ассоциативный массив данных, а в отчёте принимать как параметры. можно отдавать данные как xml, а в отчёте в разделе запроса обрабатывать как XPath… в общем вариантов несколько. если интересно — пиши, примерно расскажу, что и как
Интересно, если есть желание, можете поделиться как вы принимаете XML в отчете.
вот такая XML
<?xml version="1.0" encoding="UTF-8" ?>
<object name="department_monitoring" method="report_number">
	<recordset>
		<record>
			<NN>1.</NN>
			<IF_ROW>1</IF_ROW>
			<EM_MOMENT_DATE>06.03.2015</EM_MOMENT_DATE>
			<EM_MOMENT_TIME>10:00</EM_MOMENT_TIME>
			<PLACE_PATH>ПФО, Самарская область, Самара, Красноглинский, с Ясная Поляна</PLACE_PATH>
			<EM_TYPE_NAME>Столкновение</EM_TYPE_NAME>
			<EMTP_NUMBER>№ 00000000000</EMTP_NUMBER>
			<LOSS_STR>Погибло: 0. </LOSS_STR>
			<SUFFER_STR>Ранено: 2. </SUFFER_STR>
		</record>
		<record>
			<NN>ТС № 1</NN>
			<IF_ROW>2</IF_ROW>
			<REG_NUMBER></REG_NUMBER>
			<MODEL_NAME></MODEL_NAME>
			<CU_NAME>Не заполнено</CU_NAME>
			<VL_VIN>111</VL_VIN>
			<DEP_NAME></DEP_NAME>
			<IF_PD></IF_PD>
			<PERSON_NAME></PERSON_NAME>
			<PERSON_AGE></PERSON_AGE>
			<HV_TYPE_SUPERTYPE></HV_TYPE_SUPERTYPE>
			<IF_DRIVER_MED>1</IF_DRIVER_MED>
			<DRIVER_MED>Не проводилось</DRIVER_MED>
			<IF_MD>1</IF_MD>
			<MAIN_PDD_DERANGEMENTS>
				<recordset>
					<record>
						<state></state>
						<DERANG_ID/>
						<DERANG_NAME>Не выявлены</DERANG_NAME>
						<DERANG_CODE/>
					</record>
				</recordset>
			</MAIN_PDD_DERANGEMENTS>
			<IF_AD>1</IF_AD>
			<ATTENDANT_PDD_DERANGEMENTS>
				<recordset>
					<record>
						<state></state>
						<DERANG_ID/>
						<DERANG_NAME>Не выявлены</DERANG_NAME>
						<DERANG_CODE/>
					</record>
				</recordset>
			</ATTENDANT_PDD_DERANGEMENTS>
		</record>
	</recordset>
	<USER_RESPONSIBILITY>Российская Федерация</USER_RESPONSIBILITY>
</object>


так переводим XML как данные для отчетов
doc = JRXmlUtils.parse(new ByteArrayInputStream(data.getBytes(codePage)));
params.put(JRXPathQueryExecuterFactory.PARAMETER_XML_DATA_DOCUMENT, doc);

а потом в отчёте работаем с источником данных как
<queryString language="xPath">
	<![CDATA[/object/recordset/record]]>
</queryString>

так можно прочитать значение ноды, которая находится за пределами указанного в источнике пути
<field name="REPORT_FILTER" class="java.lang.String">
	<fieldDescription><![CDATA[//REPORT_FILTER]]></fieldDescription>
</field>

так можно передать вложенный сорс данных для списков/таблиц/подотчётов и т.д.
<datasetRun subDataset="MAIN_data">
	<dataSourceExpression><![CDATA[((net.sf.jasperreports.engine.data.JRXmlDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("//MAIN_PDD_DERANGEMENTS/recordset/record")]]></dataSourceExpression>
</datasetRun>

и соответственно его же обрабатываем в «подзапросе»
<subDataset name="MAIN_data">
	<queryString language="xPath">
		<![CDATA[//MAIN_PDD_DERANGEMENTS/recordset/record]]>
	</queryString>
</subDataset>

остальное вы знаете, скорее всего, а по XPath отдельная тема

возможно передать в подотчёты конкретный путь-источник можно, а в датасете вложенном проще обработать (но так работает как надо)
Супер!
Использовал 8 лет… потом плюнул и перенес все на jsreports, который в докере теперь крутится. Для моих задач оказалось гороаздо более легковесным решением. внешний вид настраивается проще, гораздо больше возможностей для форматирования, Ексель воообще отлично получается, В jasper самой большой болью были под-отчеты. К тому же jasper как-то последнее время очень вяло развивается

На java для динамического формирования без использования какого-либо сервера над Jasper есть обертка — https://github.com/dynamicreports/dynamicreports. До API самого Jasper спускаюсь только в очень сложных случаях.

Добрый день.

Согласен, в небольших проектах с простой отчетностью первый вариант тоже справится и времени меньше потребует.
не знаю, работаю с JRL… всё неплохо, проект вроде развивается достаточно хорошо, хоть и не очень много людей его делает, на сколько я знаю. в статье говорится только про PDF, проэтому всё вроде хорошо, а вот как только начинаешь работать с редактируемыми форматами — вот там такие плавающие косяки всплывают, приходится по-всякому извращаться. а использовать обёртку над JR в виде DR не вижу сильно смысла (тем более если проект маленький, тащить ещё библиотеки, вместо чистого JR). если вдруг не помогает вариант отчёта через jrxml, то «нарисаовать» отчёт через API не состовляет труда. тут про подотчёты писали… у кого как, но я стараюсь использовать не отдельные файлы, если в одном отчёте одна форма, а списки (по сути, тот же подотчёт, только вложенный)
Добрый день!
Какие именно возникали проблемы с другими форматами? Возможно, сможем предложить Вам хорошее решение.
начинают ездить таблицы, смещаются… обрезаются при переносе, высота и ширина ячеек в экселе не всегда работает
Зарегистрируйтесь на Хабре, чтобы оставить комментарий