JasperReports

  • Автор темы Автор темы erdi
  • Дата начала Дата начала
Доброго времени.

Вот присматриваюсь к этому зверю.

Но пока не совсем понятен следующий момент: как подсовывать данные.

Это должен быть XML файл или можно напрямую читать инфу из nsf и добавлять в Jasper?

Кроме того не понятен вопрос по объему данных. Можно ли с помощью JR читать большие объемы и не вываливаться в Out of memory?
Какие механизвы в этом случае используются.

Было бы интересно увидеть пример nsf с внедренным JR.
 
Можно ли с помощью JR читать большие объемы и не вываливаться в Out of memory?
деталей реализации не знаю - но полагаю можно :)
хмл файл или чё другое подсовывать можно, но как пр-ло следует компиляция в джаспер формат
про динамическое наполнение (а о нем и вопрос ;) ) - пример
для общего - гугл
там просто куча всего и надо ориентироваться на свои нужды

Добавлено:
Было бы интересно увидеть пример nsf с внедренным JR.
не совсем понял "желания" - выше есть ссылка на сайт, где turumbay объясняет тонкости
 
lmike
спасибо

не совсем понял "желания"

Интересует база nsf, например с 10000 запесей Person.

Содержаение Person: FirstName, LastName, City.

И в этой бд агент: Экспорт в pdf, который использует JasperReport.

Вот как-то так.
 
выгружаем в то, что понимает JR и подключаем как сорц
 
от вендора

Добавлено: обращу внимание на то, что используется еще и велосити (как заполнение шаблона), а также - подход в виде "сцепленных" (не знаю как по другому назвать piped :) ) стримов...
это кода с выхода одного данные передаются на вход другого, по мере поступления...
 
Но пока не совсем понятен следующий момент: как подсовывать данные.
Это должен быть XML файл или можно напрямую читать инфу из nsf и добавлять в Jasper?
Данные можно подсовывать как угодно - достаточно реализовать интерфейс JRDatasource. "Из коробки" поддерживает xml, коллекции бинов, sql и пр.

Можно ли с помощью JR читать большие объемы и не вываливаться в Out of memory?
можно:
Интересует база nsf, например с 10000 запесей Person.
Содержаение Person: FirstName, LastName, City.
10 тык записей влезут в память без вопросов, т.о. просто начитываем их из nsf в List<Person> и кормим жасперу
Если появляется опасение, что данные в память целиком не помещаются - реализуем постраничный доступ к данным.
 
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">код</div></div><div class="sp-body"><div class="sp-content"><!--shcode--><pre><code class='java'>private JasperPrint fillVirtual(JasperReport jasperReport) {
System.err.println("fillVirtual run...");

JasperPrint jasperPrint = null;

try {
long start = System.currentTimeMillis();

Map param = new HashMap();

JRXmlDataSource xmlDataSource = new JRXmlDataSource("d:\\work\\jr\\northwind.xml", "/Northwind/Customers");

JRSwapFileVirtualizer virtualizer =
new JRSwapFileVirtualizer(2, new JRSwapFile("d://", 2048, 1024), false);

param.put(JRParameter.REPORT_VIRTUALIZER, virtualizer);

jasperPrint = JasperFillManager.fillReport(jasperReport, param, xmlDataSource);

System.err.println("Compile time : " + (System.currentTimeMillis() - start));
}
catch (Exception ex) {
ex.printStackTrace();
}

return jasperPrint;
}[/CODE]
Вываливается в OutOfMemory на
<!--shcode--><pre><code class='java'>JRXmlDataSource xmlDataSource = new JRXmlDataSource("d:\\work\\jr\\northwind.xml", "/Northwind/Customers");[/CODE]
Понятно, что пытается прочитать в DOM, а он получается слишком большой.
Чем можно заменить JRXmlDataSource?
 
выше говорили - самому делать датасорц
или мемори у жвм увеличить - если приемлимо
 
Первые шаги, может кому понадобится:

1) прописал permission java.lang.RuntimePermission "getProtectionDomain"; в секцию grant в %NOTES%\jvm\lib\security\java.policy. Спасибо turumbay ( ).

2) положил в %NOTES%\jvm\lib\ext\ следующие файлы из исходников JR:
xalan-2.7.1.jar
commons-beanutils-1.8.0.jar
commons-collections-2.1.1.jar
commons-digester-1.7.jar
commons-logging-1.0.4.jar
jasperreports-fonts-4.5.0.jar
jasperreports-4.5.0.jar
xbean.jar
poi-3.7-20101029.jar
iText-2.1.7.jar
jxl-2.6.10.jar

3) создал базку с 10 000 записей + JAVA агент. Агент выгружает 2-ю и 4-ю колонку представления AllContacts в различные форматы.

Вроде все работает, но осталось пару вопросов:
а) русский шрифт приходится засовывать в ресурсы. Правильно ли это?
б) экспорт в xlsx и pptx таки вываливается по OutOfMemory error. Можно ли побороть?
в) при экспорте в ods exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.FALSE); не срабатывает и происходит переполнение табов (> 256). Можно ли побороль (писать в один таб всю простыню)?
г) иногда удобно выгрузить данные в xml, сделать нужные (часто сложные) преобразования XSLT и использовать уже новые полученные данные. Отсюда вопрос - как организовать JRDataSource для чтения данных из XML файла? JRXmlDataSource вывалиается по OutOfmemory.

link removed
 
Отсюда вопрос - как организовать JRDataSource для чтения данных из XML файла? JRXmlDataSource вывалиается по OutOfmemory.
больше, наверное - это вопрос как организовать постраничную работу с ХМЛ...
на уровне идеи:
- этот класс реализует сабдатасорсы (т.е. можно читать несколько файлов). Будет ли это экономнее по ресурсам - не знаю
- использовать потоковый процессор ХМЛ, достаточный для реализации JRDataSource

воще этот класс расширяет/рализует extends JRAbstractTextDataSource implements JRRewindableDataSource
кот. не особо навороченные
можно подумать о своей реализации

Добавлено: попытки увеличить память жвм были?
 
iText-2.1.7.jar должен "подсказать" - как сувать шрифты ;)
тобишь - у айтекста есть ф-ции подсовывания шрифтов из ФС, а вот как получать путь в конкретной ОС - уже задача "посложнее"
также возможно в к-л файлах пропертей, для JR, можно задать путь, но сего я некопенгаген
 
тестировалось для 8.5.3 и 8.5fp1 (Windows) и 8.5.3 (Linux Fedora 16).
для 8.5fp1 в в секцию grant в %NOTES%\jvm\lib\security\java.policy нужно дополнительно прописать permission java.util.logging.LoggingPermission "control";.
 
про пути я вот о чём -
в вянде они обычно windir/fonts и там как пр-ло ТТF
 
немного нуднятины (раз уж о памяти и скорости заговорили)
<!--shcode--><pre><code class='java'>//медленно
String status = plan.getStatus();
if (status.equals("draft")) {
//do stuff
} else if (status.equals("submitted")) {
//do stuff
}
//быстро
PlanStatus status = plan.getStatus();
if (status == PlanStatus.DRAFT) {
//do stuff
} else if (status == PlanStatus.SUBMITTED) {
//do stuff
}

//плохо
if (name.equals("broadcast")) {
//хорошо
if ("broadcast".equals(name)) {[/CODE]
например здесь описано
 
никак, либо в хэПагах, на уровне базы (урл codeBae) прописывать, но именно этот файл
звучит как вопрос - как обойти песочницу jvm..., ответ очевиден - хакать песочницу :crash:
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!