Jasper reports 如何合并同一列中的单元格,应用rowspan?

Jasper reports 如何合并同一列中的单元格,应用rowspan?,jasper-reports,Jasper Reports,在我的报告的jrxml设计中,我的详细信息部分有一个列,它为特定的组打印相同的内容。例如,如果我有一个国家列USA,下一列包含它的州。美国国家对每个条目重复。所以我需要合并具有美国价值的国家单元。我需要合并列中所有具有相同值的单元格,并应将其显示为单个单元格,并且应将其文本垂直和水平居中对齐。有谁能帮助我如何使用jrxml实现这一点 一切都在细节地带 我正在努力得到一份如下图所示的报告 更新: 从Peter的回答中,我有一个疑问,如果我的xml是这样的: <report>

在我的报告的jrxml设计中,我的详细信息部分有一个列,它为特定的组打印相同的内容。例如,如果我有一个国家列USA,下一列包含它的州。美国国家对每个条目重复。所以我需要合并具有美国价值的国家单元。我需要合并列中所有具有相同值的单元格,并应将其显示为单个单元格,并且应将其文本垂直和水平居中对齐。有谁能帮助我如何使用jrxml实现这一点

一切都在细节地带

我正在努力得到一份如下图所示的报告


更新:

从Peter的回答中,我有一个疑问,如果我的xml是这样的:

<report>
   <row1>
    <country>INDIA</country>
    <state>Haryana</state>
   </row1>
   <row2>
    <country>INDIA</country>
    <state>Punjab</state>
   </row2>
   <row3>
     <country>INDIA</country>
     <state>Maharashtra</state>
   </row3>
</report>

印度
哈里亚纳
印度
旁遮普省
印度
马哈拉施特拉邦

如果我的xml如上所述,我如何创建报告?

通过使用
isPrintRepeatedValues=“false”
,正确设置边框(仅顶部,仅使用左侧空白单元格,将行添加到
columnFooter
),可以相当容易地实现顶部垂直对齐的文本

要实现“文本垂直居中对齐”,请为其他列使用子报表,并在行span列上设置
stretchType=“RelativeToBandHeight”

注意:在这种情况下,您需要更改数据源(主报告、国家/地区、子报告与国家/地区相关的所有状态)

编辑:注释:这不适用于详细信息栏。彼特–@Tinoy Malayil

我提供了一个文本垂直居中对齐的可运行示例:

数据源xml:

<report>
    <country>
        <name>INDIA</name>
        <states>
            <state>Haryana</state>
            <state>Punjab</state>
            <state>Maharashtra</state>
            <state>Karnataka</state>
            <state>TamilNadu</state>
        </states>
    </country>
    <country>
        <name>USA</name>
        <states>
            <state>Alabama</state>
            <state>Washington</state>
            <state>Alaska</state>
            <state>Texas</state>
        </states>
    </country>
</report>
子报告
国家/地区子报告.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="Country" pageWidth="595" pageHeight="842" whenNoDataType="AllSectionsNoDetail" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="30" bottomMargin="30" uuid="dbc44bea-4f8e-4072-9c94-8442f3093aa0">
<parameter name="SUBREPORT_DIR" class="java.lang.String" isForPrompting="false">
    <defaultValueExpression><![CDATA["C:\\fullPath\\to\\Your\\subreport\\"]]></defaultValueExpression>
</parameter>
<queryString language="xPath">
    <![CDATA[report/country]]>
</queryString>
<field name="name" class="java.lang.String">
    <fieldDescription><![CDATA[name]]></fieldDescription>
</field>
<background>
    <band/>
</background>
<columnHeader>
    <band height="20">
        <staticText>
            <reportElement x="0" y="0" width="177" height="20" uuid="d4eb7868-2f74-4713-abca-a176c47927e1"/>
            <box>
                <pen lineWidth="0.25"/>
                <topPen lineWidth="0.25"/>
                <leftPen lineWidth="0.25"/>
                <bottomPen lineWidth="0.25"/>
                <rightPen lineWidth="0.25"/>
            </box>
            <textElement textAlignment="Center" verticalAlignment="Middle"/>
            <text><![CDATA[COUNTRY]]></text>
        </staticText>
        <staticText>
            <reportElement x="177" y="0" width="200" height="20" uuid="98cbcff7-6b24-43bd-a2df-39cc07e56487"/>
            <box>
                <pen lineWidth="0.25"/>
                <topPen lineWidth="0.25"/>
                <leftPen lineWidth="0.25"/>
                <bottomPen lineWidth="0.25"/>
                <rightPen lineWidth="0.25"/>
            </box>
            <textElement textAlignment="Center" verticalAlignment="Middle"/>
            <text><![CDATA[STATE]]></text>
        </staticText>
    </band>
</columnHeader>
<detail>
    <band height="20">
        <textField>
            <reportElement stretchType="RelativeToBandHeight" x="0" y="0" width="177" height="20" uuid="1bbab3e7-f8a3-48c9-b28e-2a6d2a68b755"/>
            <box topPadding="0" leftPadding="0">
                <pen lineWidth="0.25"/>
                <topPen lineWidth="0.25"/>
                <leftPen lineWidth="0.25"/>
                <bottomPen lineWidth="0.25"/>
                <rightPen lineWidth="0.25"/>
            </box>
            <textElement textAlignment="Center" verticalAlignment="Middle"/>
            <textFieldExpression><![CDATA[$F{name}]]></textFieldExpression>
        </textField>
        <subreport>
            <reportElement x="177" y="0" width="200" height="20" uuid="6314908a-006d-4a5b-9137-a056eb205529"/>
            <dataSourceExpression><![CDATA[((net.sf.jasperreports.engine.data.JRXmlDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("/country/states/state")]]></dataSourceExpression>
            <subreportExpression><![CDATA[$P{SUBREPORT_DIR} + "country_subreport.jasper"]]></subreportExpression>
        </subreport>
    </band>
  </detail>
</jasperReport>
<?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="country_subreport" language="java" pageWidth="200" pageHeight="500" columnWidth="200" leftMargin="0" rightMargin="0" topMargin="0" bottomMargin="0" uuid="c9795fb7-39e0-4aa6-8926-2f019c4af84e">
<property name="ireport.zoom" value="1.0"/>
<property name="ireport.x" value="0"/>
<property name="ireport.y" value="0"/>
<queryString language="xPath">
    <![CDATA[/report/country/states/state]]>
</queryString>
<field name="state" class="java.lang.String">
    <fieldDescription><![CDATA[child::text()]]></fieldDescription>
</field>
<detail>
    <band height="20" splitType="Stretch">
        <textField>
            <reportElement x="0" y="0" width="200" height="20" uuid="dc0a9dda-b940-4752-ad91-31420c4ce729"/>
            <box topPadding="2" leftPadding="2">
                <pen lineWidth="0.25"/>
                <topPen lineWidth="0.25"/>
                <leftPen lineWidth="0.25"/>
                <bottomPen lineWidth="0.25"/>
                <rightPen lineWidth="0.25"/>
            </box>
            <textElement verticalAlignment="Middle"/>
            <textFieldExpression><![CDATA[$F{state}]]></textFieldExpression>
        </textField>
    </band>
</detail>


通过使用
isPrintRepeatedValues=“false”
,正确设置边框(仅顶部,仅使用左侧空白单元格,向
列页脚添加行),可以非常容易地实现顶部垂直对齐的文本

要实现“文本垂直居中对齐”
,请为其他列使用子报表,并在行span列上设置
stretchType=“RelativeToBandHeight”

注意:在这种情况下,您需要更改数据源(主报告、国家/地区、子报告与国家/地区相关的所有状态)

编辑:注释:这不适用于详细信息栏。彼特–@Tinoy Malayil

我提供了一个文本垂直居中对齐的可运行示例:

数据源xml:

<report>
    <country>
        <name>INDIA</name>
        <states>
            <state>Haryana</state>
            <state>Punjab</state>
            <state>Maharashtra</state>
            <state>Karnataka</state>
            <state>TamilNadu</state>
        </states>
    </country>
    <country>
        <name>USA</name>
        <states>
            <state>Alabama</state>
            <state>Washington</state>
            <state>Alaska</state>
            <state>Texas</state>
        </states>
    </country>
</report>
子报告
国家/地区子报告.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="Country" pageWidth="595" pageHeight="842" whenNoDataType="AllSectionsNoDetail" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="30" bottomMargin="30" uuid="dbc44bea-4f8e-4072-9c94-8442f3093aa0">
<parameter name="SUBREPORT_DIR" class="java.lang.String" isForPrompting="false">
    <defaultValueExpression><![CDATA["C:\\fullPath\\to\\Your\\subreport\\"]]></defaultValueExpression>
</parameter>
<queryString language="xPath">
    <![CDATA[report/country]]>
</queryString>
<field name="name" class="java.lang.String">
    <fieldDescription><![CDATA[name]]></fieldDescription>
</field>
<background>
    <band/>
</background>
<columnHeader>
    <band height="20">
        <staticText>
            <reportElement x="0" y="0" width="177" height="20" uuid="d4eb7868-2f74-4713-abca-a176c47927e1"/>
            <box>
                <pen lineWidth="0.25"/>
                <topPen lineWidth="0.25"/>
                <leftPen lineWidth="0.25"/>
                <bottomPen lineWidth="0.25"/>
                <rightPen lineWidth="0.25"/>
            </box>
            <textElement textAlignment="Center" verticalAlignment="Middle"/>
            <text><![CDATA[COUNTRY]]></text>
        </staticText>
        <staticText>
            <reportElement x="177" y="0" width="200" height="20" uuid="98cbcff7-6b24-43bd-a2df-39cc07e56487"/>
            <box>
                <pen lineWidth="0.25"/>
                <topPen lineWidth="0.25"/>
                <leftPen lineWidth="0.25"/>
                <bottomPen lineWidth="0.25"/>
                <rightPen lineWidth="0.25"/>
            </box>
            <textElement textAlignment="Center" verticalAlignment="Middle"/>
            <text><![CDATA[STATE]]></text>
        </staticText>
    </band>
</columnHeader>
<detail>
    <band height="20">
        <textField>
            <reportElement stretchType="RelativeToBandHeight" x="0" y="0" width="177" height="20" uuid="1bbab3e7-f8a3-48c9-b28e-2a6d2a68b755"/>
            <box topPadding="0" leftPadding="0">
                <pen lineWidth="0.25"/>
                <topPen lineWidth="0.25"/>
                <leftPen lineWidth="0.25"/>
                <bottomPen lineWidth="0.25"/>
                <rightPen lineWidth="0.25"/>
            </box>
            <textElement textAlignment="Center" verticalAlignment="Middle"/>
            <textFieldExpression><![CDATA[$F{name}]]></textFieldExpression>
        </textField>
        <subreport>
            <reportElement x="177" y="0" width="200" height="20" uuid="6314908a-006d-4a5b-9137-a056eb205529"/>
            <dataSourceExpression><![CDATA[((net.sf.jasperreports.engine.data.JRXmlDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("/country/states/state")]]></dataSourceExpression>
            <subreportExpression><![CDATA[$P{SUBREPORT_DIR} + "country_subreport.jasper"]]></subreportExpression>
        </subreport>
    </band>
  </detail>
</jasperReport>
<?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="country_subreport" language="java" pageWidth="200" pageHeight="500" columnWidth="200" leftMargin="0" rightMargin="0" topMargin="0" bottomMargin="0" uuid="c9795fb7-39e0-4aa6-8926-2f019c4af84e">
<property name="ireport.zoom" value="1.0"/>
<property name="ireport.x" value="0"/>
<property name="ireport.y" value="0"/>
<queryString language="xPath">
    <![CDATA[/report/country/states/state]]>
</queryString>
<field name="state" class="java.lang.String">
    <fieldDescription><![CDATA[child::text()]]></fieldDescription>
</field>
<detail>
    <band height="20" splitType="Stretch">
        <textField>
            <reportElement x="0" y="0" width="200" height="20" uuid="dc0a9dda-b940-4752-ad91-31420c4ce729"/>
            <box topPadding="2" leftPadding="2">
                <pen lineWidth="0.25"/>
                <topPen lineWidth="0.25"/>
                <leftPen lineWidth="0.25"/>
                <bottomPen lineWidth="0.25"/>
                <rightPen lineWidth="0.25"/>
            </box>
            <textElement verticalAlignment="Middle"/>
            <textFieldExpression><![CDATA[$F{state}]]></textFieldExpression>
        </textField>
    </band>
</detail>



分组用于按行向右分组。如何与列一起使用?您是使用jr:table组件还是直接在详细信息栏中使用。。你能传递一些相关的jrxml,屏幕截图和期望的结果电流输出。我直接在细节波段工作。是否有任何控件可以显示印度、美国等国家/地区值的合并单元格。请检查更新后的帖子。我已包括一个示例,带有屏幕截图。。。如果文本在顶部垂直对齐,您可以很容易地实现,如果您需要文本在中心垂直对齐,您需要使用子报表并构建数据源,如下面的示例所示。我建议您为新编辑创建另一个问题,但我想说,您不能在此xml上创建数据源,因为第1行更改为第2行(我们无法定义任何提供所有行的XPath)…您需要用java详细说明xml,并将其转换为有用的内容。分组用于按行向右分组。如何与列一起使用?您是使用jr:table组件还是直接在细节栏中工作..您可以传递一些相关的jrxml、屏幕截图和所需结果的当前输出。我直接在细节栏中工作。有吗任何显示国家值(如印度、美国)合并单元格的控件。请检查更新后的帖子。我提供了一个示例,带有屏幕截图…如果文本在顶部垂直对齐,您可以非常容易地实现,如果您需要文本在中心垂直对齐,您需要使用子报表并按照下面的示例构造数据源。I建议您为新编辑创建另一个问题,但我要说的是,您不能在此xml上创建数据源,因为第1行更改为第2行(我们不能定义任何提供所有行的XPath)…您需要用java详细说明xml,并将其转换为有用的内容。感谢您的回答。这非常有用。使用子报告我可以实现目标。嗨,Peter,我有另一个疑问。如果您的xml输入像:
印度哈里亚纳邦旁遮普马哈拉施特拉邦ataka TamilNadu USA阿拉巴马州华盛顿州阿拉斯加州德克萨斯州
@TinoyMalayil我在问题下评论说,xml没有用处(行标记从第1行更改为第2行)…您需要解析它,并将其转换为对jasper report有用的内容…@PetterFriberg嗨,Peter,您知道使用表格组件可以实现这一点吗?谢谢什么是左侧单元格高于右侧单元格?如何垂直拉伸子报表?谢谢您的回答。这非常有用。使用子报表我可以实现objective.Hi Peter我还有另一个疑问。如果您的xml输入像:
INDIA Haryana Punjab Maharashtra Karnataka Tami