7

iReports でグラフを作成しています。Eclipse でコンパイルすると、次のエラーが発生します。

net.sf.jasperreports.engine.JRException: Errors were encountered when compiling report expressions class file:
1. net.sf.jasperreports.engine.JRBeanCollectionDataSource cannot be resolved to a type
            value = new     net.sf.jasperreports.engine.JRBeanCollectionDataSource(((java.lang.String)field_chartData46xAxis.getValue())); //$JR_EXPR_ID=11$
                        <---------------------------------------------------->
2. net.sf.jasperreports.engine.JRBeanCollectionDataSource cannot be resolved to a type
            value = new net.sf.jasperreports.engine.JRBeanCollectionDataSource(((java.lang.String)field_chartData46xAxis.getOldValue())); //$JR_EXPR_ID=11$
                        <---------------------------------------------------->
3. net.sf.jasperreports.engine.JRBeanCollectionDataSource cannot be resolved to a type
            value = new net.sf.jasperreports.engine.JRBeanCollectionDataSource(((java.lang.String)field_chartData46xAxis.getValue())); //$JR_EXPR_ID=11$
                        <---------------------------------------------------->3 errors

at net.sf.jasperreports.engine.design.JRAbstractCompiler.compileReport(JRAbstractCompiler.java:204)
at net.sf.jasperreports.engine.JasperCompileManager.compile(JasperCompileManager.java:240)
at net.sf.jasperreports.engine.JasperCompileManager.compile(JasperCompileManager.java:173)
at net.sf.jasperreports.engine.JasperCompileManager.compileReport(JasperCompileManager.java:448)
at org.reportprotojava.protosheet.Program.main(Program.java:122)

ProtoReportArrayList (テスト中は 1 つだけ) を jasper コンパイラに渡します。ProtoReportクラスには、 Double 型の2 つのArrayListを持つChartDataクラスが含まれています。1つは X 軸用で、もう 1 つは Y 軸用です。ProtoReportChartDataクラス、およびメイン プログラム の定義は次のとおりです (少し簡略化されています)。

ProtoReportクラス:

package org.reportprotojava.protosheet;

import java.util.ArrayList;

public class ProtoReport {


private String outputFileName;
private String title;
private String logoLocation;
private String paragraphText;
private ArrayList<String> tableData;
private String picLocation;
private int[][] graphData;  //TODO decide how to store chart data
private ChartData chartData;
private String path;




//default constructor
public ProtoReport() {

    // Initialize object fields
    outputFileName = "PrototypeReport";
    title = "Prototype Report";
    paragraphText = "Default text";

    tableData = new ArrayList<String>();
    chartData = new ChartData();

    //set path to working directory
    path = System.getProperty("user.dir");

    //default to assumed report location 
    //(ie same folder as .jrxml and .jasper files)
    logoLocation = path + "\\reports\\logo.jpg";
    picLocation = path + "\\reports\\pic.jpg";

}

ChartDataクラス:

package org.reportprotojava.protosheet;

import java.util.ArrayList;

public class ChartData {

private ArrayList<Double> xAxis;
private ArrayList<Double> yAxis;
/**
 * @param xAxis
 * @param yAxis
 */

//default constructor
public ChartData(){
    xAxis = new ArrayList<Double>();
    yAxis = new ArrayList<Double>();
}



//constructor
public ChartData(ArrayList<Double> xAxis, ArrayList<Double> yAxis) {
    super();
    this.xAxis = xAxis;
    this.yAxis = yAxis;
}

メインプログラム

public class Program {

/**
 * @param args
 * 
 *Program runs our ProtoReport class and its supporting classes 
 * In the end we will have generated a .pdf from the 
 * previously defined .jrxml file
 */

//Generate some random data for the chart
public static ArrayList<Double> randomData(int size) {
    ArrayList<Double> arrayList = new ArrayList<Double>();
    double randNumber;

    for (int i = 0; i < size; i++) {
        randNumber = Math.random();
        arrayList.add(randNumber);
    }

    return arrayList;
}

public static void main(String[] args) {

    ArrayList<ProtoReport> listOfReports = new ArrayList<ProtoReport>();

    ProtoReport protoReport1 = new ProtoReport();
    ProtoReport protoReport2 = new ProtoReport();

 //Simple Fields and text
    protoReport1.setTitle("Example<br/>Fact Sheet");

    protoReport1.setLogoLocation(protoReport1.getPath() + "\\reports\\logo.gif");

 ChartData chartData = new ChartData();
    chartData.setYAxis(randomData(20));
    for (Double i = (double) 0; i < chartData.getYAxis().size(); i++) {
        chartData.getXAxis().add(i);
    }

        protoReport1.setChartData(chartData);  
 String jrxmlLocation = protoReport1.getPath() 
                    + "\\reports\\ReportPrototype.jrxml";
    String outputFileName = protoReport1.getPath() 
            + "\\reports\\generated\\" + protoReport1.getOutputFileName() + ".pdf";

    listOfReports.add(protoReport1);

//and wrap the ArrayList in a JRBeanCollectionDataSource
    JRBeanCollectionDataSource beanBurritoWrap = new JRBeanCollectionDataSource(listOfReports);

    //build the jasper report
    JasperReport jasperReport;
    JasperPrint jasperPrint;
    HashMap<String, Object> hashMap = new HashMap<>();
    boolean reportCreated;

    try {

        jasperReport = JasperCompileManager.compileReport(jrxmlLocation);
        jasperPrint = JasperFillManager.fillReport(jasperReport, hashMap, beanBurritoWrap);
        JasperExportManager.exportReportToPdfFile(jasperPrint, outputFileName);
        reportCreated=true;
    }
    catch (JRException e) {
          e.printStackTrace();
          reportCreated=false;
    }

}

私は問題をグーグルで調べてこれこれを思いつき、ジャスパーソースフォージのデータソースセクションを読みましたが、これらのどれも問題の解決に役立たず、使用したことを確認しました

 new net.sf.jasperreports.engine.JRBeanCollectionDataSource($F{chartData.xAxis})

私のチャートデータソース式で(フィールド名を変更すると更新されます)、フィールドはiReportプロパティで リストタイプに設定されます。

これが私の.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="ReportPrototype.jrxml" pageWidth="595" pageHeight="842" columnWidth="495" leftMargin="57" rightMargin="43" topMargin="43" bottomMargin="43" uuid="10825c57-f953-4166-bf03-8ecabe8a8f47">
<property name="ireport.zoom" value="0.75"/>
<property name="ireport.x" value="0"/>
<property name="ireport.y" value="232"/>
<subDataset name="ChartData" uuid="fc9ec0af-3e1a-40a7-8eb4-9ad30a266dee">
    <field name="chartData.xAxis" class="java.lang.String"/>
</subDataset>
<queryString language="SQL">
    <![CDATA[]]>
</queryString>
<field name="title" class="java.lang.String"/>
<field name="logoLocation" class="java.lang.String"/>
<field name="picLocation" class="java.lang.String"/>
<field name="chartData.xAxis" class="java.lang.String"/>
<detail>
    <band height="740" splitType="Stretch">
        <textField isStretchWithOverflow="true" pattern="">
            <reportElement uuid="519c6bb5-72f9-4c25-8e91-47865ae0c9df" mode="Opaque" x="39" y="75" width="378" height="45" forecolor="#000099"/>
            <textElement textAlignment="Center" verticalAlignment="Middle" markup="html">
                <font size="26"/>
            </textElement>
            <textFieldExpression><![CDATA[$F{title}]]></textFieldExpression>
        </textField>
        <image onErrorType="Icon">
            <reportElement uuid="3759a707-32a4-49ef-a9c6-b0ad7136f738" x="216" y="264" width="279" height="246"/>
            <imageExpression><![CDATA[$F{picLocation}]]></imageExpression>
        </image>
        <image onErrorType="Icon">
            <reportElement uuid="f989f871-32ea-4f13-ae3f-3f487cde76dd" x="295" y="0" width="200" height="42"/>
            <imageExpression><![CDATA[$F{logoLocation}]]></imageExpression>
        </image>
        <xyLineChart>
            <chart>
                <reportElement uuid="ae87fc13-b92e-4a2a-b218-d395343f6028" x="0" y="537" width="495" height="203"/>
                <chartTitle/>
                <chartSubtitle/>
                <chartLegend/>
            </chart>
            <xyDataset>
                <dataset>
                    <datasetRun subDataset="ChartData" uuid="de7fb84d-17ea-4e5e-82bf-2015e72e4982">
                        <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.JRBeanCollectionDataSource($F{chartData.xAxis})]]></dataSourceExpression>
                    </datasetRun>
                </dataset>
            </xyDataset>
            <linePlot>
                <plot/>
            </linePlot>
        </xyLineChart>
    </band>
</detail>
<pageFooter>
    <band height="16">
        <break>
            <reportElement uuid="0d30dea4-a6af-4e41-b7be-c288f3188dbf" x="0" y="11" width="100" height="1"/>
        </break>
    </band>
</pageFooter>

私 が試し
iReportsで:_ _ _ _ _
_ _ _ chartData.xAxisおよびchartData.yAxisへ-Field の下のフィールドを使用するだけ -ChartData の下のフィールドを使用するだけ - Fields


すべて私にエラーを与えます。私が間違っていることはありますか?

追加の質問:
-現状では、私のグラフは xAxis データ ポイントのみを生成する可能性があります。1 つのArrayListの内容をX 軸に使用し、別の ArrayList を Y 軸に使用するにはどうすればよいですか? つまり、ChartDataオブジェクトのxAxisフィールドとyAxisフィールドです。- main の前に宣言した randomData () メソッドは、 staticと宣言するまで実行されません。なぜですか?

編集
私の質問をより明確に述べるには: この問題を解決するために、フィールドに名前を付け、データソースをセットアップし、データセットを構成するにはどうすればよいですか?
コメントにリストされているチュートリアルに従っています(ハイパーリンクではないことをお詫びします。新しいユーザーとして、すでにすべてのハイパーリンクを使用しています)、必要に応じて変更を加えていますが、彼のデータ構造は私のものよりも単純ですjasper レポートでより複雑なオブジェクトとデータセットを処理する方法を学びたいと思います。

4

1 に答える 1

17

.jrxml では、グラフのデータ ソースは次のように定義されています。

<![CDATA[new net.sf.jasperreports.engine.JRBeanCollectionDataSource($F{chartData.xAxis})]]>

これは、詳細ペインの [接続/データソース エクスプレッション]で[データソース式を使用] を選択したときの iReports 4.7.0 オートフィルから取得されます。iReports のデフォルトの式は次のとおりです。

 new net.sf.jasperreports.engine.JREmptyDataSource(1)

しかし、.dataが欠落しているため、この式は間違っています。それは読むべきです:

 new net.sf.jasperreports.engine.data.JREmptyDataSource(1)

そして、もちろん JREmptyDataSource(1)JRBeanCollectionDataSource($F{chartData})に 変更しました

これにより、コンパイル時のエラーが修正され、ChartDataオブジェクトのList内のデータ ポイントのペアに簡単にアクセスできるように、List と POJO を再編成および再定義する必要がありました。基本的にこれは、double の 2 つのリスト (X 軸に 1 つ、Y 軸に 1 つ) を持つ単一の ChartData オブジェクトの代わりに、それぞれ 1 つの XY ポイントを持つ ChartData オブジェクトのリストを持つことを意味します。これは今のところうまくいくようです。

于 2012-09-24T11:25:00.667 に答える