Jasper reports 将报告结果分为两列

Jasper reports 将报告结果分为两列,jasper-reports,Jasper Reports,我想将报告结果分成两列以获得输出(使用Jasper Studio): 结果行1结果行4 结果行2结果行5 结果行3 根据我设置的列计数值为2,打印顺序为水平。 但在这种情况下,我得到一个输出: 结果行1结果行2 结果行3结果行4 结果行5 当我将打印顺序设置为垂直时,我得到: 结果行1 结果行2 结果行3 结果行4 结果行5 只有当我设置了小的页面高度,我才能得到所需的输出。但行数总是不同的。所以我不能硬编码那个小的页面高度。有没有可能以某种方式计算出来 那么,如何获得所需的输出呢 下面是一个简

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

结果行1
结果行4

结果行2
结果行5

结果行3

根据我设置的列计数值为2,打印顺序为水平。 但在这种情况下,我得到一个输出:

结果行1
结果行2

结果行3
结果行4

结果行5

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

结果行1

结果行2

结果行3

结果行4

结果行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文件的内容: {“数组”:[ { “ind”:1, “结果”:“第1行” }, { “ind”:2, “结果”:“第2行” }, { “ind”:3, “结果”:“第3行” }, { “ind”:4, “结果”:“第4行” }, { “ind”:5, “结果”:“第5行” } ] }


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

下面是一个示例,说明如果在数据集中有COUNT,如何执行此操作。还要注意的是,只有在报告以单页结尾时,它才会起作用-

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

以下是变化-

  • 将计数添加到结果中(在这里,我在查询中使用带有计数的数据库数据集,但您可以执行任何其他操作,只要您可以获得要在报告中使用的总计数)-
  • 现在,编辑报告格式以添加两列,并保持垂直打印顺序-

  • 然后,在报告中创建一个组,组表达式为-
    $F{count}%2==0?($V{REPORT_COUNT}这里是一个示例,说明了如果在数据集中有COUNT,如何执行此操作。还请注意,只有当报表在单个页面中结束时,此操作才有效-

    <?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>
    
    
    
    以下是变化-

  • 将计数添加到结果中(在这里,我在查询中使用带有计数的数据库数据集,但您可以执行任何其他操作,只要您可以获得要在报告中使用的总计数)-
  • 现在,编辑报告格式以添加两列,并保持垂直打印顺序-

  • 然后,在报告中使用
    组表达式创建一个组,作为-
    $F{count}%2==0($V{report\u count}您能提供一个最小的jrxml来重现这个问题吗?在您想要的输出中,您提到的第4行应该从第二列开始,这意味着前3行应该垂直打印,然后从第二列开始,这应该发生在任意数量的列上?这一假设是,在转到nex之前应该打印3行组t列是否正确?是的,但可能有任意数量的行。超过5行。我知道您希望您的报告最多处理6条记录。但是当记录超过6条时,第7条记录将显示在哪里?在记录
    结果行5
    下的第1列中?当有7条记录时,第一列将为1,2,3,4,第二列为5,6,7。您能支持吗提供一个最小的jrxml来重现这个问题?在您想要的输出中,您提到的第4行应该从第二列开始,这意味着前3行应该垂直打印,然后从第二列开始,这应该发生在任意数量的列上?这一假设是,在转到下一列之前应该打印3行的组是否正确?是的,但可能有任意数量的行。超过5行。我知道您希望报告最多处理6条记录。但是当记录超过6条时,第7条记录将显示在哪里?在记录
    结果行5
    下的第1列中?当有7条记录时,第一列将是1,2,3,4,第二列是5,6,7。不幸的是,我的报告不总是适合一页。所以我自己用两个子报告找到了解决方案。但是感谢您的帮助!不幸的是,我的报告不总是适合一页。所以我自己用两个子报告找到了解决方案。但是感谢您的帮助!