Давайте перейдем к теме и представим сегодняшний JasperReport, Ireport или Jasperstudio, а затем два являются инструментами визуализации.
Что такое JasperReport?
Этот продукт на самом деле имеет много домашних пользователей. Это иностранный продукт, и можно сказать, что он широко используется в области отчетности Java.
Когда я впервые вступил в контакт с этим отчетом, мне это очень понравилось. Самым важным является его инструмент визуализации, который действительно заставил меня остановиться. Я мог бы на самом деле спроектировать отчеты Java, просто рисуя картинки. Говоря о рисунке, мы можем использовать визуальные инструменты для визуального проектирования шаблонов отчетов, а форматы файлов, которые он поддерживает, очень широки, включая Excel, Word, PDF, HTML, XML, CSV и т. Д.
Разве это не выглядит очень мощно? Он спроектирован за один раз и повторно используется несколько раз. Конечно, у мощных вещей часто есть две стороны. Я столкнулся с этим и долго пытал меня. Я опишу это подробно позже.
Большая грудь Джасперрепорта
Ранее я говорил, что JasperReport, Ireport или Jasperstudio на самом деле неточны. Второй брат Ирепорт и третий брат Jasperstudio на самом деле являются вспомогательными инструментами визуального дизайна Jasper. Вы можете спроектировать отчеты Jasper, не используя его, и написать больше белых XML. До 5.5 этот инструмент назывался Ireport. После 5.5, с рождением моего третьего брата Jasperstudio, Ireport был полностью заменен. На самом деле, эти два инструмента в основном одинаковые, соотечественники одного ребенка.
Конкретный рабочий процесс:
① Первый, Jasper получит XML -файл информации о формате, которую необходимо вывести, а затем скомпилируйте файл типа .jasper из файла XML. Затем этот файл Jasper может быть загружен в нашем приложении для создания окончательного отчета. У вас есть очень знакомое чувство? Да, это очень похоже на Java и должно быть составлено.
На следующем рисунке показан интерфейс операции iReport. Это похоже на Jasperstudio, поэтому я не буду публиковать его. Вы можете скачать его на Baidu самостоятельно.
Позвольте мне кратко представить каждый тип группы на картинке выше.
(1) Заглавная группа: сегмент заголовка отображается только в верхней части первой страницы всего отчета. За исключением первой страницы, независимо от того, сколько страниц есть в отчете, контент в заголовок больше не будет появляться.
(2) Группа PageHeader: Как следует из названия, контент в сегменте PageHeader будет отображаться на каждой странице во всем отчете и будет отображаться в верхней части страницы. Если это первая страница отчета, контент в PageHeader будет отображаться под заголовком. На всех других страницах, кроме первой страницы, контент в PageHeader будет отображаться в верхней части страницы.
(3) полоса PageFooter: отображается в нижней части страницы.
(4) Последняя полоса FAGEFOUTER: отображается в нижней части последней страницы.
(5) Группа деталей: сегмент содержимого отчета, контент, который необходимо повторить в отчете о дизайне в этой полосе, и контент в сегменте деталей будет отображаться на каждой странице.
(6) полоса головки столбцов: для сегмента заголовка полосы детализации, как правило, в этом сегменте приведен заголовок отчета.
(7) полоса FOUTER FOUTER: для окончания таблицы диапазона диапазона.
(8) Сводная полоса: общий сегмент таблицы появляется после полосы детализации на последней странице всего отчета. Обычно он используется для подсчета общего значения одного или нескольких полей в отчете.
Выше приведено все инструменты визуализации. На самом деле, это очень просто в использовании. Вы можете найти его, изучив. Поскольку это настоящая запись ямы, это, естественно, не главное, поэтому я не буду говорить об этом.
Приложения в коде
Это те шаги, которые я суммировал. Может быть, описание не очень точное. Пожалуйста, сделайте это.
① Дизайн шаблонов, генерируйте файлы jrxml, ↑↑ вышеуказанный инструмент визуализации разрабатывает стили шаблона, которые вам нужны
② Шаблоны компиляции, jrxml компилируется в файлы jasper, как файлы .java и .class в Java, программа должна запустить двоичный файл *.jasper.
Фактически, этот шаг может быть непосредственно скомпилирован с Ireport для генерации. Джаспер, и, конечно, он также может быть составлен с помощью программы Jasper во время выполнения. Тем не менее, рекомендуется, чтобы при составлении в программе версия Jasper лучше всего соответствовала версии Ireport или Jasperstudio.
Отчет о отчете (данные заполняются в отчет)
1. Загрузите шаблон, чтобы генерировать объект JasperReport
2. Используйте Jasperfillmanager для генерации объекта Jasperprint
«Используйте jrxlsxexporter для экспорта отчета или отображения его
Загрузочные шаблоны
Поскольку мы сгенерировали.
Загруженный код, возврат объекта Jasperport
if (urlpath.endswith (". jrxml")) {// compile jrxml to jasper try {inputstream is = url.openstream (); jasperreport = jaspercompilemanager.compilereport (IS); } catch (ioException e) {бросить новое baseexception ("загрузить jasper error", e); } catch (jrexception e) {бросить новое baseexception ("преобразование шаблона jrxml в ошибку файла jasper", e); } catch (Throwable e) {бросить новое baseexception ("преобразование шаблона jrxml transform в jasper file erer", e); } catch (throwable e) {log.error (e); бросить новое BaseException (e.getMessage ()); }} else if (urlpath.endswith (". jasper")) {try {inputstream Is = url.openstream (); jasperReport = (jasperReport) jrloader.loadObject (IS); } catch (ioException e) {бросить новое baseexception ("загрузить jasper error", e); } catch (jrexception e) {бросить новое baseexception ("ошибка файла шаблона jrxml", e); } catch (throwable e) {log.error (e); бросить новое BaseException (e.getMessage ()); }} else {бросить новое baseexception ("неверный файл!"); }Получить источник данных в отчете
Здесь я использую Javabean, чтобы получить его
Jrdatasource dataSource = null; if (fieldvalues! = null && fieldvalues.size ()> 0) {dataSource = new jrbeanCollectionDataSource (FieldValues); } else {dataSource = new JRemptyDataSource (); } FieldValues - это коллекция POJO, полученных в базе данных.
Выполнить отчет
Получите объект JasperPrint
Map <string, object> parametRovalue = new HashMap <String, Object> (); JasperPrint = jasperfillManager.fillReport (jasperReport, parametervalue, dataSource);
Наконец, мы используем jrxlsxexporter для экспорта отчета
Это также место, где требуются наиболее параметры конфигурации
baos = new BytearRayoutputStream (); exporter = new jrxlsxexporter (); exporter.setparameter (jrexporterparameter.jasper_print, jasperprint); exporter.setParameter (jrexporterParameter.output_stream, baos);
exporter.exportreport ();
Завершенные данные были записаны в выходной поток. Вы решаете, как вывести его самостоятельно, это гораздо более короткое, чем другие методы введения кода.
Действительно, JasperReport имеет несравненное преимущество в написании кода, и были упакованы различные API. Но, возможно, Чача сделал слишком много, и есть много проблем.
Проблема JasperReport
1. пустое пространство перед двумя рядами
Если вы используете приведенный выше код для экспорта Excel, вы обнаружите, что фон Excel белый, без небольших сетей Excel. Это связано с тем, что фон джаспера по умолчанию белый, поэтому при экспорте других форматов легче быть совместимым. Конечно, нет необходимости экспортировать Excel. Просто добавьте следующие две линии, чтобы решить его.
// Удалить чистый exporter.setParameter перед двумя строками (jrxlsexporterparameter.is_remove_empty_space_betweed_rows, boolean.true); exporter.setParameter (jrxlsexporterparameter.is_remove_empty_space_betweed_columns, boolean.true); // Установить цвет фона таблицы Excel в белый exporter.setParameter (jrxlsexporterParameter.is_white_page_background, boolean.false);
2. Объем данных большой, заголовок написан несколько раз
Если у вас много листовых данных, вы можете столкнуться с ситуацией, когда заголовок таблицы печатается несколько раз. В этом случае вам нужно добавить настройку высоты.
Field PageHeight = jrbasereport.class.getDeclaredfield ("pageheight"); PageHeight.SetAccessible (true); PageHeight.setInt (jasperReport, integer.max_value);3. Проблема типа ячейки
Иногда отчет Excel, который мы экспортируем, необходимо рассчитать с использованием функций Excel. Если все они находятся в форматах текста, мы, естественно, не можем рассчитать это. В этом случае нам нужно использовать
// автоматически выберите формат exporter.setParameter (jrxlsexporterParameter.is_detect_cell_type, boolean.true);
Помните, при разработке отчета выберите правильный тип поля поля.
4. Проблема нескольких листов
Простой пример выше - это просто файл, содержащий страницу листа. Что если наше требование состоит в том, чтобы экспортировать несколько листов в одном файле? Не волнуйтесь, этот джапсер уже думал об этом для нас.
Просто измените шаги экспорта выше на следующее
baos = new Bytearrayoutputstream (); exporter = new jrxlsxexporter (); exporter.setparameter (jrexporterparameter.jasper_print_list, listjasperprint); exporter.setparamet exporter.setparameter (jrxlsexporterparameter.is_one_page_per_sheet, boolean.true);
Jrexporterparameter.jasper_print_list, пройти в коллекцию списков Jasperprints, каждый Jasperprint - это листовая страница.
5. В запуске Linux не сообщается об ошибках, но отчет не может быть экспортирован
На самом деле, эта проблема долго меня беспокоила. Позже, с помощью босса, я вспомнил проблему, потому что она совсем не бросила исключения, а ошибку. Я видел, что некоторые одноклассники задали этот вопрос онлайн, поэтому я разместил его.
Вы можете использовать Throwable для захвата сообщения об ошибке и получить сообщение об ошибке: java.lang.internalerror: не удается подключиться к серверу окна x11, используя «: 0,0» как
Решение: изменить Tomcat/bin/catalina.sh и добавить java_opts = "$ java_opts -djava.awt.headless = true"
6. Проблемы с переполнением памяти больших данных и утечки памяти! !
Мне нужно поговорить о разнице между версиями Excel 03 и 07. Я помню, что версия 03 поддерживает только 65532 линии, но после 07 версии она стала намного больше. Я забыл конкретное число, это не тот же порядок в любом случае.
Jrxlsxexporter поддерживает экспорт файлов XLSX.
Jrxlsexporter - это файл XLS, который легко идентифицировать. Экспортируемые инструменты такие же, как и в Excel.
Тогда есть проблемы с переполнением памяти и утечки памяти. Я считаю, что друзья, которые играют в Java, в основном столкнулись с этим.
Наиболее распространенным решением переполнения памяти является увеличение размера памяти контейнера и увеличить размер памяти Tomcat. Вы можете использовать Baidu, есть много методов, поэтому вы не будете переделать колесо.
Вот напоминание о том, что если вы используете Tomcat, методы конфигурации установки Windows, декомпрессия и Linux разные, поэтому, пожалуйста, обратите внимание.
Что мне нужно представить здесь, так это метод JasperReport. На самом деле, у JasperReport есть решение для больших данных. Он был запущен в очень ранней версии, эмулятор jrfilevirtualizer.
Для чего используется эта вещь? Фактически, он будет записывать данные во временный файл на жестком диске в соответствии с установленными вами параметрами, которые решают проблему чрезмерного использования памяти и переполнения при заполнении отчетов.
В настоящее время JasperReport имеет 3 эмулятора, все из которых используются для решения этой проблемы.
Они есть:
①jrfilevirtualizer
②jrswapfilevirtualizer
③jrgzipvirtualizer
В чем разница между этими тремя эмуляторами?
Во -первых, я запустил самый ранний jrfilevirtualizer. Когда я тестировал, когда я экспортировал около 30 Вт данных, это сообщило бы о переполнении памяти. Позже, добавив это, я мог бы экспортировать его обычно. Этот эмулятор будет генерировать временный файл для каждого объекта и сохранить его на жестком диске, чтобы решить проблему использования памяти. Однако, поскольку существует множество временных файлов, потребление памяти создания и удаления файлов невидимо увеличивается, поэтому оно не очень рекомендуется.
// написать несколько файлов jrfilevirtualizer virtualizer = new jrfilevirtualizer (2, chatchpath); Map <string, object> parametRovalue = new HashMap <String, Object> (); parametervalue.put (jrparameter.report_virtualizer, virtualizer);
virtualizer.setreadonly (true);
Catchpath - это путь кеша файла и должен существовать, в противном случае будет сообщена ошибка.
Затем есть jrswapfilevirtualizer, который был запущен для решения проблемы jrfilevirtualizer. Этот эмулятор создаст только временный файл, и каждый объект будет учитывать часть этого файла, поэтому потребление памяти создания и удаления файлов уменьшается. На самом деле, это не особенно рекомендуется.
// Напишите один файл rswapfile arquivoswap = new jrswapfile (chatchpath, 4096, 25); jrabstractlruvirtualizer virtualizer = new jrswapfilevirtualizer (2, arquivoswap, true); Map <string, object> parametervalue = new HashMap <String, Object> (); ParametRovalue.put (jrParameter.Report_virtualizer, Virtualizer);
virtualizer.setreadonly (true);
Наконец, есть jrgzipvirtualizer. Когда вы видите Gzip, вы не знаете, есть ли у вас какое -либо соединение с сжатием слова. Правильно, этот эмулятор использует специальный алгоритм сжатия, который может сжимать следов памяти до одного двадцатого или однопроизводительного, что удивительно.
Jrabstractlruvirtualizer virtualizer = new jrgzipvirtualizer (2); map <string, object> parametervalue = new Hashmap <String, Object> (); parametRovalue.put (jrParameter.Report_virtualizer, virtualizer); jasperprint = jasperfillmanager.fillreport (jasperreport, dageervaleport, dageervaleport, dageervaleport, dageervaleport, dageervareport, dageervareport, dageervaleport);
Сказав так много, короче говоря, есть три типа эмуляторов для решения проблемы переполнения памяти. Я также прочитал множество блогов, которые используют jrfilevirtualizer для решения проблемы с большими данными памяти. Тогда я хочу сказать здесь, что я меньше всего рекомендую использовать эмулятор jrfilevirtualizer, потому что он не только потребляет много файлов для создания, но и имеет очень серьезную ошибку и утечку памяти! ! ! Существует также jrswapfilevirtualizer, который имеет эту проблему.
Кроме того, следует отметить, что без использования эмулятора будут проблемы с утечкой памяти. Когда вы экспортируете отчет, выбросите информацию о стеке и обнаружите, что существует много случаев класса Net.sf.jasperReports.Engine.fill.jrtemplatePrintText, который не может быть переработан и не может быть переработан! ! ! И эта проблема все еще существует в последней версии JapserReport 6.x. Есть много таких проблем в сообществе Jasper и переполнений стека, но нет никакого решения.
Здесь мы рекомендуем эмулятор jrgzipvirtualizer. Несмотря на то, что все еще существуют проблемы с утечкой, из -за уникального алгоритма сжатия проблема утечки памяти контролировалась в очень небольшом диапазоне. Это считается решением для облегчения использования просочившейся памяти примерно на 90%.
В общем, я отказался от этого плана сейчас, и я выписал его, чтобы мои братья не могли избежать обхода позже. После получения класса инструментов POI я подготовлюсь к изменению всех отчетов в методы экспорта POI. Говоря о том, что решение POI Big Data довольно хорошо.