我正在使用 Jaspersoft Studio 6 。我有这样的数据集:
sales channel, product, amount
channel a, prod a, 1
channel a, prod b, 1
channel b, prod a, 1
channel b, prod b, 1
我想生成交叉表(或任何可以执行此操作的组件),如下所示(2是您猜测的每个产品的总数)
prod a, prod b
2, 2
所以基本上没有行组的交叉表,我尝试创建一个交叉表,其中销售渠道作为行组,产品作为列组,然后删除行组,但报告不会编译。我没有为它创建专用数据集的原因是我还需要在同一报表中显示此交叉表(下图),以便为两个表使用相同的数据集,这可能吗?
prod a, prod b
channel a 1, 1
channel b 1, 1
答案 0 :(得分:1)
是的,有可能。您可以使用行组中的任何字段创建交叉表,然后更改Bucket表达式。如果在表达式中使用某个常量,则所有行都将有一个组。
之后,您可以为 0 设置 width / height 属性。 ;需要表现出来。这个技巧可以让你隐藏所有不需要的细胞。
是的,您可以将单个数据源用于样本中的两个交叉表。
我使用了 csv 数据源。
sales channel, product, amount
channel a, prod a, 1
channel a, prod b, 1
channel b, prod a, 1
channel b, prod b, 1
以下示例中此数据源的数据适配器名称为 channels.csv.xml
我使用 Studio 来设计报告模板。模板中的样式可以使报告更具吸引力。
<?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="crosstab_wout_row_group" pageWidth="595" pageHeight="842" whenNoDataType="AllSectionsNoDetail" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="5edd462e-9135-43d5-a3d2-552c8663900a">
<property name="com.jaspersoft.studio.data.defaultdataadapter" value="One Empty Record"/>
<style name="Crosstab_CH" mode="Opaque" backcolor="#F0F8FF" hTextAlign="Center" vTextAlign="Middle">
<box>
<pen lineWidth="0.5" lineColor="#000000"/>
<topPen lineWidth="0.5" lineColor="#000000"/>
<leftPen lineWidth="0.5" lineColor="#000000"/>
<bottomPen lineWidth="0.5" lineColor="#000000"/>
<rightPen lineWidth="0.5" lineColor="#000000"/>
</box>
</style>
<style name="Crosstab_CG" mode="Opaque" backcolor="#BFE1FF" hTextAlign="Center" vTextAlign="Middle">
<box>
<pen lineWidth="0.5" lineColor="#000000"/>
<topPen lineWidth="0.5" lineColor="#000000"/>
<leftPen lineWidth="0.5" lineColor="#000000"/>
<bottomPen lineWidth="0.5" lineColor="#000000"/>
<rightPen lineWidth="0.5" lineColor="#000000"/>
</box>
</style>
<style name="Crosstab_CT" mode="Opaque" backcolor="#005FB3" hTextAlign="Center" vTextAlign="Middle">
<box>
<pen lineWidth="0.5" lineColor="#000000"/>
<topPen lineWidth="0.5" lineColor="#000000"/>
<leftPen lineWidth="0.5" lineColor="#000000"/>
<bottomPen lineWidth="0.5" lineColor="#000000"/>
<rightPen lineWidth="0.5" lineColor="#000000"/>
</box>
</style>
<style name="Crosstab_CD" mode="Opaque" backcolor="#FFFFFF" hTextAlign="Center" vTextAlign="Middle">
<box>
<pen lineWidth="0.5" lineColor="#000000"/>
<topPen lineWidth="0.5" lineColor="#000000"/>
<leftPen lineWidth="0.5" lineColor="#000000"/>
<bottomPen lineWidth="0.5" lineColor="#000000"/>
<rightPen lineWidth="0.5" lineColor="#000000"/>
</box>
</style>
<subDataset name="channelsDS" uuid="ad122c55-8366-4f20-b070-a8d40614c7c5">
<property name="net.sf.jasperreports.data.adapter" value="channels.csv.xml"/>
<queryString>
<![CDATA[]]>
</queryString>
<field name="sales channel" class="java.lang.String"/>
<field name="product" class="java.lang.String"/>
<field name="amount" class="java.lang.Integer"/>
</subDataset>
<queryString>
<![CDATA[]]>
</queryString>
<title>
<band height="708">
<crosstab ignoreWidth="true">
<reportElement x="0" y="10" width="186" height="50" uuid="bad8b778-d3b7-426f-b5fe-ff15218f1df6">
<property name="com.jaspersoft.studio.layout" value="com.jaspersoft.studio.editor.layout.VerticalRowLayout"/>
</reportElement>
<crosstabDataset>
<dataset>
<datasetRun subDataset="channelsDS" uuid="fe18e49c-7b5f-4644-8821-6a5ece2305cf">
<dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRCsvDataSource("c:\\path\\chanels.csv")]]></dataSourceExpression>
</datasetRun>
</dataset>
</crosstabDataset>
<rowGroup name="all" width="0" totalPosition="End">
<bucket class="java.lang.String">
<bucketExpression><![CDATA["1"]]></bucketExpression>
</bucket>
<crosstabRowHeader>
<cellContents mode="Opaque" style="Crosstab_CH"/>
</crosstabRowHeader>
<crosstabTotalRowHeader>
<cellContents mode="Opaque" style="Crosstab_CT"/>
</crosstabTotalRowHeader>
</rowGroup>
<columnGroup name="product" height="20" totalPosition="End">
<bucket class="java.lang.String">
<bucketExpression><![CDATA[$F{product}]]></bucketExpression>
</bucket>
<crosstabColumnHeader>
<cellContents mode="Opaque" style="Crosstab_CH">
<textField>
<reportElement style="Crosstab_CH" x="0" y="0" width="60" height="20" uuid="ad62e573-acbd-4e01-a339-d4611a6593d4"/>
<textFieldExpression><![CDATA[$V{product}]]></textFieldExpression>
</textField>
</cellContents>
</crosstabColumnHeader>
<crosstabTotalColumnHeader>
<cellContents mode="Opaque" style="Crosstab_CT"/>
</crosstabTotalColumnHeader>
</columnGroup>
<measure name="sum" class="java.lang.Integer" calculation="Sum">
<measureExpression><![CDATA[$F{amount}]]></measureExpression>
</measure>
<crosstabCell width="60" height="20">
<cellContents mode="Opaque" style="Crosstab_CD">
<textField>
<reportElement style="Crosstab_CD" x="0" y="0" width="60" height="20" uuid="64c93e0c-c740-41f7-9ad2-a98f32a34f12"/>
<textFieldExpression><![CDATA[$V{sum}]]></textFieldExpression>
</textField>
</cellContents>
</crosstabCell>
<crosstabCell width="0" height="20" columnTotalGroup="product">
<cellContents mode="Opaque" style="Crosstab_CT"/>
</crosstabCell>
<crosstabCell width="60" height="0" rowTotalGroup="all">
<cellContents mode="Opaque" style="Crosstab_CT"/>
</crosstabCell>
<crosstabCell width="0" height="0" rowTotalGroup="all" columnTotalGroup="product">
<cellContents mode="Opaque" style="Crosstab_CT"/>
</crosstabCell>
</crosstab>
<crosstab ignoreWidth="true">
<reportElement x="200" y="10" width="186" height="70" uuid="371e42fa-6c78-45bc-b7c7-5efc8f97c789">
<property name="com.jaspersoft.studio.layout" value="com.jaspersoft.studio.editor.layout.VerticalRowLayout"/>
</reportElement>
<crosstabDataset>
<dataset>
<datasetRun subDataset="channelsDS" uuid="a9518e47-0662-4b8a-96bf-876220cbfe3c">
<dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRCsvDataSource("c:\\path\\chanels.csv")]]></dataSourceExpression>
</datasetRun>
</dataset>
</crosstabDataset>
<rowGroup name="channel" width="60" totalPosition="End">
<bucket class="java.lang.String">
<bucketExpression><![CDATA[$F{sales channel}]]></bucketExpression>
</bucket>
<crosstabRowHeader>
<cellContents mode="Opaque" style="Crosstab_CH">
<textField>
<reportElement key="" style="Crosstab_CH" x="0" y="0" width="60" height="20" uuid="52e76a1c-73cd-4380-a0c1-1a5a43796992"/>
<textFieldExpression><![CDATA[$V{channel}]]></textFieldExpression>
</textField>
</cellContents>
</crosstabRowHeader>
<crosstabTotalRowHeader>
<cellContents mode="Opaque" style="Crosstab_CT">
<staticText>
<reportElement style="Crosstab_CT" x="0" y="0" width="60" height="20" forecolor="#FFFFFF" uuid="d65fc01b-5f52-478e-97c5-005c50bed918"/>
<text><![CDATA[Total]]></text>
</staticText>
</cellContents>
</crosstabTotalRowHeader>
</rowGroup>
<columnGroup name="product" height="20" totalPosition="End">
<bucket class="java.lang.String">
<bucketExpression><![CDATA[$F{product}]]></bucketExpression>
</bucket>
<crosstabColumnHeader>
<cellContents mode="Opaque" style="Crosstab_CH">
<textField>
<reportElement style="Crosstab_CH" x="0" y="0" width="60" height="20" uuid="006f5601-cda6-42d1-a5c8-ce4e6c6b2ce7"/>
<textFieldExpression><![CDATA[$V{product}]]></textFieldExpression>
</textField>
</cellContents>
</crosstabColumnHeader>
<crosstabTotalColumnHeader>
<cellContents mode="Opaque" style="Crosstab_CT">
<staticText>
<reportElement style="Crosstab_CT" x="0" y="0" width="60" height="20" forecolor="#FFFFFF" uuid="cb16eb49-0945-46bc-9e6f-9a83296b8293"/>
<text><![CDATA[Total]]></text>
</staticText>
</cellContents>
</crosstabTotalColumnHeader>
</columnGroup>
<measure name="amount_MEASURE" class="java.lang.Integer" calculation="Sum">
<measureExpression><![CDATA[$F{amount}]]></measureExpression>
</measure>
<crosstabCell width="60" height="20">
<cellContents mode="Opaque" style="Crosstab_CD">
<textField>
<reportElement style="Crosstab_CD" x="0" y="0" width="60" height="20" uuid="10e01814-0960-4522-99d6-dc2e37eb9a8e"/>
<textFieldExpression><![CDATA[$V{amount_MEASURE}]]></textFieldExpression>
</textField>
</cellContents>
</crosstabCell>
<crosstabCell width="60" height="20" columnTotalGroup="product">
<cellContents mode="Opaque" style="Crosstab_CT">
<textField>
<reportElement style="Crosstab_CT" x="0" y="0" width="60" height="20" forecolor="#FFFFFF" uuid="34e42b3b-5b34-4ed3-888a-4925d56f37aa"/>
<textFieldExpression><![CDATA[$V{amount_MEASURE}]]></textFieldExpression>
</textField>
</cellContents>
</crosstabCell>
<crosstabCell width="60" height="20" rowTotalGroup="channel">
<cellContents mode="Opaque" style="Crosstab_CT">
<textField>
<reportElement style="Crosstab_CT" x="0" y="0" width="60" height="20" forecolor="#FFFFFF" uuid="7464296e-2f2b-467c-8700-616d0cb6bc0d"/>
<textFieldExpression><![CDATA[$V{amount_MEASURE}]]></textFieldExpression>
</textField>
</cellContents>
</crosstabCell>
<crosstabCell width="60" height="20" rowTotalGroup="channel" columnTotalGroup="product">
<cellContents mode="Opaque" style="Crosstab_CT">
<textField>
<reportElement style="Crosstab_CT" x="0" y="0" width="60" height="20" forecolor="#FFFFFF" uuid="f248de34-9e48-4b9b-bc9f-dbe95acba86d"/>
<textFieldExpression><![CDATA[$V{amount_MEASURE}]]></textFieldExpression>
</textField>
</cellContents>
</crosstabCell>
</crosstab>
</band>
</title>
</jasperReport>
此模板中有两个交叉表:第一个没有行组和不需要的单元格,第二个包含组和所有单元格(默认情况下)。
我在&#34;加入&#34; 一组中的所有频道时使用了此存储桶表达式。
<bucket class="java.lang.String">
<bucketExpression><![CDATA["1"]]></bucketExpression>
</bucket>
例如,您可以在Studio的帮助下更改此表达式。
我也在Studio中更改了单元格的宽度和高度。
我使用了 Studio 的预览模式来拍摄输出结果。