Showing posts with label Large JasperReports. Show all posts
Showing posts with label Large JasperReports. Show all posts

Tuesday, November 1, 2011

Large Excel JasperReports

When generating large Excel report by using JasperReports and DynamicJasper, have to take note the following configuration.

  • Java Heap Size
  • VIRTUALIZER
  • IS_IGNORE_PAGINATION
If you miss 1 of the configuration, you might encounter OutOfMemoryError exception.

Check out the following example code.

public class JasperExcelReport {

protected JasperPrint jp;

protected JasperReport jr;

protected Map params = new HashMap();

protected DynamicReport dr;

public void buildReport() throws Exception {

DynamicReportBuilder drb = new DynamicReportBuilder();

for (int i = 1; i <= 10; i++) {

AbstractColumn column = ColumnBuilder.getInstance()

.setColumnProperty("Column" + i, String.class.getName())

.setTitle("Column " + i + " Title").setWidth(200).build();

drb.addColumn(column);

}

drb.setUseFullPageWidth(true);

dr = drb.build();

JRDataSource ds = getDataSource();

// Make sure Java Heap Size is set.

// E.g. "-Xms256m -Xmx1024m"

// Virtualizer convert the page and store into a physical files on harddisk.

JRFileVirtualizer virtualizer = new JRFileVirtualizer(100, "C://tmp");

params.put(JRParameter.REPORT_VIRTUALIZER, virtualizer);

System.out.println("Generating...");

jr = DynamicJasperHelper.generateJasperReport(dr, new ClassicLayoutManager(), params);

System.out.println("Filling...");

if (ds != null) {

// JRParameter.IS_IGNORE_PAGINATION default is false,

// if you set to true, virtualizer will not work.

params.put(JRParameter.IS_IGNORE_PAGINATION, new Boolean(false));

jp = JasperFillManager.fillReport(jr, params, ds);

} else {

jp = JasperFillManager.fillReport(jr, params);

}

// If column width more then page width, some column will merge automatically.

// Set the page width to resolve this issue.

//jp.setPageWidth(0);

//jp.setPageHeight(0);

FileOutputStream fileOut = new FileOutputStream("C:/tmp/ExcelReport.xls");

JRExporter exporter = new JExcelApiExporter();

exporter.setParameter(JExcelApiExporterParameter.OUTPUT_STREAM, fileOut);

exporter.setParameter(JExcelApiExporterParameter.JASPER_PRINT, jp);

System.out.println("Exporting...");

exporter.exportReport();

fileOut.flush();

fileOut.close();

}

protected JRDataSource getDataSource() {

// Generate dummy data to show in the report.

List records = new ArrayList();

for (int i = 1; i < 500000; i++) {

Map columns = new HashMap();

for (int j = 1; j <= 10; j++) {

System.out.println("Column" + j);

// The HashMap Key must save with ColumnProperty Name

columns.put("Column" + j, "Record " + i + " Column " + j + " data.");

}

records.add(columns);

}

JRDataSource ds = new JRMapCollectionDataSource(records);

return ds;

}

public static void main(String[] args) throws Exception {

JasperExcelReport jer = new JasperExcelReport();

jer.buildReport();

System.out.println("Done");

}

}