Причина проблемы
Вы неправильно используете источник данных - поля должны быть объявлены в ItemDataset1 , а не параметры .
В случае использования источника данных с полями отчет будет в порядке. Действительное объявление в вашем случае должно быть таким:
<subDataset name="ItemDataset1">
<field name="id" class="java.lang.Integer"/>
<field name="xkey" class="java.lang.String"/>
<field name="phone" class="java.lang.String"/>
<field name="value" class="java.lang.String"/>
</subDataset>
Еще одна вещь, которую нужно улучшить - вы можете установить whenNoDataType атрибут wtih AllSectionsNoDetail значение таблицы для отображения пустой таблицы в случае, если коллекция пуста. С вашим кодом таблица будет отсутствовать для пустой коллекции ввода.
Рабочий пример
Шаблон отчета
Действительный jr xml будет выглядеть так вот это:
<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="Example" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" >
<subDataset name="ItemDataset1" >
<field name="id" class="java.lang.Integer"/>
<field name="xkey" class="java.lang.String"/>
<field name="phone" class="java.lang.String"/>
<field name="value" class="java.lang.String"/>
</subDataset>
<parameter name="itemPath" class="java.lang.String"/>
<parameter name="ItemDataSource" class="net.sf.jasperreports.engine.data.JRBeanCollectionDataSource"/>
<title>
<band height="87" splitType="Stretch">
<line>
<reportElement x="0" y="80" width="556" height="1" />
</line>
<textField>
<reportElement x="465" y="30" width="84" height="20" />
<textFieldExpression><![CDATA["INV0001"]]></textFieldExpression>
</textField>
<staticText>
<reportElement x="415" y="30" width="50" height="20" />
<text><![CDATA[Invoice #]]></text>
</staticText>
<staticText>
<reportElement x="95" y="0" width="210" height="25" />
<text><![CDATA[Your company name]]></text>
</staticText>
<staticText>
<reportElement x="95" y="55" width="205" height="15" />
<text><![CDATA[Phone number, web address, ecc.]]></text>
</staticText>
<staticText>
<reportElement x="95" y="25" width="205" height="15" />
<text><![CDATA[Street address]]></text>
</staticText>
<staticText>
<reportElement x="95" y="40" width="205" height="15" />
<text><![CDATA[City, street, ZIP code]]></text>
</staticText>
<image>
<reportElement x="10" y="10" width="50" height="50" />
<imageExpression><![CDATA[$P{itemPath}]]></imageExpression>
</image>
</band>
</title>
<detail>
<band height="226" splitType="Stretch">
<componentElement>
<reportElement x="0" y="0" width="555" height="226" >
<property name="com.jaspersoft.studio.layout" value="com.jaspersoft.studio.editor.layout.VerticalRowLayout"/>
</reportElement>
<jr:table xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd" whenNoDataType="AllSectionsNoDetail">
<datasetRun subDataset="ItemDataset1" >
<dataSourceExpression><![CDATA[$P{ItemDataSource}]]></dataSourceExpression>
</datasetRun>
<jr:columnGroup width="555" >
<jr:tableHeader height="30" rowSpan="1">
<staticText>
<reportElement x="0" y="0" width="555" height="30" />
<text><![CDATA[Resultados]]></text>
</staticText>
</jr:tableHeader>
<jr:column width="120" >
<jr:tableHeader height="30" rowSpan="1"/>
<jr:columnHeader height="30" rowSpan="1">
<staticText>
<reportElement x="0" y="0" width="120" height="30" />
<text><![CDATA[Id]]></text>
</staticText>
</jr:columnHeader>
<jr:detailCell height="30">
<textField>
<reportElement x="0" y="0" width="120" height="30" />
<textFieldExpression><![CDATA[$F{id}]]></textFieldExpression>
</textField>
</jr:detailCell>
</jr:column>
<jr:column width="120" >
<jr:tableHeader height="30" rowSpan="1"/>
<jr:columnHeader height="30" rowSpan="1">
<staticText>
<reportElement x="0" y="0" width="120" height="30" />
<text><![CDATA[xkey]]></text>
</staticText>
</jr:columnHeader>
<jr:detailCell height="30">
<textField>
<reportElement x="0" y="0" width="120" height="30" />
<textFieldExpression><![CDATA[$F{xkey}]]></textFieldExpression>
</textField>
</jr:detailCell>
</jr:column>
<jr:column width="120" >
<jr:tableHeader height="30" rowSpan="1"/>
<jr:columnHeader height="30" rowSpan="1">
<staticText>
<reportElement x="0" y="0" width="120" height="30" />
<text><![CDATA[Phone]]></text>
</staticText>
</jr:columnHeader>
<jr:detailCell height="30">
<textField>
<reportElement x="0" y="0" width="120" height="30" />
<textFieldExpression><![CDATA[$F{phone}]]></textFieldExpression>
</textField>
</jr:detailCell>
</jr:column>
<jr:column width="195" >
<jr:tableHeader height="30" rowSpan="1"/>
<jr:columnHeader height="30" rowSpan="1">
<staticText>
<reportElement x="0" y="0" width="195" height="30" />
<text><![CDATA[Value]]></text>
</staticText>
</jr:columnHeader>
<jr:detailCell height="30">
<textField>
<reportElement x="0" y="0" width="195" height="30" />
<textFieldExpression><![CDATA[$F{value}]]></textFieldExpression>
</textField>
</jr:detailCell>
</jr:column>
</jr:columnGroup>
</jr:table>
</componentElement>
</band>
</detail>
</jasperReport>
Я использовал поля, объявленные в subDataset в textFields выражений.
Код Java для построения отчета
Фрагмент для построения отчета в формате pdf:
JasperReport jasperReport;
try (InputStream inputStream = getClass().getResourceAsStream(pathToTemplate)) {
jasperReport = JasperCompileManager.compileReport(JRXmlLoader.load(inputStream));
}
Map<String, Object> params = new HashMap<>();
Collection<BeanForTable> collection = Arrays.asList(
BeanForTable.builder().id(1).phone("101").value("value1").xkey("key1").build(),
BeanForTable.builder().id(2).phone("707").value("value2").xkey("key2").build()
);
params.put("ItemDataSource", new JRBeanCollectionDataSource(collection));
params.put("itemPath", pathToImage);
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, params, new JREmptyDataSource());
SimplePdfExporterConfiguration configuration = new SimplePdfExporterConfiguration();
File outputFile = new File(outputFileName);
try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
OutputStream fileOutputStream = new FileOutputStream(outputFile)) {
JRPdfExporter exporter = new JRPdfExporter();
exporter.setExporterInput(new SimpleExporterInput(jasperPrint));
exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(byteArrayOutputStream));
exporter.setConfiguration(configuration);
exporter.exportReport();
byteArrayOutputStream.writeTo(fileOutputStream);
}
В этом фрагменте отчет генерируется как файл pdf .
Сгенерированный вывод
Примечания
Пожалуйста, не забывайте, что в случае передачи new JREmptyDataSource(0)
через третий аргумент в JasperFillManager.fillReport метод, отчет будет пустым (даже Заголовок полоса будет отсутствовать), потому что:
- вы поместили jr: table at Detail band
- Вы не установили whenNoDataType Атрибут отчета как AllSectionsNoDetail