Почему я получаю несколько графиков вместо одного графика с сериями? - PullRequest
2 голосов
/ 31 октября 2019

После ответа отсюда: Как создать несколько диаграмм одного типа, но с разными базами данных, используя JRBeanCollectionDatasource в Jasperreports

Мне удалось хотя бы создать диаграммы с моим вложенным списком. Мой java-объект:

public class PoolUserLoginsVO {
    private int userLogins;
    private String poolId;
    private Date date;

    //constructor + getter/setters

userLogins - это значение координаты y, диаграмма - временной ряд, поэтому координата x - это дата. poolId - это серия, к которой относятся координаты.

Я получаю список значений, которые мне нужны для каждой серии, и, поскольку существует несколько серий, у меня есть список списка, который я передаю в карту параметров в Jasper Reports.

My Jasper Reports:

Основная яшма (весь документ довольно длинный, поэтому только соответствующая часть):

<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Jaspersoft Studio version 6.10.0.final using JasperReports Library version 6.10.0-unknown  -->
<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="test" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="fbaeab5e-6793-456e-9567-e0c5af982904">
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="One Empty Record"/>
    <parameter name="poolLogins" class="java.util.List"/>
    <queryString>
        <![CDATA[]]>
    </queryString>
    <background>
        <band splitType="Stretch"/>
    </background>
    <detail>
        <band height="223">
            <subreport>
                <reportElement x="0" y="0" width="550" height="200" uuid="9f8a2d4a-1d90-4f88-a08c-1ea2604360c5"/>
                <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{poolLogins})]]></dataSourceExpression>
                <subreportExpression><![CDATA["sub_charts.jasper"]]></subreportExpression>
            </subreport>
        </band>
    </detail>
</jasperReport>

$ P {poolLogins} - это List<List<PoolUserLoginsVO>.

sub_charts.jasper:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Jaspersoft Studio version 6.10.0.final using JasperReports Library version 6.10.0-unknown  -->
<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="sub_charts" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="bc8c76ba-0b85-4522-bf67-4c62ae87202b">
    <field name="_THIS" class="java.util.List">
        <fieldDescription><![CDATA[_THIS]]></fieldDescription>
    </field>
    <detail>
        <band height="237" splitType="Stretch">
            <subreport>
                <reportElement x="0" y="20" width="540" height="200" uuid="1ec1f733-ffee-46f3-859c-f774e5277d19"/>
                <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{_THIS})]]></dataSourceExpression>
                <subreportExpression><![CDATA["sub_chart.jasper"]]></subreportExpression>
            </subreport>
        </band>
    </detail>
</jasperReport>

sub_chart.jasper:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Jaspersoft Studio version 6.10.0.final using JasperReports Library version 6.10.0-unknown  -->
<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="sub_chart" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="4ce41625-c60b-4759-acbe-5fe12a013fb2">
    <queryString>
        <![CDATA[]]>
    </queryString>
    <field name="userLogins" class="java.lang.Integer"/>
    <field name="poolId" class="java.lang.String"/>
    <field name="date" class="java.util.Date"/>
    <background>
        <band splitType="Stretch"/>
    </background>
    <detail>
        <band height="210" splitType="Stretch">
            <timeSeriesChart>
                <chart evaluationTime="Report">
                    <reportElement x="0" y="20" width="540" height="180" uuid="874eee5e-1e71-4870-906b-ef71ef91d274"/>
                    <chartTitle/>
                    <chartSubtitle/>
                    <chartLegend/>
                </chart>
                <timeSeriesDataset>
                    <timeSeries>
                        <seriesExpression><![CDATA[$F{poolId}]]></seriesExpression>
                        <timePeriodExpression><![CDATA[$F{date}]]></timePeriodExpression>
                        <valueExpression><![CDATA[$F{userLogins}.intValue()]]></valueExpression>
                    </timeSeries>
                </timeSeriesDataset>
                <timeSeriesPlot>
                    <plot/>
                    <timeAxisFormat>
                        <axisFormat labelColor="#000000" tickLabelColor="#000000" axisLineColor="#000000"/>
                    </timeAxisFormat>
                    <valueAxisFormat>
                        <axisFormat labelColor="#000000" tickLabelColor="#000000" axisLineColor="#000000"/>
                    </valueAxisFormat>
                </timeSeriesPlot>
            </timeSeriesChart>
        </band>
    </detail>
</jasperReport>

PDF и диаграммы успешно сгенерированы. Но есть две проблемы:

1) Я получаю около 30 страниц графиков, хотя их всего 4 серии. Каждая серия дублируется ровно 30 раз (количество координат в каждой серии). Сгенерированные диаграммы все правильно, хотя.

2) Мне не нужны отдельные графики. Я хочу, чтобы все серии были в одном графике разных цветов.

Что я здесь не так делаю?

Редактировать:

Main:

public class testmain {
    public static void main(String[] args) {
        int threshold = 30;
        List<List<PoolUserLoginsVO>> poolLogins = new ArrayList<>();
        List<PoolUserLoginsVO> userLogins = new ArrayList<>();
        for (int i = 0; i < threshold; ++i) {
            LocalDate localDate = LocalDate.now().minusDays(threshold - i - 1);
            Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
            PoolUserLoginsVO logins = new PoolUserLoginsVO(i, "pool1", date);
            userLogins.add(logins);
        }
        poolLogins.add(userLogins);

        List<PoolUserLoginsVO> userLogins2 = new ArrayList<>();

        for (int i = 0; i < threshold; ++i) {
            LocalDate localDate = LocalDate.now().minusDays(threshold - i - 1);
            Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
            PoolUserLoginsVO logins = new PoolUserLoginsVO(1, "pool2", date);
            userLogins2.add(logins);
        }
        poolLogins.add(userLogins2);

        List<PoolUserLoginsVO> userLogins3 = new ArrayList<>();
        for (int i = threshold; i > 0; --i) {
            LocalDate localDate = LocalDate.now().minusDays(threshold - i - 1);
            Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
            PoolUserLoginsVO logins = new PoolUserLoginsVO(i, "pool3", date);
            userLogins3.add(logins);
        }
        poolLogins.add(userLogins3);

        JRBeanCollectionDataSource vmsJRBean = new JRBeanCollectionDataSource(poolLogins);
        Map<String, Object> parameters = new HashMap<String, Object>();
        parameters.put("poolLogins", poolLogins);

        File file = new File("report.pdf");
        try {
            FileOutputStream fop = new FileOutputStream(file);
            JasperPrint jasperPrint = JasperFillManager.fillReport("test.jasper", parameters, new JREmptyDataSource());
            JasperExportManager.exportReportToPdfStream(jasperPrint, fop);
            fop.flush();
            fop.close();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (JRException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

Ответы [ 2 ]

1 голос
/ 31 октября 2019

Вы игнорируете, что фактически делает полоса детализации в sub_chart.jasper

Полоса детализации будет перебирать ваш источник данных (запись за записью), создавая диаграмму для каждой записи иты не хочешь этого;вам нужен источник данных для вашего графика.

Мне сложно проверить вашу фактическую настройку, чтобы убедиться, что все остальное в порядке, но вполне вероятно, что вам достаточно переместить диаграмму в суммарный диапазон и затем полностью удалите полосу подробностей.

Изменение кода в вашем sub_chart.jasper:

<detail> -> <summary>

</detail> -> </summary>

0 голосов
/ 13 ноября 2019

Я наконец исправил это! Я не должен был следовать за другим вопросом / ответом, который я связал в OP. Этот вопрос, я думаю, был вопрос о том, как создать несколько графиков, и я хотел, чтобы только один график, но со всеми сериями объединены вместе. Я исправил проблему, не помещая мои данные во вложенный список. Я просто помещаю все данные в один одномерный список;поскольку каждый PoolUserLoginsVO уже содержит, к какому PoolId он принадлежит, не было никакого смысла иметь вложенный список для начала (если, я думаю, я не хотел иметь несколько диаграмм для каждого пула). Поэтому я передал один список, а затем изменил основной отчет о яшме так, чтобы он передавался прямо в sub_chart.jasper вместо sub_charts.jasper (я удалил sub_charts.jasper, поскольку он больше не нужен). Результат?

enter image description here

Успех!

...