jasper-reports - 将报告结果分成两列
问题描述
我想将报告结果分成两列以获得输出(使用 Jasper Studio):
result row 1
result row 4
result row 2
result row 5
result row 3
根据这个主题,我将Column Count值设置为 2 并将Print Order设置为Horizontal。但在这种情况下,我得到一个输出:
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/2
inprintWhenExpression
进行比较,以将结果分为两部分。
解决方案
如果您在数据集中有计数,这是如何做到这一点的示例。另请注意,它仅在报告以单页结尾时才有效 -
<?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>
以下是更改 -
- 将计数添加到结果(这里我在查询中使用带有计数的数据库数据集,但您可以执行任何其他操作,只要您可以获得要在报告中使用的总计数) -
- 现在,编辑报告格式以添加 2 列并将打印顺序保持为垂直 -
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}
是用于获取行号的内置变量。
- 最后,
Start New Column
检查Group Band Properties
-
只要它是单页,这会将行平均分为 2 列。
或者,您可以对记录进行排序(这将是一个非常复杂的排序),然后将报告页面格式设置为 2 列并将打印顺序设置为水平。
推荐阅读
- php - 如何检查我的 postgresql 函数是否正在运行?
- git - Git 查看签入/提交历史到分支
- mysql - 获取 mysql:"Too many connections" 尽管在 NodeJs 中使用 createPool
- javascript - 如何有效地处理 API 错误?
- android - FrameLayout 中的 ScrollView 出现问题
- spring-boot - Spingboot CORS 错误仅适用于 Multipart POST
- java - 应用程序被杀死或销毁时文件下载不完整
- html - 通过防止直接下载来保护 IOS 企业 IPA 文件
- python-3.x - 使用没有包的相对路径
- amazon-s3 - 下载电子邮件附件并上传 S3 存储桶 AWS