2011-06-15 33 views
7

我希望有人能告訴我爲什麼下面的代碼每次都創建一個空的pdf文件?編譯和填充Jasper Report - XML數據源

我想編譯,填寫並運行JasperReports 4.0.2附帶的xmldatasource示例項目。儘管我試圖以編程方式執行此操作,因爲我想在自己的軟件中使用類似的(非基於螞蟻的)編譯方法。 Jasper自帶的同一個項目使用ant腳本來創建報告,並且工作正常。所以我知道JRXML文件沒有問題。但是,我似乎無法正確填寫報告。

當我調試的碧玉引擎源,看看我的XML源文件被正確加載我看到PARAMETER_XML_DOCUMENT的值爲

[#document:空]

你認爲這將意味着XML源文件沒有被正確讀取?

代碼編譯並運行時沒有錯誤,並生成所有相關文件(.jasper,.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> 
+0

打印出文件的全限定路徑。確保文件可以被程序讀取。另外,你是否每次都要編譯報告?你有一個非常簡單的例子來說明問題嗎? (例如,其他人可以複製而不費太多力量?) – 2011-06-21 00:31:49

回答

1

好吧,所以我發現了這個問題,這真的有點奇怪,因爲編譯模板的其他方法並不要求相同的方法。

上面的例子使用嵌套報告,由於某些原因,運行時編譯選項要求您單獨編譯兩個模板,而不是僅編譯超級報告和Jasper選取子報告bu默認 - 這似乎是時從螞蟻腳本編譯。

因此,爲了使上面的代碼工作的一行:

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

需要包括對所需要的報表每個模板(超級亞)。

0

的問題是在這裏: 文件= JRXmlUtils.parse (JRLoader.getLocationInputStream(sourceFileId +「.xml」));

的API說: getLocationInputStream

公共靜態的java.io.InputStream getLocationInputStream(java.lang.String中的位置) 拋出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。基本上你作爲參數傳遞的字符串是不正確的。嘗試傳遞絕對路徑。

+0

@Dhanagopal_Sivaraman:感謝您的建議,但文件路徑不是問題。正如我在OP中所提到的那樣,沒有編譯錯誤,並且正在輸出所有必要的文件,包括呈現的報告。但問題是報告是空白的。 – travega 2011-06-27 02:29:38