Редактировал(а) admin 2026/08/28 10:56

Последние авторы
1 В данной статье мы на примере разберём, как с нуля создать шаблон отчёта с помощью JasperReports Library, создать набор шаблонов и установить его в [[Платформу НЕЙРОСС>>doc:neyross.WebHome]].
2
3 Перед чтением данной статьи рекомендуем ознакомиться с [[руководством разработчика>>doc:neyross.setup.report-control.dev-reports.WebHome]].
4
5 == {{id name="Каксоздатьсвойнаборшаблонов-Общиесведения"/}}Общие сведения ==
6
7 Отчёт будем строить по реляционной PostgreSQL базе данных. Для примера возьмём отчёт, в котором выведем список таблиц выбранной базы данных и размер, занимаемый этими таблицами на диске.
8
9 За основу отчёта возьмём запрос из [[документации на PostgreSQL>>url:https://wiki.postgresql.org/wiki/Disk_Usage||shape="rect"]]:
10
11 {{code language="sql"}}
12 SELECT *
13 , pg_size_pretty(total_bytes) AS total
14 , pg_size_pretty(index_bytes) AS INDEX
15 , pg_size_pretty(toast_bytes) AS toast
16 , pg_size_pretty(table_bytes) AS TABLE
17 FROM (
18 SELECT *, total_bytes-index_bytes-COALESCE(toast_bytes,0) AS table_bytes FROM (
19 SELECT c.oid,nspname AS table_schema, relname AS TABLE_NAME
20 , c.reltuples AS row_estimate
21 , pg_total_relation_size(c.oid) AS total_bytes
22 , pg_indexes_size(c.oid) AS index_bytes
23 , pg_total_relation_size(reltoastrelid) AS toast_bytes
24 FROM pg_class c
25 LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
26 WHERE relkind = 'r'
27 ) a
28 ) a;
29 {{/code}}
30
31 Дополним SQL-запрос двумя фильтрами — по размеру таблицы и по имени PostgreSQL-схемы. Это позволит включить в отчёт только таблицы, занимающие на диске существенный объём, а также  получить отчёт только по таблицам в выбранной схеме (чтобы, например, исключить системные таблицы в схемах ##pg_catalog## и ##information_schema##). Итоговый SQL-запрос выглядит следующим образом:
32
33 {{code language="sql"}}
34 SELECT *
35 , pg_size_pretty(total_bytes) AS total
36 , pg_size_pretty(index_bytes) AS INDEX
37 , pg_size_pretty(toast_bytes) AS toast
38 , pg_size_pretty(table_bytes) AS TABLE
39 FROM (
40 SELECT *, total_bytes-index_bytes-COALESCE(toast_bytes,0) AS table_bytes FROM (
41 SELECT c.oid,nspname AS table_schema, relname AS TABLE_NAME
42 , c.reltuples AS row_estimate
43 , pg_total_relation_size(c.oid) AS total_bytes
44 , pg_indexes_size(c.oid) AS index_bytes
45 , pg_total_relation_size(reltoastrelid) AS toast_bytes
46 FROM pg_class c
47 LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
48 WHERE relkind = 'r'
49 ) a
50 ) a WHERE table_schema = 'public' AND a.total_bytes >= 10000 ORDER BY table_name;
51 {{/code}}
52
53 Поехали!
54
55 == {{id name="Каксоздатьсвойнаборшаблонов-СозданиешаблонавJaspersoftStudio"/}}Создание шаблона в Jaspersoft Studio ==
56
57 Запускаем Jaspersoft Studio (в примере используется версия 6.3.0):
58
59 [[image:attach:jaspersoft-studio-launch.png||height="250"]]
60
61 === {{id name="Каксоздатьсвойнаборшаблонов-Созданиепроекта"/}}Создание проекта ===
62
63 Создадим новый JasperReports проект:
64
65 [[image:attach:new-project.png]]
66
67 Выбираем тип проекта «JasperReports Project»:
68
69 [[image:attach:new-project-2.png]]
70
71 Вводим название проекта и завершаем работу мастера:
72
73 [[image:attach:new-project-3.png]]
74
75 Проект создан. Его содержимое можно просматривать на вкладке Project Explorer:
76
77 [[image:attach:project-explorer.png]]
78
79 === {{id name="Каксоздатьсвойнаборшаблонов-Созданиешаблона"/}}Создание шаблона ===
80
81 Добавим в проект шаблон отчёта. Для этого нажмите правой кнопкой мыши на элементе проекта в дереве Project Explorer. В открывшемся контекстном меню выберите New → Jasper Report:
82
83 [[image:attach:new-report.png]]
84
85 В открывшемся диалоговом окне выберите шаблон Blank A4:
86
87 [[image:attach:new-report-2.png||thumbnail="true" height="250"]]
88
89 Нажимаем Next. На следующем шаге работы мастера выбираем наш проект (Example) и указываем имя создаваемого файла шаблона отчёта (example.jrxml):
90
91 [[image:attach:new-report-3.png||height="250"]]
92
93 На следующем шаге можно добавить источник данных (Data Source), но мы сделаем это позже. Поэтому нажимаем Finish, файл шаблона появляется среди файлов проекта.
94
95 [[image:attach:new-report-4.png]]
96
97 В центре окна представлен визуальный редактор нового шаблона:
98
99 [[image:attach:editor-1.png||height="250"]]
100
101 === {{id name="Каксоздатьсвойнаборшаблонов-Выборсекций"/}}Выбор секций ===
102
103 Нам потребуются не все секции, а только Title, Column Header, Detail 1, Page Footer и Background. Отключим / удалим ненужные секции на вкладке Outline. Для этого откройте контекстное меню на ненужной секции и выберите пункт Delete. И так для каждой ненужной секции:
104
105 [[image:attach:delete-band.png||height="250"]]
106
107 В результате макет страницы будет выглядеть следующим образом:
108
109 [[image:attach:editor-2.png||height="250"]]
110
111 === {{id name="Каксоздатьсвойнаборшаблонов-Параметры"/}}Параметры ===
112
113 Входными параметрам для шаблона будут:
114
115 1. ##SCHEMA_NAME## — строковой параметр для фильтрации по PostgreSQL-схеме.
116 1. ##MIN_TABLE_SIZE## — числовой параметр для фильтрации таблиц в отчёте по минимальному размеру, занимаемому на диске.
117
118 Добавим соответствующие параметры. Для этого на вкладке Outline выберите в списке Parameters и создайте параметр через контекстное меню:
119
120 [[image:attach:create-parameter.png]]
121
122 В списке появится новый параметр с именем Parameter1. На вкладке Properties для данного параметра укажите имя (SCHEMA_NAME), описание (Схема) и значение по умолчанию ("public", в кавычках). Тип данных параметра (поле Class) оставьте без изменения — java.lang.String.
123
124 [[image:attach:create-parameter-2.png]]
125
126 Сохраните шаблон: [[image:attach:save.png]]
127
128 Повторите процедуру для второго параметра. Только в данном случае установите тип данных параметра (Class) в java.lang.Integer (числовой параметр):
129
130 [[image:attach:create-parameter-3.png]]
131
132 Сохраните шаблон. В списке параметров помимо системных теперь присутствуют два созданных нами параметра:
133
134 [[image:attach:create-parameter-4.png||thumbnail="true" height="250"]]
135
136 === {{id name="Каксоздатьсвойнаборшаблонов-Источникданных"/}}Источник данных ===
137
138 Теперь добавим источник данных — мы будем работать с реляционной PostgreSQL базой данных. Это может быть любая существующая база данных. В статье используется база данных с именем ultima.
139
140 На вкладке Repository Explorer выберите Data Adapters и в контекстном меню выберите Create Data Adapter.
141
142 [[image:attach:data-source-1.png]]
143
144 В открывшемся диалоговом окне выберите Database JDBC Connection.
145
146 [[image:attach:data-source-2.png||height="250"]]
147
148 Нажимаем Next. На следующем шаге укажите название источника данных (Example Database), выберите драйвер подключения к PostgreSQL (org.postgresql.Driver), укажите корректную строку подключения к базе данных (например, jdbc:postgresql:~/~/localhost:5432/ultima для подключения к базе данных ultima на той же машине, где используется Jaspersoft Studio), укажите имя пользователя и пароль подключения к базе данных. Проверьте корректность введённых параметров — нажмите Test для проверки подключения к базе данных. После чего нажмите Finish.
149
150 [[image:attach:data-source-3.png||height="250"]]
151
152 Новый источник данных появился в списке на вкладке Repository Explorer.
153
154 === {{id name="Каксоздатьсвойнаборшаблонов-SQL-запрос"/}}SQL-запрос ===
155
156 Теперь зададим для шаблона целевой SQL-запрос. Для этого в редакторе нажмите на соответствующую кнопку:
157
158 [[image:attach:edit-query-1.png]]
159
160 В открывшемся диалоговом окне вставьте целевой SQL-запрос:
161
162 {{code language="sql"}}
163 SELECT *
164 , pg_size_pretty(total_bytes) AS total
165 , pg_size_pretty(index_bytes) AS INDEX
166 , pg_size_pretty(toast_bytes) AS toast
167 , pg_size_pretty(table_bytes) AS TABLE
168 FROM (
169 SELECT *, total_bytes-index_bytes-COALESCE(toast_bytes,0) AS table_bytes FROM (
170 SELECT c.oid,nspname AS table_schema, relname AS TABLE_NAME
171 , c.reltuples AS row_estimate
172 , pg_total_relation_size(c.oid) AS total_bytes
173 , pg_indexes_size(c.oid) AS index_bytes
174 , pg_total_relation_size(reltoastrelid) AS toast_bytes
175 FROM pg_class c
176 LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
177 WHERE relkind = 'r'
178 ) a
179 ) a WHERE table_schema = $P{SCHEMA_NAME} AND a.total_bytes >= $P{MIN_TABLE_SIZE} ORDER BY table_name
180 {{/code}}
181
182 [[image:attach:edit-query-2.png||height="250"]]
183
184 Обратите внимание, что в данном случае мы заменили константы имени схемы и минимального размера на выражения ##$P{SCHEMA_NAME}## и ##$P{MIN_TABLE_SIZE}## — таким образом в SQL-запрос будут подставлены значения созданных нами ранее параметров.
185
186 Не закрывайте диалоговое окно. Теперь мы добавим поля (fields), которые хотим вывести в отчёте. Jaspersoft Studio позволяет построить список полей автоматически, выполним запрос к источнику данных.
187
188 === {{id name="Каксоздатьсвойнаборшаблонов-Поля"/}}Поля ===
189
190 Выбираем в списке вверху (где написано ~-~- No Data Adapter ~-~-) созданный нами ранее источник данных:
191
192 [[image:attach:fields-1.png]]
193
194 После чего в правом верхнем углу нажимаем кнопку Read Fields. Если источник данных указан правильно, к нему есть доступ, и SQL-запрос составлен верно, то в списке внизу окна автоматически будут созданы поля:
195
196 [[image:attach:fields-2.png]]
197
198 В отчёт мы включим не все поля, а только table_name (название таблицы), row_estimate (количество строк) и total (общий размер таблицы на диске). Остальные поля можно удалить, выбрав их в списке и нажав кнопку Delete.
199
200 Также измените тип (Class Type) поля row_estimate с ##java.lang.Float## на ##java.lang.Long##.
201
202 [[image:attach:fields-3.png]]
203
204 Нажмите ОК, чтобы применить изменения и закрыть диалоговое окно.
205
206 === {{id name="Каксоздатьсвойнаборшаблонов-Внешнийвид"/}}Внешний вид ===
207
208 Для последующего использования шаблона в программе НЕЙРОСС Отчёты необходимо определить стиль по умолчанию с поддерживаемым шрифтом. На момент написания данной статьи НЕЙРОСС Отчёты поддерживается шрифт Arial.
209
210 Для добавления стиля на вкладке Outline выберите Style и в контекстном меню выберите Create Style. На вкладке Properties для созданного стиля откройте секцию настроек Style, отметьте флаг Default Style и укажите имя шрифта Arial:
211
212 [[image:attach:style.png||height="250"]]
213
214 Сохраните шаблон.
215
216 {{info}}
217 Если использовать неподдерживаемый шрифт, то кириллический текст в отчёте, сгенерированном в программе НЕЙРОСС Отчёты по данному шаблону, не будет отображаться.
218 {{/info}}
219
220 Теперь наполним отчёт содержимым. В визуальном редакторе разместим на макете надпись с названием отчёта, названия колонок, поля (созданные на предыдущем шаге). Дополним нижний колонтитул номером страницы.
221
222 Для названия переместите (drag & drop) с панели Palette элемент Text Field в секцию Title и измените его размер до границ полей секции по ширине и высоте:
223
224 [[image:attach:visual-headline.png||height="250"]]
225
226 Для выбранного текстового поля на вкладке Properties в секции Text Field укажите для Expression выражение
227
228 {{code language="java"}}
229 "Размер таблиц в схеме " + $P{SCHEMA_NAME}
230 {{/code}}
231
232 Таким образом в заголовке будет выведен текст вида «Размер таблиц в схеме public» (то есть вместо ##$P{SCHEMA_NAME}## при генерации отчёта будет подставлено значение параметра).
233
234 Также задайте выравнивание текста по центру (по середине ширины и высоты) и установите размер шрифта в заголовке на 16:
235
236 [[image:attach:visual-headline-2.png||height="250"]]
237
238 Уменьшите высоту секции Title: выберите на вкладке Outline секцию Title, во вкладке Properties, в секции Appearance установите высоту (поле Height) в 50px.
239
240 Сохраните документ. В результате макет должен выглядеть так:
241
242 [[image:attach:visual-preview0.png]]
243
244 Добавим заголовок таблицы в отчёте. Перетащите из вкладки Palette три элемента Static Text в секцию Column Header:
245
246 1. Выберите первый элемент и на вкладке Properties:
247 11. в секции Appearance установите для него Location x=0 px, y=0 px, Size w=300px, h=30px;
248 11. в секции Borders выберите отображение всех внешних границ, Padding left=5;
249 11. в секции Static Text выровняйте текст по центру по высоте, установите жирное начертание (кнопка B), в поле Text впишите //Таблица//.
250 1. Выберите второй элемент и на вкладке Properties:
251 11. в секции Appearance установите для него Location x=300 px, y=0 px, Size w=150px, h=30px;
252 11. в секции Borders выберите отображение всех внешних границ, Padding left=5;
253 11. в секции Static Text выровняйте текст по центру по высоте, установите жирное начертание (кнопка B), в поле Text впишите //Количество строк//.
254 1. Выберите третий элемент и на вкладке Properties:
255 11. в секции Appearance установите для него Location x=450 px, y=0 px, Size w=100px, h=30px;
256 11. в секции Borders выберите отображение всех внешних границ, Padding left=5;
257 11. в секции Static Text выровняйте текст по центру по высоте, установите жирное начертание (кнопка B), в поле Text впишите //Размер на диске//.
258
259 Уменьшите высоту секции Column Header: выберите на вкладке Outline секцию Column Header, во вкладке Properties, в секции Appearance установите высоту (поле Height) в 30px.
260
261 Сохраните документ. В результате макет должен выглядеть так:
262
263 [[image:attach:visual-preview1.png]]
264
265 Добавим отображение созданных ранее полей в секцию Detail 1. Перетащите из вкладки Palette три элемента Text Field в секцию Detail 1:
266
267 1. Выберите первый элемент и на вкладке Properties:
268 11. в секции Appearance установите для него Location x=0 px, y=0 px, Size w=300px, h=30px;
269 11. в секции Borders выберите отображение всех внешних границ, Padding left=5;
270 11. в секции Text Field выровняйте текст по центру по высоте, в поле Expression впишите выражение ##$F{table_name}##
271 1. Выберите второй элемент и на вкладке Properties:
272 11. в секции Appearance установите для него Location x=300 px, y=0 px, Size w=150px, h=30px;
273 11. в секции Borders выберите отображение всех внешних границ, Padding left=5;
274 11. в секции Text Field выровняйте текст по центру по высоте, в поле Expression впишите выражение ##$F{row_estimate}##
275 1. Выберите третий элемент и на вкладке Properties:
276 11. в секции Appearance установите для него Location x=450 px, y=0 px, Size w=100px, h=30px;
277 11. в секции Borders выберите отображение всех внешних границ, Padding left=5;
278 11. в секции Text Field выровняйте текст по центру по высоте, в поле Expression впишите выражение ##$F{total}##
279
280 Уменьшите высоту секции Detail 1: выберите на вкладке Outline секцию Detail 1, во вкладке Properties, в секции Appearance установите высоту (поле Height) в 30px.
281
282 Сохраните документ. В результате макет должен выглядеть так:
283
284 [[image:attach:visual-preview2.png]]
285
286 Добавим вывод номера страницы в секцию Page Footer (нижний колонтитул). Перетащите из вкладки Palette один элемент Text Field в секцию Page Footer.
287
288 Выберите элемент и на вкладке Properties:
289
290 1. в секции Appearance установите для него Location x=450 px, y=10 px, Size w=100px, h=20px;
291 1. в секции Text Field выровняйте текст по центру по высоте, выровняйте по правому краю, в поле Expression впишите выражение: ##"Страница " + $V{PAGE_NUMBER}##
292
293 В данном случае для вывода номера страницы мы используем переменную ##PAGE_NUMBER##, которую автоматически предоставляет JasperReports Library.
294
295 Уменьшите высоту секции Page Footer: выберите на вкладке Outline секцию Page Footer, во вкладке Properties, в секции Appearance установите высоту (поле Height) в 30px.
296
297 Сохраните документ. В результате макет должен выглядеть так:
298
299 [[image:attach:visual-preview3.png]]
300
301 === {{id name="Каксоздатьсвойнаборшаблонов-Предпросмотр"/}}Предпросмотр ===
302
303 Ну что же, макет отчёта закончен. Можно посмотреть, как он будет выглядеть.
304
305 Для этого перейдите на вкладку Preview:
306
307 [[image:attach:preview.png||height="250"]]
308
309 Убедитесь, что вверху в списке выбран источник данных Example Database, после чего нажмите на зелёную кнопку предпросмотра. Спустя пару секунд окне вы увидите результат:
310
311 [[image:attach:preview-2.png||height="250"]]
312
313 === {{id name="Каксоздатьсвойнаборшаблонов-Привязкаполейввода"/}}Привязка полей ввода ===
314
315 Для того, чтобы пользователь в программе НЕЙРОСС Отчёты мог задать входные параметры, необходимо к этим параметрам в Jasper-шаблоне привязать соответствующие поля ввода данных — текстовое для ввода имени схемы, числовое для ввода ограничения на размер таблицы на диске.
316
317 Выберите на вкладке Outline параметр SCHEMA_NAME. На вкладке Properties в секции Advanced на строке Properties нажмите на кнопку «...».
318
319 [[image:attach:property-properties-1.png||height="250"]]
320
321 В открывшемся диалоговом окне с помощью кнопки Add добавьте два свойства:
322
323 1. Property Name: ##ru.itrium.ultima.reports.form.field.class## Value: ##extensions.reports.generic.InputFormField##
324 1. Property Name: ##ru.itrium.ultima.reports.form.field.inputType## Value: ##text##
325
326 [[image:attach:property-properties-2.png||height="250"]]
327
328 Нажмите Finish.
329
330 Повторите процедуру для параметра MIN_TABLE_SIZE. Установите для параметра следующие свойства:
331
332 1. Property Name: ##ru.itrium.ultima.reports.form.field.class## Value: ##extensions.reports.generic.InputFormField##
333 1. Property Name: ##ru.itrium.ultima.reports.form.field.inputType## Value: ##number##
334
335 Сохраните шаблон.
336
337 === {{id name="Каксоздатьсвойнаборшаблонов-Компиляцияшаблона"/}}Компиляция шаблона ===
338
339 Итак, мы почти закончили редактирование шаблона в Jaspersoft Studio. Осталось скомпилировать шаблон.
340
341 Для этого, выберите файл шаблона на вкладке Project Explorer и в контекстном меню выберите команду Compile:
342
343 [[image:attach:compile.png||height="250"]]
344
345 В директории Jasper-проекта рядом с файлом example.jrxml появится файл example.jasper. Этот файл потребуется при создании набора шаблонов.
346
347 == {{id name="Каксоздатьсвойнаборшаблонов-Созданиенаборашаблоновотчётов"/}}Создание набора шаблонов отчётов ==
348
349 Для того, чтобы созданным шаблоном можно было пользоваться из [[Платформы НЕЙРОСС>>doc:neyross.WebHome]], его необходимо упаковать в //набор шаблонов//. Набор шаблонов — это zip-архив, содержащий один или более шаблонов и соответствующие файлы-описания.
350
351 Создайте пустую директорию ##exampleModule## на диске ##C:\##. Это корневая директория будущего набора шаблонов.
352
353 В директории ##C:\exampleModule## создайте вложенную директорию ##definitions## (##C:\exampleModule\definitions##). В этой директории будут храниться шаблоны отчётов (в нашем случае — один шаблон).
354
355 В директории ##C:\exampleModule\definitions## создайте вложенную директорию ##exampleReport## (##C:\exampleModule\definitions\exampleReport##). Это корневая директория шаблона.
356
357 Скопируйте из Jaspersoft Studio с вкладки Project Explorer полученный ранее файл ##report.jasper## (откройте на элементе контекстное меню и выберите команду Copy) в директорию ##C:\exampleModule\definitions\exampleReport##.
358
359 Создайте в этой же директории файл ##report.conf## со следующим содержимым:
360
361 {{code language="text"}}
362 definition.class=extensions.reports.GenericJasperReportDefinition
363 definition.htmlPaging=false
364 definition.supportedFormats=["pdf","xls"]
365
366 definition.generic.key="org.example.module:exampleReport"
367 definition.generic.title="Размер таблиц на диске"
368 definition.generic.description=""
369
370 definition.jasper.design = {
371 main: "example.jasper",
372 html: "example.jasper"
373 }
374 {{/code}}
375
376 Создайте файл-определение набора шаблонов ##deployment.conf## в директории ##C:\exampleModule## следующего содержания:
377
378 {{code language="text"}}
379 deployment.key=org.example.module
380 deployment.title="Новый набор шаблонов"
381 deployment.version=0.1.0
382 {{/code}}
383
384 {{info title="ВНИМАНИЕ"}}
385 Текстовые файлы ##report.conf## и ##deployment.conf## должны быть созданы в кодировке UTF-8. В противном случае в интерфейсе Платформы НЕЙРОСС соответствующий текст может отображаться некорректно.
386 {{/info}}
387
388 Перейдите в проводнике Windows в директорию ##C:\exampleModule##, выберите файл ##deployment.conf## и директорию ##definitions## и в контекстном меню выберите пункт Отправить → Сжатая ZIP-папка.
389
390 В директории ##C:\exampleModule## появится новый zip-файл. Измените его имя на ##exampleModule-0.1.0.zip##.
391
392 Это файл набора шаблонов отчётов. Его можно загрузить в Платформу НЕЙРОСС.
393
394 == {{id name="Каксоздатьсвойнаборшаблонов-Установканаборашаблонов"/}}Установка набора шаблонов ==
395
396 Осталось установить созданный набор шаблонов в Платформу НЕЙРОСС.
397
398 Для установки набора шаблонов откройте интерфейс Платформы, авторизуйтесь и перейдите в раздел «Отчёты → Наборы шаблонов отчётов».
399
400 Выберите файл набора шаблонов и нажмите кнопку «Загрузить». В таблице установленных наборов шаблонов должна появиться новая запись c названием «Новый набор шаблонов» (это название набора шаблонов из файла ##deployment.conf##):
401
402 [[image:attach:result-1.png]]
403
404 Вернитесь в начало и добавьте подключение к PostgreSQL базе данных в разделе «Источники данных».
405
406 Перейдите в раздел «Отчёты».
407
408 Выберите в списке источник данных (подключение в PostgreSQL базе данных). В списке доступных шаблонов должна присутствовать опция «Размер таблиц на диске» (это название шаблона из файла ##report.conf##). Выберите этот шаблон.
409
410 Программа отобразит в интерфейсе форму ввода параметров с полями для ввода имени схемы и ограничения по размеру таблицы.
411
412 Укажите требуемые параметры и сформируйте отчёт.
413
414 [[image:attach:result-3.png||height="250"]]
415
416 PDF-файл: [[attach:Размер таблиц на диске (16-09-2018 15-58).pdf]]
417
418 == Материалы ==
419
420 Пример набора шаблонов, созданного в соответствии с приведённой инструкцией, доступен по ссылке.
421
422 Архив также содержит исходный код Jasper-шаблона в директории ##definitions\exampleReport## — это файл ##example.jrxml##.

Платформа НЕЙРОСС