【问题标题】:JasperReports: Grouping Report ElementsJasperReports:分组报告元素
【发布时间】:2011-12-05 18:58:54
【问题描述】:

我已经遇到了 2 种情况,感觉如果 JasperReports 有某种 JRDesignElementGroup,它们就可以解决。我检查了net.sf.jasperreports.engine.design. 包的高低,但找不到类似的东西,尽管我能够找到一个看起来像它的JRDesignGroup 有点完成了我正在寻找的东西为,但我不太确定。

以下是我的问题出现的情况:

(1) 将多个文本字段组合在一起:
我想要一份报告,我可以在其中打印出一堆指标的名称和值;看起来像:

Name: John Smith
Email: john.smith@example.com

我希望通过创建 1 个JRDesignElement 子类实例并将其添加到我的JasperDesign 对象中的带区来实现这一点。但是,经过仔细考虑,该设置需要 3 个单独的 JRDesignElements:2 个 JRDesignTextFields(用于度量名称和值)和 1 个 JRDesignStaticText 用于冒号(“:”)和它们之间的空格。

有没有办法将这 3 个项目附加到一个组中,然后将该组添加到一个乐队中?

(2) 对图像及其标题/说明进行分组
除了使用JRDesignImageJRDesignStaticText 元素之外,我也想做与上面相同的操作,其中图像是要显示在我的报告上的图像,静态文本将是放置在上方的标题或标题图片。

有没有办法将这 2 个项目附加到一个组中,然后将该组添加到一个乐队中?

如果是这样,任何人都可以提供 JRXML,或者更可取的是,一些 Java 示例来说明如何执行此附加操作?如果没有,解决方案/解决方法是什么?

提前致谢!

【问题讨论】:

  • 我不习惯直接使用 JR api,但是在 JRXML 文件中,您可以将以下表达式分配给文本字段: $F{name} + " : " + $F{value }.
  • 谢谢 JB!但是,TextField 的表达式(如您提供的示例)和 TextField 的文本之间有什么区别? (JRDesignTextField 有 setExpression 和 setText 方法。)
  • 好点 ;-) 我在想 JRDesignStaticText。关于图片标题/说明的任何想法?
  • 我认为你确实需要两个元素来做到这一点。

标签: java jasper-reports


【解决方案1】:

(1) 将多个文本字段组合在一起:

  • 第一个解决方案 - 使用单个 JRDesignTextField 元素
    //Detail
    band = new JRDesignBand();
    band.setHeight(40);

    textField = new JRDesignTextField();
    textField.setX(0);
    textField.setY(0);
    textField.setWidth(200);
    textField.setHeight(40);
    textField.setHorizontalAlignment(HorizontalAlignEnum.LEFT);
    textField.setStyle(normalStyle);
    textField.setMarkup(JRCommonText.MARKUP_HTML);
    expression = new JRDesignExpression();
    expression.setText("\"<b>Name:   </b>\" + $F{Name} + \"<br/><b>Email: </b>\" + $F{Email}");
    textField.setExpression(expression);
    textField.getLineBox().getLeftPen().setLineWidth(1);
    textField.getLineBox().getTopPen().setLineWidth(1);
    textField.getLineBox().getRightPen().setLineWidth(1);
    textField.getLineBox().setLeftPadding(10);
    band.addElement(textField);

    ((JRDesignSection) jasperDesign.getDetailSection()).addBand(band);
  • 第二种解决方案 - 同时使用两个 JRDesignStaticText 和两个 JRDesignTextField 元素
    //Detail
    band = new JRDesignBand();
    band.setHeight(40);

    JRDesignStaticText staticText = new JRDesignStaticText();
    staticText.setX(0);
    staticText.setY(0);
    staticText.setWidth(60);
    staticText.setHeight(20);
    staticText.setMode(ModeEnum.OPAQUE);
    staticText.setHorizontalAlignment(HorizontalAlignEnum.LEFT);
    staticText.setStyle(boldStyle);
    staticText.setText("Name: ");
    staticText.getLineBox().getLeftPen().setLineWidth(1);
    staticText.getLineBox().getTopPen().setLineWidth(1);
    staticText.getLineBox().setLeftPadding(10);
    band.addElement(staticText);

    textField = new JRDesignTextField();
    textField.setX(60);
    textField.setY(0);
    textField.setWidth(200);
    textField.setHeight(20);
    textField.setHorizontalAlignment(HorizontalAlignEnum.LEFT);
    textField.setStyle(normalStyle);
    expression = new JRDesignExpression();
    expression.setText("$F{Name}");
    textField.setExpression(expression);
    textField.getLineBox().getTopPen().setLineWidth(1);
    textField.getLineBox().getRightPen().setLineWidth(1);
    textField.getLineBox().setLeftPadding(10);
    band.addElement(textField);

    staticText = new JRDesignStaticText();
    staticText.setX(0);
    staticText.setY(20);
    staticText.setWidth(60);
    staticText.setHeight(20);
    staticText.setMode(ModeEnum.OPAQUE);
    staticText.setHorizontalAlignment(HorizontalAlignEnum.LEFT);
    staticText.setStyle(boldStyle);
    staticText.setText("Email: ");
    staticText.getLineBox().getLeftPen().setLineWidth(1);
    staticText.getLineBox().getBottomPen().setLineWidth(1);
    staticText.getLineBox().setLeftPadding(10);
    band.addElement(staticText);

    textField = new JRDesignTextField();
    textField.setStretchWithOverflow(true);
    textField.setX(60);
    textField.setY(20);
    textField.setWidth(200);
    textField.setHeight(20);
    textField.setPositionType(PositionTypeEnum.FLOAT);
    textField.setStyle(normalStyle);
    expression = new JRDesignExpression();
    expression.setText("$F{Email}");
    textField.setExpression(expression);
    textField.getLineBox().getRightPen().setLineWidth(1);
    textField.getLineBox().getBottomPen().setLineWidth(1);
    textField.getLineBox().setLeftPadding(10);
    band.addElement(textField);

    ((JRDesignSection) jasperDesign.getDetailSection()).addBand(band);

(2) 对图像及其标题/说明进行分组

使用三个 JRDesignImage 和单个 JRDesignStaticText 元素

    band = new JRDesignBand();
    band.setHeight(110);

    String imgPath1 = "\"jasperreports.png\"";
    String imgPath2 = "\"js_logo.png\"";
    int img1Width = 105;
    int img2Width = 200;
    int distance = 20;

    expression = new JRDesignExpression();
    expression.setText(imgPath1);

    JRDesignImage image = new JRDesignImage(jasperDesign);
    image.setX(0);
    image.setY(0);
    image.setWidth(img1Width);
    image.setHeight(26);
    image.setScaleImage(ScaleImageEnum.FILL_FRAME);
    image.setExpression(expression);

    band.addElement(image);

    expression = new JRDesignExpression();
    expression.setText(imgPath2);

    image = new JRDesignImage(jasperDesign);
    image.setX(distance + img1Width);
    image.setY(0);
    image.setWidth(img2Width);
    image.setHeight(87);
    image.setScaleImage(ScaleImageEnum.FILL_FRAME);
    image.setExpression(expression);

    band.addElement(image);

    expression = new JRDesignExpression();
    expression.setText(imgPath1);

    image = new JRDesignImage(jasperDesign);
    image.setX(2*distance + img1Width + img2Width);
    image.setY(0);
    image.setWidth(img1Width);
    image.setHeight(26);
    image.setScaleImage(ScaleImageEnum.FILL_FRAME);
    image.setExpression(expression);

    band.addElement(image);

    JRDesignStaticText staticText = new JRDesignStaticText();
    staticText.setX(200);
    staticText.setY(90);
    staticText.setWidth(60);
    staticText.setHeight(20);
    staticText.setMode(ModeEnum.OPAQUE);
    staticText.setHorizontalAlignment(HorizontalAlignEnum.LEFT);
    staticText.setStyle(boldStyle);
    staticText.setText("The title above images");

    band.addElement(staticText);

    ((JRDesignSection) jasperDesign.getDetailSection()).addBand(band);

【讨论】:

  • 再次感谢您提供的非常有帮助和周到的回答!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-10
  • 2013-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多