0

レポートを (jrxml ファイルではなく) JasperDesign として作成しました。このレポートには、( で作成された) 右側のフィールドjasperDesign.addFieldと ( で作成された) 右側のヘッダー バンドがありjasperDesign.setColumnHeader() ます。データベースへの接続を使用する代わりに、多くのフィールドを持つ JRMapArrayDataSource を作成しました。

私の質問は、実行時にこの dataSource を JasperDesign に追加する方法ですか?

public static void doPrintWithJasperReport(PlanTableModel tableModel) throws JRException
{
    long start = System.currentTimeMillis();
    JasperDesign jasperDesign = getJasperDesign(tableModel);

    String compiledSource = "/build/reports/NoXmlDesignReport.jasper";
    JasperCompileManager.compileReportToFile(jasperDesign, compiledSource);
    System.err.println("Compile time : " + (System.currentTimeMillis() - start));
    JasperDesignViewer viewer = new JasperDesignViewer(compiledSource,false);

}

public static JasperDesign getJasperDesign(PlanTableModel tableModel) throws JRException
{
    //JasperDesign
    JasperDesign jasperDesign = new JasperDesign();
    jasperDesign.setName("The dynamically generated report");
    jasperDesign.setPageWidth(842);
    jasperDesign.setPageHeight(595);
    jasperDesign.setOrientation(JRReport.ORIENTATION_LANDSCAPE);
    jasperDesign.setColumnWidth(515);
    jasperDesign.setColumnSpacing(0);
    jasperDesign.setLeftMargin(40);
    jasperDesign.setRightMargin(40);
    jasperDesign.setTopMargin(50);
    jasperDesign.setBottomMargin(50);

    //data source
    JRDataSource dataSource = createReportDataSource( tableModel);
    // I don't know how to add it to jasperDesign

    // create Detail band
    JRDesignBand band = new JRDesignBand();
    band.setHeight(240);

    // add Fields
    List<Map<String,String>> maps = createDataSourceMap(tableModel);
    Map<String,String> headerMap = maps.get(0);

    for(Map.Entry<String,String> entry : headerMap.entrySet())
    {
        JRDesignField field = new JRDesignField();
        field.setName(entry.getKey().replaceAll("\n", " "));
        field.setValueClass(String.class);
        jasperDesign.addField(field);

        //creating field on the detail band
        JRDesignTextField textField = new JRDesignTextField();
        textField.setX(60);
        textField.setY(0);
        textField.setWidth(200);
        textField.setHeight(20);
        textField.setHorizontalAlignment(JRAlignment.HORIZONTAL_ALIGN_LEFT);
        JRDesignExpression expression = new JRDesignExpression();
        expression.setValueClass(String.class);
        expression.setText("$F{".concat(entry.getKey().replaceAll("\n", " ")).concat("}"));
        textField.setExpression(expression);
        textField.getLineBox().getTopPen().setLineWidth(1);
        textField.getLineBox().getRightPen().setLineWidth(1);
        textField.getLineBox().setLeftPadding(10);

        band.addElement(textField);

    }

    // add band
    ((JRDesignSection) jasperDesign.getDetailSection()).addBand(band);

    return jasperDesign;
}

private static JRDataSource createReportDataSource(PlanTableModel tableModel)
{
    JRMapArrayDataSource dataSource;
    Map[] reportRows = initializeMapArray(tableModel);
    dataSource = new JRMapArrayDataSource(reportRows);
    return dataSource;
}

public static Map[] initializeMapArray(PlanTableModel tableModel)
{
    HashMap[] reportRows = new HashMap[tableModel.getRowCount()];
    int hashMapRow = 0;

    // prepare data source


    return reportRows;
}
4

1 に答える 1