3

でレポートを生成していDynamicJasperます。行が空白の場合、レポート行を削除したいです。JasperReports で行う方法を知っています。

DynamicJasperしかし、Javaコードを使用して空白行を削除する方法を誰かに提案できますか?

4

1 に答える 1

3

の助けを借りてこの問題を解決するための簡単な方法を見つけられませんでしたDynamicJasper API

しかし、それはDJ助けを借りて解決することができます。

これは、レポートを作成するためのメインクラスのソースコードです。

public class BasicReportTest {

    private JasperPrint m_jasperPrint;
    private JasperReport m_jasperReport;
    private Map m_params = new HashMap();
    private DynamicReport m_dynamicReport;

    public DynamicReport buildReport() throws Exception {
        Style detailStyle = new Style();
        detailStyle.setBorder(Border.THIN);
        detailStyle.setBlankWhenNull(true);

        Style headerStyle = new Style();
        headerStyle.setFont(Font.COURIER_NEW_BIG_BOLD);
        headerStyle.setBorder(Border.THIN);
        headerStyle.setHorizontalAlign(HorizontalAlign.CENTER);
        headerStyle.setVerticalAlign(VerticalAlign.MIDDLE);
        headerStyle.setFont(Font.ARIAL_BIG);

        FastReportBuilder drb = new FastReportBuilder();
        drb.addColumn("State", "state", String.class.getName(), 30, detailStyle, headerStyle)
                .addColumn("Branch", "branch", String.class.getName(), 30, detailStyle, headerStyle)
                .addColumn("Item", "item", String.class.getName(), 50, detailStyle, headerStyle)
                .addColumn("Amount", "amount", Float.class.getName(), 60, detailStyle, headerStyle)
                .setTitle("The report with empty rows")
                .setUseFullPageWidth(true);

        DynamicReport dr = drb.build();
        return dr;
    }

    public void testReport() throws Exception {
        m_dynamicReport = buildReport();

        JRDataSource dataSource = getDataSource();

        m_jasperReport = DynamicJasperHelper.generateJasperReport(m_dynamicReport, 
                getLayoutManager(), m_params);

        m_jasperPrint = JasperFillManager.fillReport(m_jasperReport, m_params, dataSource);

        exportReport();
    }

    protected LayoutManager getLayoutManager() {
        return new CustomLayoutManager();
    }

    /*... Some code ... */

    public static void main(String[] args) throws Exception {
        BasicReportTest test = new BasicReportTest();
        test.testReport();
    }
}

このコード文字列により、で値を空白としてdetailStyle.setBlankWhenNull(true);表示することができます。式を使うようなものですnulltextField

<textField isBlankWhenNull="true">

jrxmlファイル内。

ただし、次のようなxmlコードを「生成」する必要もあります。

<textField isBlankWhenNull="true">
    <reportElement ... isRemoveLineWhenBlank="true"/>

上で述べたように、には、 JRElement.setRemoveLineWhenBlank(boolean isRemoveLineWhenBlank)DJメソッドを呼び出すためのパブリックメソッド(ラッパー)が含まれていません。

そのため、カスタマイズされたLayoutManagerクラスを使用しました。サンプルでは、CustomLayoutManager​​クラスです。

ソースコードは次のとおりです。

public class CustomLayoutManager extends ClassicLayoutManager {

    @Override
    protected void transformDetailBandTextField(AbstractColumn column, JRDesignTextField textField) {
        super.transformDetailBandTextField(column, textField);
        if (column.getStyle().isBlankWhenNull()) {
            textField.setRemoveLineWhenBlank(true);
        }
    }
}

エンジンがバンドの構築に使用するメソッドtransformDetailBandTextFieldをオーバーライドしました。DJDetail

于 2012-02-08T16:35:04.907 に答える