Compile & Fill Jasper Report-XML источник данных

Я надеюсь, кто-то может сказать мне, почему код ниже создает пустой pdf-файл каждый раз?

Я пытаюсь скомпилировать, заполнить и запустить xmldatasource пример проекта, который поставляется с JasperReports 4.0.2. Хотя я пытаюсь сделать это программно, поскольку я хочу использовать аналогичный (не основанный на ant) метод компиляции в своем собственном программном обеспечении. Тот же проект, который поставляется с Jasper, использует сценарии ant для создания отчета, и он работает. Поэтому я знаю, что нет проблем с файлами JRXML. Однако я не могу правильно заполнить отчет данными.

когда я отладил источник движка Jasper, чтобы увидеть, правильно ли загружается мой исходный документ XML, я вижу, что PARAMETER_XML_DOCUMENT имеет значение

[#document: null]

как вы думаете, это будет означать, что исходный XML-файл не читается правильно?

код компилируется и запускается без ошибок, и генерируются все соответствующие файлы (.Джаспер. ,jrprint и.pdf), но по какой-то причине отображаемый PDF-документ каждый раз имеет только одну пустую страницу.

любая помощь очень ценится...

public static void main(String[] args) {
        Map map = new RenderReportBean().execute("northwind", "OrdersReport");

    }

    @SuppressWarnings({ "rawtypes", "unchecked" })
    public Map execute(String sourceFileId, String templateId, Integer[] formats) {
        Map params = new HashMap();
        Document document;
        Map<Integer, Boolean> renderedSuccessList = new HashMap<Integer, Boolean>();
        try {

            document = JRXmlUtils.parse(JRLoader.getLocationInputStream(sourceFileId + ".xml"));

            params.put(JRXPathQueryExecuterFactory.PARAMETER_XML_DATA_DOCUMENT, document);
            params.put(JRXPathQueryExecuterFactory.XML_DATE_PATTERN, "yyyy-MM-dd");
            params.put(JRXPathQueryExecuterFactory.XML_NUMBER_PATTERN, "#,##0.##");
            params.put(JRXPathQueryExecuterFactory.XML_LOCALE, Locale.ENGLISH);
            params.put(JRParameter.REPORT_LOCALE, Locale.US);

            JasperCompileManager.compileReportToFile(templateId + ".jrxml", templateId + ".jasper");

            JasperFillManager.fillReportToFile(templateId + ".jasper", params);

            JasperExportManager.exportReportToPdfFile(templateId + ".jrprint", sourceFileId + ".pdf");


        } catch (Exception e) {
            e.printStackTrace();
            return renderedSuccessList;
        }
        return renderedSuccessList;
    }

OrdersReport.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="OrdersReport" pageWidth="500" pageHeight="842" columnWidth="500" leftMargin="0" rightMargin="0" topMargin="0" bottomMargin="0">
    <style name="Sans_Normal" isDefault="true" fontName="DejaVu Sans" fontSize="8" isBold="false" isItalic="false" isUnderline="false" isStrikeThrough="false"/>
    <style name="Sans_Bold" isDefault="false" fontName="DejaVu Sans" fontSize="8" isBold="true" isItalic="false" isUnderline="false" isStrikeThrough="false"/>
    <style name="Sans_Italic" isDefault="false" fontName="DejaVu Sans" fontSize="8" isBold="false" isItalic="true" isUnderline="false" isStrikeThrough="false"/>
    <parameter name="CustomerID" class="java.lang.String"/>
    <queryString language="xPath"><![CDATA[/Northwind/Orders[CustomerID='$P{CustomerID}']]]></queryString>
    <field name="Id" class="java.lang.String">
        <fieldDescription><![CDATA[OrderID]]></fieldDescription>
    </field>
    <field name="OrderDate" class="java.util.Date">
        <fieldDescription><![CDATA[OrderDate]]></fieldDescription>
    </field>
    <field name="ShipCity" class="java.lang.String">
        <fieldDescription><![CDATA[ShipCity]]></fieldDescription>
    </field>
    <field name="Freight" class="java.lang.Float">
        <fieldDescription><![CDATA[Freight]]></fieldDescription>
    </field>
    <variable name="TotalFreight" class="java.lang.Float" calculation="Sum">
        <variableExpression><![CDATA[$F{Freight}]]></variableExpression>
    </variable>
    <pageHeader>
        <band height="14">
            <frame>
                <reportElement x="0" y="2" width="356" height="10" forecolor="#ccffff" backcolor="#ccffff" mode="Opaque"/>
                <staticText>
                    <reportElement mode="Opaque" x="0" y="0" width="48" height="10" backcolor="#ccffff" style="Sans_Bold"/>
                    <textElement textAlignment="Right"/>
                    <text><![CDATA[ID]]></text>
                </staticText>
                <staticText>
                    <reportElement mode="Opaque" x="54" y="0" width="87" height="10" backcolor="#ccffff" style="Sans_Bold"/>
                    <textElement textAlignment="Center"/>
                    <text><![CDATA[Order Date]]></text>
                </staticText>
                <staticText>
                    <reportElement mode="Opaque" x="146" y="0" width="108" height="10" backcolor="#ccffff" style="Sans_Bold"/>
                    <text><![CDATA[Ship City]]></text>
                </staticText>
                <staticText>
                    <reportElement mode="Opaque" x="259" y="0" width="92" height="10" backcolor="#ccffff" style="Sans_Bold"/>
                    <textElement textAlignment="Right"/>
                    <text><![CDATA[Freight]]></text>
                </staticText>
            </frame>
        </band>
    </pageHeader>
    <detail>
        <band height="14">
            <textField>
                <reportElement x="0" y="2" width="51" height="10"/>
                <textElement textAlignment="Right"/>
                <textFieldExpression class="java.lang.String"><![CDATA[$F{Id}]]></textFieldExpression>
            </textField>
            <textField isStretchWithOverflow="true" pattern="yyyy, MMM dd">
                <reportElement positionType="Float" x="54" y="2" width="87" height="10"/>
                <textElement textAlignment="Center"/>
                <textFieldExpression class="java.util.Date"><![CDATA[$F{OrderDate}]]></textFieldExpression>
            </textField>
            <textField isStretchWithOverflow="true">
                <reportElement positionType="Float" x="146" y="2" width="108" height="10"/>
                <textElement/>
                <textFieldExpression class="java.lang.String"><![CDATA[$F{ShipCity}]]></textFieldExpression>
            </textField>
            <textField isStretchWithOverflow="true" pattern="¤ #,##0.00">
                <reportElement positionType="Float" x="259" y="2" width="92" height="10"/>
                <textElement textAlignment="Right"/>
                <textFieldExpression class="java.lang.Float"><![CDATA[$F{Freight}]]></textFieldExpression>
            </textField>
        </band>
    </detail>
    <summary>
        <band height="14">
            <frame>
                <reportElement x="0" y="2" width="356" height="10" forecolor="#33cccc" backcolor="#33cccc" mode="Opaque"/>
                <staticText>
                    <reportElement mode="Opaque" x="160" y="0" width="67" height="10" backcolor="#33cccc" style="Sans_Bold"/>
                    <textElement textAlignment="Right"/>
                    <text><![CDATA[Total :]]></text>
                </staticText>
                <textField>
                    <reportElement mode="Opaque" x="259" y="0" width="92" height="10" backcolor="#33cccc" style="Sans_Bold"/>
                    <textElement textAlignment="Right"/>
                    <textFieldExpression class="java.lang.Float"><![CDATA[$V{TotalFreight}]]></textFieldExpression>
                </textField>
                <textField>
                    <reportElement mode="Opaque" x="227" y="0" width="27" height="10" backcolor="#33cccc" style="Sans_Bold"/>
                    <textElement textAlignment="Right"/>
                    <textFieldExpression class="java.lang.Integer"><![CDATA[$V{REPORT_COUNT}]]></textFieldExpression>
                </textField>
            </frame>
        </band>
    </summary>
</jasperReport>

CustomersReport.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="CustomersReport" pageWidth="595" pageHeight="842" columnWidth="515" leftMargin="40" rightMargin="40" topMargin="50" bottomMargin="50">
    <style name="Sans_Normal" isDefault="true" fontName="DejaVu Sans" fontSize="12" isBold="false" isItalic="false" isUnderline="false" isStrikeThrough="false"/>
    <style name="Sans_Bold" isDefault="false" fontName="DejaVu Sans" fontSize="12" isBold="true" isItalic="false" isUnderline="false" isStrikeThrough="false"/>
    <style name="Sans_Italic" isDefault="false" fontName="DejaVu Sans" fontSize="12" isBold="false" isItalic="true" isUnderline="false" isStrikeThrough="false"/>
    <queryString language="xPath"><![CDATA[/Northwind/Customers]]></queryString>
    <field name="CustomerID" class="java.lang.String">
        <fieldDescription><![CDATA[CustomerID]]></fieldDescription>
    </field>
    <field name="CompanyName" class="java.lang.String">
        <fieldDescription><![CDATA[CompanyName]]></fieldDescription>
    </field>
    <title>
        <band height="50">
            <line>
                <reportElement x="0" y="0" width="515" height="1"/>
                <graphicElement/>
            </line>
            <staticText>
                <reportElement x="0" y="10" width="515" height="30" style="Sans_Normal"/>
                <textElement textAlignment="Center">
                    <font size="22"/>
                </textElement>
                <text><![CDATA[Customer Orders Report]]></text>
            </staticText>
        </band>
    </title>
    <pageHeader>
        <band height="21">
            <staticText>
                <reportElement mode="Opaque" x="0" y="5" width="515" height="15" forecolor="#ffffff" backcolor="#333333" style="Sans_Bold"/>
                <text><![CDATA[Customer Order List]]></text>
            </staticText>
        </band>
    </pageHeader>
    <detail>
        <band height="50">
            <textField>
                <reportElement x="5" y="5" width="100" height="15" isPrintWhenDetailOverflows="true" style="Sans_Bold"/>
                <textFieldExpression class="java.lang.String"><![CDATA[$F{CustomerID}]]></textFieldExpression>
            </textField>
            <staticText>
                <reportElement isPrintRepeatedValues="false" x="404" y="5" width="100" height="15" isPrintWhenDetailOverflows="true" style="Sans_Bold"/>
                <text><![CDATA[(continued)]]></text>
            </staticText>
            <line>
                <reportElement x="0" y="20" width="515" height="1" isPrintWhenDetailOverflows="true"/>
                <graphicElement/>
            </line>
            <subreport>
                <reportElement isPrintRepeatedValues="false" x="5" y="25" width="507" height="20" isRemoveLineWhenBlank="true" backcolor="#ffcc99"/>
                <subreportParameter name="XML_DATA_DOCUMENT">
                    <subreportParameterExpression>$P{XML_DATA_DOCUMENT}</subreportParameterExpression>
                </subreportParameter>
                <subreportParameter name="XML_DATE_PATTERN">
                    <subreportParameterExpression>$P{XML_DATE_PATTERN}</subreportParameterExpression>
                </subreportParameter>
                <subreportParameter name="XML_NUMBER_PATTERN">
                    <subreportParameterExpression>$P{XML_NUMBER_PATTERN}</subreportParameterExpression>
                </subreportParameter>
                <subreportParameter name="XML_LOCALE">
                    <subreportParameterExpression>$P{XML_LOCALE}</subreportParameterExpression>
                </subreportParameter>
                <subreportParameter name="XML_TIME_ZONE">
                    <subreportParameterExpression>$P{XML_TIME_ZONE}</subreportParameterExpression>
                </subreportParameter>
                <subreportParameter name="CustomerID">
                    <subreportParameterExpression>$F{CustomerID}</subreportParameterExpression>
                </subreportParameter>
                <subreportExpression class="java.lang.String"><![CDATA["OrdersReport.jasper"]]></subreportExpression>
            </subreport>
            <textField>
                <reportElement x="109" y="5" width="291" height="15" isPrintWhenDetailOverflows="true" style="Sans_Bold"/>
                <textFieldExpression class="java.lang.String"><![CDATA[$F{CompanyName}]]></textFieldExpression>
            </textField>
        </band>
    </detail>
    <pageFooter>
        <band height="40">
            <line>
                <reportElement x="0" y="10" width="515" height="1"/>
                <graphicElement/>
            </line>
            <textField>
                <reportElement x="200" y="20" width="80" height="15"/>
                <textElement textAlignment="Right"/>
                <textFieldExpression class="java.lang.String"><![CDATA["Page " + String.valueOf($V{PAGE_NUMBER}) + " of"]]></textFieldExpression>
            </textField>
            <textField evaluationTime="Report">
                <reportElement x="280" y="20" width="75" height="15"/>
                <textElement/>
                <textFieldExpression class="java.lang.String"><![CDATA[" " + String.valueOf($V{PAGE_NUMBER})]]></textFieldExpression>
            </textField>
        </band>
    </pageFooter>
</jasperReport>

2 ответов


хорошо, поэтому я узнал о проблеме, и это немного странно, так как другие средства компиляции шаблонов не требуют того же подхода.

в приведенном выше примере используются вложенные отчеты, и по какой-то причине опция компиляции во время выполнения требует, чтобы вы компилировали оба шаблона по отдельности, а не просто компилировали супер - отчет и Jasper, подбирая суб-отчет bu по умолчанию-как, похоже, происходит при компиляции из сценариев ant.

Итак, чтобы сделать выше код работы строки:

JasperCompileManager.compileReportToFile(templateId + ".jrxml", templateId + ".jasper");

необходимо включить для каждого шаблона (super и sub), который требуется для отчета.


проблема здесь: document = JRXmlUtils.разбор (JRLoader.getLocationInputStream (sourceFileId + ".xml"));

API говорит: getLocationInputStream

общедоступная статическая java.Ио.InputStream getLocationInputStream (java.ленг.Расположение строки) бросает JRException

Tries to open an input stream for a location.

The method tries to interpret the location as a file name, a resource name or an URL. If any of these succeed, an input stream is created and returned.

Parameters:
    location - the location 
Returns:
    an input stream if the location is an existing file name, a resource name on the classpath or an URL or null otherwise. 
Throws:
    JRException

если метод не может вернуть входной поток, он вернет значение null. В основном строка, которую вы передаете как параметр неправильный. Попробуйте пройти абсолютный путь.