首页 > 解决方案 > 将报告结果分成两列

问题描述

我想将报告结果分成两列以获得输出(使用 Jasper Studio):

result row 1 result row 4

result row 2 result row 5

result row 3

根据这个主题,我将Column Count值设置为 2 并将Print Order设置为Horizo​​ntal。但在这种情况下,我得到一个输出:

result row 1 result row 2

result row 3 result row 4

result row 5

当我将打印顺序设置为Vertical时,我得到:

result row 1

result row 2

result row 3

result row 4

result row 5

只有当我设置小的页面高度时,我才能获得所需的输出。但是行数总是不同的。所以我不能硬编码那个小页面高度。有可能以某种方式计算吗?

那么如何获得所需的输出呢?

这是一个简单的 jrxml 示例:

<?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="test2" columnCount="2" printOrder="Horizontal" pageWidth="595" pageHeight="842" columnWidth="277" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="481b7288-0681-43c8-b039-9e95ef42c274">
<property name="com.jaspersoft.studio.data.defaultdataadapter" value="New Data Adapter (12)"/>
<queryString language="jsonql">
    <![CDATA[array]]>
</queryString>
<field name="result" class="java.lang.String">
    <property name="net.sf.jasperreports.jsonql.field.expression" value="result"/>
    <fieldDescription><![CDATA[result]]></fieldDescription>
</field>
<columnHeader>
    <band height="61" splitType="Stretch">
        <staticText>
            <reportElement x="29" y="0" width="100" height="30" uuid="2d1cbfb0-be49-4f6e-8cd2-1e641ae6e21b">
                <property name="com.jaspersoft.studio.spreadsheet.connectionID" value="c95f114a-b4bc-439b-aff0-23268822dc5d"/>
            </reportElement>
            <text><![CDATA[result]]></text>
        </staticText>
    </band>
</columnHeader>
<detail>
    <band height="125" splitType="Stretch">
        <textField>
            <reportElement x="29" y="10" width="100" height="30" uuid="e9e3c344-22bd-4614-9adf-8bbd7a69bf96">
                <property name="com.jaspersoft.studio.spreadsheet.connectionID" value="c95f114a-b4bc-439b-aff0-23268822dc5d"/>
            </reportElement>
            <textFieldExpression><![CDATA[$F{result}]]></textFieldExpression>
        </textField>
    </band>
</detail>
</jasperReport>

本示例中使用了 JSON 数据适配器。以下是数据适配器 json 文件的内容: {"array": [ { "ind": 1, "result": "row 1" }, { "ind": 2, "result": "row 2" }, {“ind”:3,“结果”:“第 3 行”},{“ind”:4,“结果”:“第 4 行”},{“ind”:5,“结果”:“第 5 行”} ] }

UPD:我找到了解决方案。我将报表分为 2 个子报表:一个子报表是左栏,另一个是右栏。在这些子报告中,我检查$V{REPORT_COUNT}并将其与numberOfRecords/2inprintWhenExpression进行比较,以将结果分为两部分。

标签: jasper-reports

解决方案


如果您在数据集中有计数,这是如何做到这一点的示例。另请注意,它仅在报告以单页结尾时才有效 -

<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Jaspersoft Studio version 6.15.0.final using JasperReports Library version 6.15.0-dd49bfb94918336b8321d5507193f0169ead4e95  -->
<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="test2" columnCount="2" pageWidth="595" pageHeight="842" columnWidth="277" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="481b7288-0681-43c8-b039-9e95ef42c274">
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="SampleDB"/>
    <property name="com.jaspersoft.studio.data.sql.tables" value=""/>
    <property name="com.jaspersoft.studio.unit." value="pixel"/>
    <property name="com.jaspersoft.studio.unit.pageHeight" value="pixel"/>
    <property name="com.jaspersoft.studio.unit.pageWidth" value="pixel"/>
    <property name="com.jaspersoft.studio.unit.topMargin" value="pixel"/>
    <property name="com.jaspersoft.studio.unit.bottomMargin" value="pixel"/>
    <property name="com.jaspersoft.studio.unit.leftMargin" value="pixel"/>
    <property name="com.jaspersoft.studio.unit.rightMargin" value="pixel"/>
    <property name="com.jaspersoft.studio.unit.columnWidth" value="pixel"/>
    <property name="com.jaspersoft.studio.unit.columnSpacing" value="pixel"/>
    <queryString>
        <![CDATA[select result, count
from sampletable]]>
    </queryString>
    <field name="result" class="java.lang.Long">
        <property name="com.jaspersoft.studio.field.name" value="result"/>
        <property name="com.jaspersoft.studio.field.label" value="result"/>
        <property name="com.jaspersoft.studio.field.tree.path" value="sampletable"/>
    </field>
    <field name="count" class="java.lang.Integer">
        <property name="com.jaspersoft.studio.field.name" value="count"/>
        <property name="com.jaspersoft.studio.field.label" value="count"/>
    </field>
    <group name="Group1" isStartNewColumn="true">
        <groupExpression><![CDATA[$F{count}%2 == 0 ? ($V{REPORT_COUNT}  <= $F{count}/2) : (($V{REPORT_COUNT} - 1) <= $F{count}/2)]]></groupExpression>
    </group>
    <columnHeader>
        <band height="49" splitType="Stretch">
            <staticText>
                <reportElement x="29" y="0" width="100" height="30" uuid="2d1cbfb0-be49-4f6e-8cd2-1e641ae6e21b">
                    <property name="com.jaspersoft.studio.spreadsheet.connectionID" value="c95f114a-b4bc-439b-aff0-23268822dc5d"/>
                </reportElement>
                <text><![CDATA[result]]></text>
            </staticText>
        </band>
    </columnHeader>
    <detail>
        <band height="48" splitType="Stretch">
            <textField>
                <reportElement x="29" y="10" width="100" height="30" uuid="e9e3c344-22bd-4614-9adf-8bbd7a69bf96">
                    <property name="com.jaspersoft.studio.spreadsheet.connectionID" value="c95f114a-b4bc-439b-aff0-23268822dc5d"/>
                </reportElement>
                <textFieldExpression><![CDATA[$F{result}]]></textFieldExpression>
            </textField>
        </band>
    </detail>
</jasperReport>

以下是更改 -

  1. 将计数添加到结果(这里我在查询中使用带有计数的数据库数据集,但您可以执行任何其他操作,只要您可以获得要在报告中使用的总计数) -

在此处输入图像描述

  1. 现在,编辑报告格式以添加 2 列并将打印顺序保持为垂直 -

在此处输入图像描述

  1. group expression然后,使用as -在报表中创建一个组$F{count}%2 == 0 ? ($V{REPORT_COUNT} <= $F{count}/2) : (($V{REPORT_COUNT} - 1) <= $F{count}/2),这$F{count}是数据集中的总记录数,并且$V{REPORT_COUNT}是用于获取行号的内置变量。

在此处输入图像描述

  1. 最后,Start New Column检查Group Band Properties-

在此处输入图像描述

只要它是单页,这会将行平均分为 2 列。


或者,您可以对记录进行排序(这将是一个非常复杂的排序),然后将报告页面格式设置为 2 列并将打印顺序设置为水平。


推荐阅读