ZetCode

JasperReports XChart

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

在本文中,我们将展示如何使用 XChart 库创建蜡烛图并将其添加到 Jasper 报告中。

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

XChart 是一个轻量级的 Java 数据绘图库。

JasperReports XChart 示例

在以下示例中,我们使用 XChart 创建蜡烛图,并通过 <image> 标签将其添加到报告中。

report.gvy
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE jasperReport PUBLIC "//JasperReports//DTD Report Design//EN"
        "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">

<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" topMargin="10" bottomMargin="10">

    <summary>
        <band height="800">

            <image>
                <reportElement x="0" y="0" width="550" height="350"/>
                <imageExpression>
                    <![CDATA["candlestick.png"]]>
                </imageExpression>
            </image>

        </band>
    </summary>

</jasperReport>

imageExpression 中,我们添加了生成的 PNG 图像。

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')
@Grab(group='org.knowm.xchart', module='xchart', version='3.8.4')

import net.sf.jasperreports.engine.JasperCompileManager
import net.sf.jasperreports.engine.JasperFillManager
import net.sf.jasperreports.engine.JasperExportManager
import net.sf.jasperreports.engine.JREmptyDataSource

import java.text.DateFormat
import java.text.SimpleDateFormat
import org.knowm.xchart.OHLCChartBuilder
import org.knowm.xchart.BitmapEncoder
import org.knowm.xchart.BitmapEncoder.BitmapFormat
import org.knowm.xchart.style.Styler
import org.knowm.xchart.style.Styler.ChartTheme

def getChart() {

    def chart = new OHLCChartBuilder().width(450).height(400)
        .title("My Chart").theme(ChartTheme.GGPlot2).build()

    chart.getStyler().setLegendPosition(Styler.LegendPosition.OutsideS)
    chart.getStyler().setLegendLayout(Styler.LegendLayout.Horizontal)

    DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd")

    def xData = [sdf.parse("2017-01-01"), sdf.parse("2017-01-02"), sdf.parse("2017-01-03"), sdf.parse("2017-01-04"),
        sdf.parse("2017-01-05"), sdf.parse("2017-01-06"), sdf.parse("2017-01-07"), sdf.parse("2017-01-08"), 
        sdf.parse("2017-01-09"), sdf.parse("2017-01-10"), sdf.parse("2017-01-11"), sdf.parse("2017-01-12"), 
        sdf.parse("2017-01-13"), sdf.parse("2017-01-14"), sdf.parse("2017-01-15"), sdf.parse("2017-01-16"),
        sdf.parse("2017-01-17"), sdf.parse("2017-01-18"), sdf.parse("2017-01-19"), sdf.parse("2017-01-20")]
    def openData = [5000.0, 4757.2473929793405, 4937.933153377687, 4850.117798755733, 4680.445170834381, 
        4728.6033945787485, 4639.04671671885, 4530.096339147777, 4315.229765115681, 4388.220975399254,
        4489.697288087602, 4732.2132126939905, 4702.3966247309845, 4791.640117313282, 4901.38575875206, 
        5125.005575124998, 5339.946396170943, 5514.203125103359, 5605.7120913762365, 5658.4641692460655 ]
    def highData = [5011.625115831823, 5015.598840107868, 5004.555292655227, 4946.208284989638, 4800.7266299680105, 
        4733.951285736023, 4682.965749348238, 4593.042839842684, 4477.12221217068, 4503.283591544297, 
        4746.430219157109, 4814.011792774473, 4847.995393440874, 4904.50276031226, 5200.3865578332025, 
        5426.345431443595, 5516.270559972647, 5646.1703261538005, 5732.382218841784, 5694.726095511361]
    def lowData = [4756.08711241483, 4713.0075280141755, 4815.154612252833, 4613.815119457544, 4676.900203675839, 
        4548.156136279956, 4474.001485725063, 4306.370773477324, 4287.219701792791, 4348.675798536698, 
        4413.906124958164, 4657.285803043788, 4624.954232028435, 4787.258755266257, 4852.463837292509, 
        5101.189240790134, 5258.967294465301, 5505.353185225293, 5542.616442576277, 5429.70901528972]
    def closeData = [4757.2473929793405, 4937.933153377687, 4850.117798755733, 4680.445170834381, 4728.6033945787485, 
        4639.04671671885, 4530.096339147777, 4315.229765115681, 4388.220975399254, 4489.697288087602, 
        4732.2132126939905, 4702.3966247309845, 4791.640117313282, 4901.38575875206, 5125.005575124998, 
        5339.946396170943, 5514.203125103359, 5605.7120913762365, 5658.4641692460655, 5468.595045517461]

    chart.addSeries("Values", xData, openData, highData, lowData, closeData)
    return chart
}

def chart = getChart()
BitmapEncoder.saveBitmap(chart, "candlestick", BitmapFormat.PNG)

// Generate report

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

def params = [:]
def jrPrint = JasperFillManager.fillReport(jrReport, params, 
    new JREmptyDataSource())

JasperExportManager.exportReportToPdfFile(jrPrint, 'report.pdf')

我们通过编程方式使用 XChart 生成图像,并将图表导出为 PNG 文件。

@Grab(group='org.knowm.xchart', module='xchart', version='3.8.4')

我们包含了 xchart 库。

import org.knowm.xchart.OHLCChartBuilder
import org.knowm.xchart.BitmapEncoder
import org.knowm.xchart.BitmapEncoder.BitmapFormat
import org.knowm.xchart.style.Styler
import org.knowm.xchart.style.Styler.ChartTheme

这些是生成图表所需的类。

def chart = new OHLCChartBuilder().width(450).height(400)
    .title("My Chart").theme(ChartTheme.GGPlot2).build()

我们使用 OHLCChartBuilder 构建蜡烛图。我们设置图表的宽度、高度、标题和主题。

chart.getStyler().setLegendPosition(Styler.LegendPosition.OutsideS)
chart.getStyler().setLegendLayout(Styler.LegendLayout.Horizontal)

我们使用 Styler 设置图例的位置和布局。

def xData = [sdf.parse("2017-01-01"), sdf.parse("2017-01-02"), sdf.parse("2017-01-03"), sdf.parse("2017-01-04"),
    sdf.parse("2017-01-05"), sdf.parse("2017-01-06"), sdf.parse("2017-01-07"), sdf.parse("2017-01-08"), 
    sdf.parse("2017-01-09"), sdf.parse("2017-01-10"), sdf.parse("2017-01-11"), sdf.parse("2017-01-12"), 
    sdf.parse("2017-01-13"), sdf.parse("2017-01-14"), sdf.parse("2017-01-15"), sdf.parse("2017-01-16"),
    sdf.parse("2017-01-17"), sdf.parse("2017-01-18"), sdf.parse("2017-01-19"), sdf.parse("2017-01-20")]
def openData = [5000.0, 4757.2473929793405, 4937.933153377687, 4850.117798755733, 4680.445170834381, 
    4728.6033945787485, 4639.04671671885, 4530.096339147777, 4315.229765115681, 4388.220975399254,
    4489.697288087602, 4732.2132126939905, 4702.3966247309845, 4791.640117313282, 4901.38575875206, 
    5125.005575124998, 5339.946396170943, 5514.203125103359, 5605.7120913762365, 5658.4641692460655 ]
def highData = [5011.625115831823, 5015.598840107868, 5004.555292655227, 4946.208284989638, 4800.7266299680105, 
    4733.951285736023, 4682.965749348238, 4593.042839842684, 4477.12221217068, 4503.283591544297, 
...

我们定义了图表中显示的数据。这些值存储在列表中。

chart.addSeries("Values", xData, openData, highData, lowData, closeData)

我们使用 addSeries 将数据添加到图表对象中。

BitmapEncoder.saveBitmap(chart, "candlestick", BitmapFormat.PNG)

最后,我们使用 BitmapEncoder.saveBitmap 将图表导出为 PNG 图像。

在本文中,我们使用 XChart 库生成了蜡烛图并将其添加到 Jasper 报告中。

作者

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

列出 所有 JasperReports 教程