/******************************************************************************* * Copyright (c) 2009 Daniel Grout. * * GNU GENERAL PUBLIC LICENSE - Version 3 * * This file is part of Report Runner (http://code.google.com/p/reportrunner). * * Report Runner is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Report Runner is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Report Runner. If not, see <http://www.gnu.org/licenses/>. * * Module: JasperRenderer.java ******************************************************************************/ package binky.reportrunner.engine.renderers; import java.io.ByteArrayInputStream; import java.io.IOException; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import net.sf.jasperreports.engine.JRException; import net.sf.jasperreports.engine.JRExporter; import net.sf.jasperreports.engine.JRExporterParameter; import net.sf.jasperreports.engine.JRPrintPage; import net.sf.jasperreports.engine.JRResultSetDataSource; import net.sf.jasperreports.engine.JasperCompileManager; import net.sf.jasperreports.engine.JasperFillManager; import net.sf.jasperreports.engine.JasperPrint; import net.sf.jasperreports.engine.JasperReport; import net.sf.jasperreports.engine.design.JasperDesign; import net.sf.jasperreports.engine.export.JRCsvExporter; import net.sf.jasperreports.engine.export.JRHtmlExporter; import net.sf.jasperreports.engine.export.JRPdfExporter; import net.sf.jasperreports.engine.export.JRXlsExporter; import net.sf.jasperreports.engine.export.JRXlsExporterParameter; import net.sf.jasperreports.engine.export.ooxml.JRXlsxExporter; import net.sf.jasperreports.engine.xml.JRXmlLoader; import org.apache.log4j.Logger; import binky.reportrunner.data.RunnerJob.FileFormat; import binky.reportrunner.exceptions.RenderException; public class JasperRenderer extends AbstractRenderer { private JasperReport report; JRExporter exporter; private Logger logger = Logger.getLogger(JasperRenderer.class); private boolean tabbedXLS; private String url; private List<String> sheetNames=new LinkedList<String>(); private JasperPrint print; public JasperRenderer(byte[] templateFile, FileFormat format) throws JRException { super(format); JasperDesign jasperDesign = JRXmlLoader.load(new ByteArrayInputStream( templateFile)); JasperReport report = JasperCompileManager.compileReport(jasperDesign); this.report = report; switch (format) { case CSV: exporter = new JRCsvExporter(); break; case HTML: exporter = new JRHtmlExporter(); break; case XLS: exporter = new JRXlsExporter(); break; case TABBED_XLS: exporter = new JRXlsxExporter(); this.tabbedXLS=true; break; case PDF: default: exporter = new JRPdfExporter(); } } private JasperPrint generateSinglePage(ResultSet rs, String label) throws RenderException, SQLException { logger.debug("creating datasource from result set"); JRResultSetDataSource jrDs = new JRResultSetDataSource(rs); JasperPrint jp; try { logger.debug("filling report"); jp = JasperFillManager.fillReport(report, new HashMap<String, Object>(), jrDs); jp.setName(label); logger.debug("finished filling report"); return jp; } catch (JRException e) { throw new RenderException(e.getMessage(), e); } finally { rs.close(); } } @Override public void generateReport(ResultSet resultSet, String label, String url) throws RenderException, SQLException { JasperPrint jp = generateSinglePage(resultSet, label); if (tabbedXLS) { jp.setProperty("isIgnorePagination", "true"); jp.setName(label); this.sheetNames.add(label); //thanks to: http://stackoverflow.com/questions/3977658/how-do-you-export-a-jasperreport-to-an-excel-file-with-multiple-worksheets/3979026#3979026 this.url=url; if (this.print==null) { this.print=jp; } else { List<JRPrintPage> pages = new ArrayList<JRPrintPage>(jp.getPages()); int i = this.print.getPages().size(); for (int count = 0; count < pages.size(); count++) { this.print.addPage(i, (JRPrintPage) pages.get(count)); i++; } } } else { try { this.print=jp; logger.debug("exporting report"); exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, super.getOutputStream(url)); exporter.setParameter(JRExporterParameter.JASPER_PRINT, print); exporter.exportReport(); } catch (IOException e) { throw new RenderException(e.getMessage(), e); } catch (JRException e) { throw new RenderException(e.getMessage(), e); } } } @Override protected void doFinal() throws RenderException { if (tabbedXLS) { try { logger.debug("exporting report"); exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, super.getOutputStream(this.url)); exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, true); exporter.setParameter(JRExporterParameter.JASPER_PRINT, this.print); exporter.setParameter(JRXlsExporterParameter.SHEET_NAMES, this.sheetNames.toArray(new String[0])); exporter.exportReport(); } catch (IOException e) { throw new RenderException(e.getMessage(), e); } catch (JRException e) { throw new RenderException(e.getMessage(), e); } } } }