【问题标题】:JasperReport Pie Chart ExampleJasperReport 饼图示例
【发布时间】:2011-11-10 17:00:48
【问题描述】:

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

这将包括用于在饼图中标记切片、设置其颜色以及定义其权重/值(切片大小)的参数。所以,在我的 Java 代码中,我会写 something 比如:

HashMap<String,Object> jrParams = new HashMap<String,Object>();

jpParams.put("slice_1_label", "Red Team");
jpParams.put("slice_1_color", Color.RED);
jpParams.put("slice_1_value", 67.0);
jpParams.put("slice_2_label", "Blue Team");
jpParams.put("slice_2_color", Color.BLUE);
jpParams.put("slice_2_value", 33.0);

// ... some other code

JasperFillManager.fillReport(jasperDesign, jrParams);

我在这里试图实现的目标是制作一个包含 2 个切片的饼图;红色的“红队”切片占馅饼的 67%,蓝色的“蓝队”切片占 33%。

我现在需要帮助在我的 hashmap 和 JRXML/JasperDesign 之间“连接点”。

有人可以告诉我(或只是帮助指导我)我需要编写什么样的&lt;pieChart&gt;JRXML 才能让我的jrParam 哈希图用运行时参数填充饼图?我在下面做了最好的尝试,但我只是在努力完全理解这一切。

<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>

提前感谢任何帮助/澄清!

【问题讨论】:

    标签: java reporting jasper-reports ireport


    【解决方案1】:

    扎维,

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

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

    【讨论】:

    • Mechkov 感谢您的回复。是的,我正在使用 iReports(及其图表示例),这是我从问题中获得大部分 JRXML 的地方。我同意在大多数情况下,我希望使用 JRDataSource 填充我的报告数据,在这种情况下,使用 JRBeanDataSource。但是我只是想知道是否可以使用纯参数哈希图,如果可以,JRXML 会是什么样子。再次感谢您的回复!
    • 或者,如果您可以编辑它以提供如何编写 JRXML 以使用 JRBeanArrayDataSource,我会接受您的回答。假设我有一个 PieSlice bean,它只有 String 标签、Color 颜色和 Double 值作为其 3 个属性,以及每个属性的标准 getter/setter。然后,我在填充时将这些 PieSlices 的数组(大小 = 2 对应于我原始问题中的 2 个切片)传递给 JasperFillManager。 JRXML 现在需要是什么样子?
    • @Zharvey 我打算编写整个代码,但偶然发现了这个很棒的解释...检查一下...哦,希望它能让您了解如何使用 Map或列表数据源...如果您有更多问题,请告诉我。问候! gilbertadjin.wordpress.com/2009/08/09/…
    • 非常有趣!在我最终连接点之前的最后一个想法:所以我基本上创建了一个 PieSlice bean 的集合并将它传递给一个新的 JRBeanArrayDataSource,然后将它提供给 JasperFillManager。但是在 JRXML 的某个地方,我需要将 bean 属性映射到一个字段。您向我指出的文章指出它是根据 bean 的属性名称来执行此操作的(大写很重要,等等)。因此,具有属性 Double“值”的 PieSlice 必须同步到 JRXML 字段 $F{value},是吗?然后我假设 循环遍历数组并使用数组的每个索引中的字段,是吗?
    • 你是对的。 bean 属性映射到字段,因此如果您的 bean 中有“名称”属性,则 $F{PieSlice}.name 或只是 ${name} 检索值。提供,您的 bean 中有 getter 方法。希望这有助于进一步。
    【解决方案2】:

    看看这段代码对你有没有帮助!我使用以下代码创建了一个条形图,该代码使用 javabean 作为数据源。如果你想通过我的 jrml 我也可以提供。

    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!" );
        }
    }
    

    【讨论】:

    • 要明确的是,这仍然需要使用 iReport/JasperStudio 构建图表,但数据随后以编程方式填充。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    • 2019-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-20
    相关资源
    最近更新 更多