Java JasperReport饼图示例

Java JasperReport饼图示例,java,reporting,jasper-reports,ireport,Java,Reporting,Jasper Reports,Ireport,我是JasperReports的新手,我正在慢慢地通过基础知识奋斗。我不想用DB驱动的数据(通过所谓的数据源)填充饼图。我想提供在运行时从传递到JasperFillManager的Java hashmap填充饼图所需的所有信息 这将包括用于在饼图中标记切片、设置其颜色和定义其权重/值(切片大小)的参数。因此,在我的Java代码中的某个时刻,我将编写如下内容: 提前感谢您的帮助/澄清 zharvey 由于您是JasperReport的新手,我希望您使用的是iReport Designer工具。从i

我是JasperReports的新手,我正在慢慢地通过基础知识奋斗。我不想用DB驱动的数据(通过所谓的数据源)填充饼图。我想提供在运行时从传递到JasperFillManager的Java hashmap填充饼图所需的所有信息

这将包括用于在饼图中标记切片、设置其颜色和定义其权重/值(切片大小)的参数。因此,在我的Java代码中的某个时刻,我将编写如下内容:

提前感谢您的帮助/澄清

zharvey

由于您是JasperReport的新手,我希望您使用的是iReport Designer工具。从iReport设计器拥有的一个示例模板中设计一个饼图,然后尝试研究生成的JRXML。在进入iReport->Help->Samples->Charts时,您可以看到一个非常简单的示例

我给您的第二个技巧是使用JavaBeans或POJO作为数据源(仅基于您发布的代码)。我正在查看您的示例代码,其中您正在创建字符串标签、颜色和值的映射。如果您有一个普通的旧JavaBean类,将所有这三个属性作为实例变量,那将不是一件容易的事吗?这对于您的报告也很容易,因为您可以创建bean对象的集合,这些对象可以通过JRBeanDataSource轻松访问和使用。 我觉得这会让你的代码更干净,更容易维护。
问候

查看此代码是否对您有帮助!我使用下面的代码创建了一个条形图,它使用javabean作为数据源。如果你想通过我的JXML,我也可以提供

public class App{
    String cname;
    int mark;
    public void setCname(String cname){
        this.cname = cname;
    }
    public void setMark(int mark){
        this.mark = mark;
    }
    public String getCname(){
        return cname;
    }
    public int getMark(){
        return mark;
    }
    public static ArrayList<App> getDetails() {
        ArrayList<App> clist= new ArrayList<App>();
        App c1 = new App();
        c1.setCname("English");
        c1.setMark(58);
        clist.add(c1);
        c1 = new App();
        c1.setCname("Social  Studies");
        c1.setMark(68);
        clist.add(c1);
        c1 = new App();
        c1.setCname("Culture");
        c1.setMark(78);
        clist.add(c1);
        c1 = new App();
        c1.setCname("Maths");
        c1.setMark(78);
        clist.add(c1);
        c1 = new App();
        c1.setCname("Physics");
        c1.setMark(100);
        clist.add(c1);
        return(clist);
    }

    public static void main( String[] args ) {
        JasperReport jasperReport;
        JasperPrint jasperPrint;
        Map<String, Object> param = new HashMap<String, Object>();
        try {
            String sourceFileName = ".jrxml";
            jasperReport = JasperCompileManager.compileReport(sourceFileName);
            jasperPrint = JasperFillManager.fillReport(jasperReport,param,new JRBeanCollectionDataSource(getDetails()));
            JasperExportManager.exportReportToPdfFile(jasperPrint, ".pdf");
        }
        catch(Exception e){
        }
        System.out.println( "Hello World!" );
    }
}
公共类应用程序{
字符串cname;
整数标记;
public void setCname(字符串cname){
this.cname=cname;
}
公共无效设置标记(整数标记){
这个。马克=马克;
}
公共字符串getCname(){
返回cname;
}
公共int getMark(){
返回标记;
}
公共静态ArrayList getDetails(){
ArrayList clist=新的ArrayList();
应用程序c1=新应用程序();
c1.设置名称(“英语”);
c1.设定标记(58);
clist.add(c1);
c1=新应用程序();
c1.setCname(“社会研究”);
c1.设定标记(68);
clist.add(c1);
c1=新应用程序();
c1.设置名称(“文化”);
c1.设定标记(78);
clist.add(c1);
c1=新应用程序();
c1.设置名称(“数学”);
c1.设定标记(78);
clist.add(c1);
c1=新应用程序();
c1.设置名称(“物理”);
c1.设定标记(100);
clist.add(c1);
返回(clist);
}
公共静态void main(字符串[]args){
贾斯佩雷波特;
茉莉花;
Map param=new HashMap();
试一试{
字符串sourceFileName=“.jrxml”;
jasperReport=JasperCompileManager.compileReport(sourceFileName);
jasperPrint=JasperFillManager.fillReport(jasperReport,param,新的JRBeanCollectionDataSource(getDetails());
JasperExportManager.exportreporttopffile(jasperPrint,“.pdf”);
}
捕获(例外e){
}
System.out.println(“你好,世界!”);
}
}

Mechkov感谢您的回复。是的,我使用的是iReports(及其图表示例),这是我在问题中获得大部分JRXML的地方。我同意,在大多数情况下,我希望用JRDataSource(在本例中是JRBeanDataSource)填充报表数据。然而,我只是想知道是否可以使用参数的纯hashmap,如果可以,JRXML会是什么样子。再次感谢您的回复!或者,如果您可以对其进行编辑,以提供如何编写JRXML来使用JRBeanArrayDataSource,我也会接受您的答案。假设我有一个PiesiceBean,它只有3个属性,分别是stringlabel、Color-Color和Double-value,以及每个属性的标准getter/setter。然后,我在填充时向JasperFillManager传递这些切片的数组(大小=2对应于我原始问题中的2个切片)。JRXML现在应该是什么样子?@Zharvey我本来打算写完整的代码,但是偶然发现了这个很棒的解释…看看吧…哦,希望它能给你一个如何使用地图或列表数据源的想法…如果你有更多问题,请告诉我。当做非常有趣!在我最终连接这些点之前的最后一个想法是:我基本上创建了一个PieSicle bean集合,并将其传递给一个新的JRBeanArrayDataSource,然后将其提供给JasperFillManager。但是在JRXML的某个地方,我需要将bean属性映射到一个字段。你指给我看的那篇文章说它是基于bean的属性名来实现的(大写很重要,等等)。因此,属性为双“value”的PieSlice必须同步到JRXML字段$F{value},是吗?然后我假设循环遍历数组并使用数组中每个索引中的字段,是吗?你是对的。bean属性映射到字段,因此如果bean中有“name”属性,那么$F{PieSlice}.name或仅仅${name}检索该值。如果提供,您的bean中就有getter方法。希望这能进一步有所帮助。更清楚的是,这仍然需要使用iReport/JasperStudio构建图表,但数据随后会以编程方式填充。
<pieChart>
    <chart isShowLegend="true">
        <reportElement x="10" y="10" width="300" height="300"/>
        <chartTitle>
            <titleExpression><![CDATA[My First JR Pie Chart]]></titleExpression>
        </chartTitle>
    </chart>
    <pieDataset>

        <!-- Here is where I believe I need to put my two slices; not sure how -->

    </pieDataset>
    <piePlot>
        <plot backcolor="#8BA870"/>
        <itemLabel color="#000000"/>
    </piePlot>
</pieChart>
public class App{
    String cname;
    int mark;
    public void setCname(String cname){
        this.cname = cname;
    }
    public void setMark(int mark){
        this.mark = mark;
    }
    public String getCname(){
        return cname;
    }
    public int getMark(){
        return mark;
    }
    public static ArrayList<App> getDetails() {
        ArrayList<App> clist= new ArrayList<App>();
        App c1 = new App();
        c1.setCname("English");
        c1.setMark(58);
        clist.add(c1);
        c1 = new App();
        c1.setCname("Social  Studies");
        c1.setMark(68);
        clist.add(c1);
        c1 = new App();
        c1.setCname("Culture");
        c1.setMark(78);
        clist.add(c1);
        c1 = new App();
        c1.setCname("Maths");
        c1.setMark(78);
        clist.add(c1);
        c1 = new App();
        c1.setCname("Physics");
        c1.setMark(100);
        clist.add(c1);
        return(clist);
    }

    public static void main( String[] args ) {
        JasperReport jasperReport;
        JasperPrint jasperPrint;
        Map<String, Object> param = new HashMap<String, Object>();
        try {
            String sourceFileName = ".jrxml";
            jasperReport = JasperCompileManager.compileReport(sourceFileName);
            jasperPrint = JasperFillManager.fillReport(jasperReport,param,new JRBeanCollectionDataSource(getDetails()));
            JasperExportManager.exportReportToPdfFile(jasperPrint, ".pdf");
        }
        catch(Exception e){
        }
        System.out.println( "Hello World!" );
    }
}