如何根据内容隐藏表格列?

时间:2013-05-22 19:57:20

标签: jasper-reports

我有一份包含表格的报告。我想根据支持表的查询的结果集隐藏该表的列。例如,以下是其中一列的XML:

      <jr:column width="80">
        <printWhenExpression>$F{Total1_header} != null</printWhenExpression>
        <jr:columnHeader height="30" rowSpan="1">
          <textField isStretchWithOverflow="true" isBlankWhenNull="true">
            <reportElement x="0" y="0" width="80" height="30" style="table_CH"/>
            <textElement textAlignment="Center" verticalAlignment="Middle"/>
            <textFieldExpression>$F{Total1_header}</textFieldExpression>
          </textField>
        </jr:columnHeader>
        <jr:detailCell style="table_TD" height="20" rowSpan="1">
          <textField isStretchWithOverflow="true" isBlankWhenNull="true">
            <reportElement x="0" y="0" width="80" height="20"/>
            <textElement textAlignment="Center" verticalAlignment="Middle"/>
            <textFieldExpression>$F{Total1}</textFieldExpression>
          </textField>
        </jr:detailCell>
      </jr:column>

出于某种原因,我的报告抱怨 printWhenExpression 。它声称$F{Total1_header}不存在。但是,它不会抱怨 textFieldExpression $F{Total1_header}的实例。

我无法弄清楚为什么该字段可用于 textFieldExpression ,而不是 printWhenExpression

2 个答案:

答案 0 :(得分:0)

列具有'列打印时'属性以通过表达式隐藏/显示列。

删除列的另一种方法是在运行时修改jasper设计,然后报告编译,然后按常规处理。此方法可以将未使用的宽度分配给剩余的列。

粗略地这样:

JasperDesign design = ...
JRDesignComponentElement tableElement = (JRDesignComponentElement) design.getTitle().getElementByKey(tableKey);
StandardTable tableComponent = (StandardTable) tableElement.getComponent();
col = tableComponent.getColumns().get(0);
tableComponent.removeColumn(col);
// Then compile the JasperDesign
JasperReport result=JasperCompileManager.compileReport(design);

答案 1 :(得分:0)

对于未来的读者

你应该使用这个 <printWhenExpression><![CDATA[$F{Total1_header} != null]]></printWhenExpression>

而不是
<printWhenExpression>$F{Total1_header} != null</printWhenExpression>