レポートを (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;
}