ZetCode

JasperReports 折线图

最后修改日期:2024 年 2 月 12 日

在本文中,我们将展示如何在 JasperReports 库中创建折线图。

JasperReports 是一个开源的报表库。它可以创建多种格式的报表,包括 PDF、HTML、XLS 或 CSV。

折线图是一种显示随时间变化的值的图表。在此图表中,绘制一系列 (x, y) 值并用线连接。

JasperReports 折线图示例

在下面的示例中,我们将一个折线图放入报告中;该图显示了随时间变化的温度。

report.xml
<?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="report" pageWidth="595" pageHeight="842" columnWidth="555"
        leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">

    <field name="id" class="java.lang.Long"/>
    <field name="date"/>
    <field name="val" class="java.lang.Double"/>

    <summary>
        <band height="450" splitType="Stretch">
            <lineChart>
                <chart evaluationTime="Report">
                    <reportElement x="20" y="20" width="540" height="400"/>
                    <chartTitle position="Top">
                        <titleExpression><![CDATA["Line chart"]]></titleExpression>
                    </chartTitle>
                    <chartSubtitle/>
                    <chartLegend/>
                </chart>
                <categoryDataset>
                    <dataset/>
                    <categorySeries>
                        <seriesExpression><![CDATA["Temperatures"]]></seriesExpression>
                        <categoryExpression><![CDATA[ $F{date} ]]></categoryExpression>
                        <valueExpression><![CDATA[ $F{val} ]]></valueExpression>
                    </categorySeries>
                </categoryDataset>
                <linePlot>
                    <plot/>
                    <categoryAxisLabelExpression><![CDATA["Date"]]></categoryAxisLabelExpression>
                    <categoryAxisFormat>
                        <axisFormat/>
                    </categoryAxisFormat>
                    <valueAxisLabelExpression><![CDATA["Temperature"]]></valueAxisLabelExpression>
                    <valueAxisFormat>
                        <axisFormat/>
                    </valueAxisFormat>
                </linePlot>
            </lineChart>
        </band>
    </summary>
</jasperReport>

折线图使用 lineChart 标签。

<field name="id" class="java.lang.Long"/>
<field name="date"/>
<field name="val" class="java.lang.Double"/>

我们有三个字段映射到数据源。在图表中,我们使用了其中两个:dateval

<chartTitle position="Top">
    <titleExpression><![CDATA["Line chart"]]></titleExpression>
</chartTitle>

图表的标题使用 chartTitle 设置。

<categoryDataset>
    <dataset/>
    <categorySeries>
        <seriesExpression><![CDATA["Temperatures"]]></seriesExpression>
        <categoryExpression><![CDATA[ $F{date} ]]></categoryExpression>
        <valueExpression><![CDATA[ $F{val} ]]></valueExpression>
    </categorySeries>
</categoryDataset>

$F{date} 用于 x 轴,$F{val} 用于 y 轴。

<linePlot>
    <plot/>
    <categoryAxisLabelExpression><![CDATA["Date"]]></categoryAxisLabelExpression>
    <categoryAxisFormat>
        <axisFormat/>
    </categoryAxisFormat>
    <valueAxisLabelExpression><![CDATA["Temperature"]]></valueAxisLabelExpression>
    <valueAxisFormat>
        <axisFormat/>
    </valueAxisFormat>
</linePlot>

linePlot 中,我们可以对图表进行一些格式化;我们为轴添加了标签。

report.gvy
package com.zetcode

@Grab(group='net.sf.jasperreports', module='jasperreports', version='6.21.0')
@Grab(group='com.github.librepdf', module='openpdf', version='1.3.39')

import net.sf.jasperreports.engine.JasperCompileManager
import net.sf.jasperreports.engine.JasperExportManager
import net.sf.jasperreports.engine.JasperFillManager
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource
import groovy.transform.Immutable

@Immutable
class Temp {
    long id;
    String date;
    double val;
}

def data = [
    new Temp(1L, "Jan 1", -7.3),
    new Temp(2L, "Jan 10", -3.4),
    new Temp(3L, "Jan 12", -5.0),
    new Temp(4L, "Jan 20", -0.9),
    new Temp(5L, "Jan 30", -2.2),
    new Temp(6L, "Feb 1", 4.8),
    new Temp(7L, "Feb 2", 5.1),
    new Temp(9L, "Feb 5", -1.9),
    new Temp(10L, "Feb 8", 0),
    new Temp(11L, "Feb 12", 2.6)
]


def xmlFile = "report.xml"
def jrReport = JasperCompileManager.compileReport(xmlFile)

def ds = new JRBeanCollectionDataSource(data)

def params = [:]
def jPrint = JasperFillManager.fillReport(jrReport, params, ds)

JasperExportManager.exportReportToPdfFile(jPrint, "report.pdf")

这是生成报表的 Groovy 代码。

def data = [
    new Temp(1L, "Jan 1", -7.3),
    new Temp(2L, "Jan 10", -3.4),
    new Temp(3L, "Jan 12", -5.0),
    new Temp(4L, "Jan 20", -0.9),
    new Temp(5L, "Jan 30", -2.2),
    new Temp(6L, "Feb 1", 4.8),
    new Temp(7L, "Feb 2", 5.1),
    new Temp(9L, "Feb 5", -1.9),
    new Temp(10L, "Feb 8", 0),
    new Temp(11L, "Feb 12", 2.6)
]

这是折线图中显示的数据。

def ds = new JRBeanCollectionDataSource(data)

我们将数据列表传递给 JRBeanCollectionDataSource

def jPrint = JasperFillManager.fillReport(jrReport, params, ds)

数据源传递给 JasperFillManager.fillReport

在本文中,我们使用 JasperReports 库创建了一个折线图。

作者

我叫 Jan Bodnar,我是一名充满热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在教授编程方面拥有十多年的经验。

列出 所有 JasperReports 教程