Реализация JasperReport JRDesign - PullRequest
3 голосов
/ 11 ноября 2011

Существует очень мало примеров JasperReport только для Java (без XML).Я пытаюсь создать простую круговую диаграмму программно (на Java) и застреваю в некоторых реализациях.

Обратите внимание: Я использую iReport Designer уже несколько дней вДля того, чтобы лучше понять сгенерированный автоматически сгенерированный JRXML, и теперь поверьте, у меня есть довольно хорошо понятная круговая диаграмма JRXML.Но мне нужна здесь чистая реализация Java, которая вообще не использует XML.Поэтому использование JRXmlLoader тоже не вариант, отчасти потому, что я просто хочу изучить Java API.

Позвольте мне начать с того, что я буду кормить круговую диаграмму из JRBeanArrayDataSource, который используетмои собственные PieSlice POJO:

public class PieSlice
{
    private String label;
    private Double value;

    public PieSlice()
    {
        this("", -1);
    }

    public PieSlice(String lbl, Double val)
    {
        setLabel(lbl);
        setValue(val);
    }

    public String getLabel()
    {
        return label;
    }

    public String getValue()
    {
        return value;
    }
}

Затем я создам фабрику для источника данных и передам ее в JasperFillManager следующим образом:

public class PieSliceFactory
{
    private static String[] slices = 
    {
        new PieSlice("Fizz", 75.0),
        new PieSlice("Buzz", 25.0);
    };

    public static getSlices()
    {
        return ArrayList.asList(slices);
    }
}

JasperReport jasperReport = JasperFillManager.fillReport(jasperDesign, new JRBeanArrayDataSource(PieSliceFactory.getSlices()));

Это должно заполнитькруговая диаграмма отчета с 2 срезами. Я борюсь с объектом JasperDesign. Обычно JRXML для поддержки этого будет выглядеть так:

<pieDataset>
    <keyExpression><![CDATA[$F{PieSlice}.label]]></keyExpression>
    <valueExpression><![CDATA[$F{PieSlice}.weight]]></valueExpression>
</pieDataset>

Таким образом, для каждой записи (бина), возвращаемой источником данных (в данном случае 2), свойство «label» этой записи подается на круговую диаграмму в качестве категории / ключа текущего среза, а «значение» этой записи подается на диаграмму в качестве значения текущего среза.

Моя проблема в том, чтоJava JasperDesign API, кажется, не поддерживает это (по крайней мере, для новичка).Я ожидаю увидеть API, способный на что-то вроде следующего:

JRDesignChart piechart = new JRDesignChart();
JRDesignChartDataset pieDataset = new JRDesignChartDataset();

JRExpression pieLabelExrepssion, pieValueExpression;
pieLabelExpression = new JRExpression(java.lang.String, "$F{PieSlice}.label");
pieValueExpression = new JRExpression(java.lang.Double, "$F{PieSlice}.value");

pieDataset.setKeyExpression(pieLabelExpression);
pieDataset.setValueExpression(pieValueExpression();

piechart.addDataset(pieDataset);

Но, к моему удивлению, JRDesignChartDataset не имеет методов / свойств для тегов <keyExpression> и <valueExpression>, присутствующих вJRXML.

Как мне это сделать? Какие JRDesign классы / методы я должен использовать для сопоставления моих PieSlice свойств (label & value) с <pieDataset> выражения ключа / значения?

Заранее спасибо за любую помощь.

1 Ответ

2 голосов
/ 11 ноября 2011

Вы близки к решению. Это может помочь, если вы думаете о JRDesignChartDataset как об абстрактном классе (на самом деле, вероятно, должен быть абстрактным классом), так как создание его экземпляра на самом деле никуда не поможет.

Каждый отдельный тип диаграммы имеет соответствующий тип набора данных, который является подклассом JRDesignChartDataset. Для круговой диаграммы вам нужно использовать JRDesignPieDataset, который имеет методы setKeyExpression() и setValueExpression(), которые вы искали.

Вы, вероятно, поймете все это, посмотрев на Javadoc, но эти методы фактически устарели. Вместо того, чтобы устанавливать выражения напрямую, вы должны создать JRDesignPieSeries и вызовите там методы, а затем добавьте это к диаграмме, используя addPieSeries()

...