Как ссылаться на поля коллекции из источника данных XML в Jasper? - PullRequest
0 голосов
/ 18 февраля 2019

Меня попросили изменить шаблон с источником данных XML в Jasper, чтобы использовать динамические столбцы из Java-программы.Поэтому я собрал все столбцы, которые должны отображаться в PDF, в виде списка, который затем должен быть распечатан в PDF как столбцы таблицы.Поскольку я новичок в Jasper и столкнулся с проблемой отсутствия в моем списке нулей в подотчете, я подумал, что будет проще начать с показа элемента списка в основном отчете и продолжения с этого момента.

Однако, кажется, что список всегда пуст, даже в основном отчете, и я пробовал различные подходы, чтобы попытаться распечатать содержимое списка.Сначала я проверил, что фактическое содержимое списка не равно нулю, и это можно проверить в сгенерированном XML.Затем в Джаспере я попытался создать поле списка в основном отчете, указывающее на переменную в моей Java-программе (которая отлично работает для других переменных, например для строк).Создание поля для доступа только к одному полю в списке или распечатка всего списка приводит к тому, что в сгенерированном PDF-файле печатается нулевое значение.

Так что, похоже, я неправильно понял, как ссылаться на списки / обращаться к ним при работе с XML как источником данных в Jasper.

Вот как выглядит список в XML:

<kunde>102591</kunde>
<company>Sony</company>
<currentDate>16.02.2019</currentDate>
<columns>
    <string>id</string>
    <string>type</string>
    <string>name</string>
    <string>area</string>
    <string>salary</string>
</columns>

Я добавил поле в основной отчет следующим образом: The added field in the main report

Несборки, например строки, работают просто отлично: enter image description here

Нужно ли ссылаться на поле коллекции, например, на обычные строковые поля?Если бы кто-нибудь мог объяснить, в чем здесь проблема, это было бы очень признательно.

1 Ответ

0 голосов
/ 18 февраля 2019

Отчеты Jasper не будут автоматически преобразовывать ваши узлы в java.util.List, поскольку он не знает, как это сделать.

Вместо вы можете создать другой источник данных, используя, например, subDatasource, а затем используйте этот источник данных для итерации значений / коллекции.

Примечание. Создавать динамические столбцы непросто, возможно, вам потребуется использовать кросс-таблицу.В этом примере я только покажу, как выводить значения полей способом columnHeader, используя горизонтальный порядок печати для jr:list, что ответит на вопрос, как ссылаться на поля коллекции.

Пример

xml

<records>
    <record>
        <kunde>102591</kunde>
        <company>Sony</company>
        <currentDate>16.02.2019</currentDate>
        <columns>
            <string>id</string>
            <string>type</string>
            <string>name</string>
            <string>area</string>
            <string>salary</string>
        </columns>
    </record>   
</records>

jrxml

<?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="Blank_A4_1" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" isFloatColumnFooter="true" uuid="b98a8766-0e9e-4ae0-9d7c-509e658cd367">
    <subDataset name="customer" uuid="1b55ccc5-c764-45cf-b5c6-b2dea09c1e32">
        <queryString language="XPath">
            <![CDATA[/records/record/columns/string]]>
        </queryString>
        <field name="string" class="java.lang.String">
            <fieldDescription><![CDATA[child::text()]]></fieldDescription>
        </field>
    </subDataset>
    <queryString language="XPath">
        <![CDATA[/records/record]]>
    </queryString>
    <field name="kunde" class="java.lang.String">
        <fieldDescription><![CDATA[kunde]]></fieldDescription>
    </field>
    <field name="company" class="java.lang.String">
        <fieldDescription><![CDATA[company]]></fieldDescription>
    </field>
    <field name="currentDate" class="java.lang.String">
        <fieldDescription><![CDATA[currentDate]]></fieldDescription>
    </field>
    <columnHeader>
        <band height="32" splitType="Stretch">
            <staticText>
                <reportElement x="0" y="0" width="100" height="30" uuid="4b8856ca-e4f4-4e50-9882-c8c1f9f2fe9c"/>
                <text><![CDATA[kunde]]></text>
            </staticText>
            <staticText>
                <reportElement x="100" y="0" width="100" height="30" uuid="8b6f2e55-f3fe-4461-89bd-4e3ba1b5b06b"/>
                <text><![CDATA[company]]></text>
            </staticText>
            <staticText>
                <reportElement x="200" y="0" width="100" height="30" uuid="6320c458-dad4-46e8-a229-bbec8902ad73"/>
                <text><![CDATA[currentDate]]></text>
            </staticText>
        </band>
    </columnHeader>
    <detail>
        <band height="134" splitType="Stretch">
            <textField>
                <reportElement x="0" y="0" width="100" height="30" uuid="bde9ccfc-384e-48c7-aafa-3375b4a5d160"/>
                <textFieldExpression><![CDATA[$F{kunde}]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement x="100" y="0" width="100" height="30" uuid="43d2ce05-e723-4701-96f0-fbdd13768500"/>
                <textFieldExpression><![CDATA[$F{company}]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement x="200" y="0" width="100" height="30" uuid="298f066d-ce3a-491e-954c-b9d590fabb8f"/>
                <textFieldExpression><![CDATA[$F{currentDate}]]></textFieldExpression>
            </textField>
            <componentElement>
                <reportElement x="0" y="43" width="550" height="30" uuid="bfaa5273-3cd6-4538-b95b-fcd356a24423"/>
                <jr:list xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd" printOrder="Horizontal">
                    <datasetRun subDataset="customer" uuid="3cfd00e4-8793-456e-806f-4ba30e10e6b3">
                        <dataSourceExpression><![CDATA[((net.sf.jasperreports.engine.data.JRXmlDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("/record/columns/string")]]></dataSourceExpression>
                    </datasetRun>
                    <jr:listContents height="30" width="80">
                        <textField>
                            <reportElement x="0" y="0" width="80" height="30" uuid="bc599749-6639-41d8-abdb-58df6b54f82e"/>
                            <textFieldExpression><![CDATA[$F{string}]]></textFieldExpression>
                        </textField>
                    </jr:listContents>
                </jr:list>
            </componentElement>
        </band>
    </detail>
</jasperReport>

Выход

result

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...