Export JasperReports in HTML format

2019-02-07 07:22发布

问题:

The code below gets a byte[] result, which works for PDF and XLSX. For HTML, an exception is raised.

    JasperPrint jasperPrint = JasperFillManager.fillReport(report,
            params, dataSource != null ? new JRMapArrayDataSource(
                    dataSource) : new JREmptyDataSource());

    ByteArrayOutputStream out = new ByteArrayOutputStream();
    @SuppressWarnings("rawtypes")
    Exporter exporter;
    switch (format) {
    case PDF:
        exporter = new JRPdfExporter();
        break;
    case XLSX:
        exporter = new JRXlsxExporter();
        break;
    case HTML:
        exporter = new HtmlExporter();
        break;
    default:
        throw new ReportException("Unknown export format");
    }
    exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(out));
    exporter.setExporterInput(new SimpleExporterInput(jasperPrint));
    exporter.exportReport();
    return out.toByteArray();

The exception for HTML is at exporter.exportReport(); line which says

java.lang.ClassCastException: 

net.sf.jasperreports.export.SimpleOutputStreamExporterOutput cannot be cast to net.sf.jasperreports.export.HtmlExporterOutput
at net.sf.jasperreports.engine.export.HtmlExporter.exportReport(HtmlExporter.java:232)

The error is the same for v6.0 and v5.6. This used to work in v5.0 (some of the classes were deprecated in v5.6).

How do you export a report in various formats, including HTML?

回答1:

For HTML and other formats:

import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.export.HtmlExporter;
import net.sf.jasperreports.engine.export.JRCsvExporter;
import net.sf.jasperreports.engine.export.JRPdfExporter;
import net.sf.jasperreports.engine.export.JRXmlExporter;
import net.sf.jasperreports.export.Exporter;
import net.sf.jasperreports.export.SimpleExporterInput;
import net.sf.jasperreports.export.SimpleHtmlExporterOutput;
import net.sf.jasperreports.export.SimpleOutputStreamExporterOutput;

public byte[] export(final JasperPrint print) throws JRException {
    final Exporter exporter;
    final ByteArrayOutputStream out = new ByteArrayOutputStream();
    boolean html = false;

    switch (getReportFormat()) {
        case HTML:
            exporter = new HtmlExporter();
            exporter.setExporterOutput(new SimpleHtmlExporterOutput(out));
            html = true;
            break;

        case CSV:
            exporter = new JRCsvExporter();
            break;

        case XML:
            exporter = new JRXmlExporter();
            break;

        case XLSX:
            exporter = new JRXlsxExporter();
            break;

        case PDF:
            exporter = new JRPdfExporter();
            break;

        default:
            throw new JRException("Unknown report format: " + getReportFormat().toString());
    }

    if (!html) {
        exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(out));
    }

    exporter.setExporterInput(new SimpleExporterInput(print));
    exporter.exportReport();

    return out.toByteArray();
}

Call it using:

JasperPrint print = JasperFillManager.fillReport(report, parameters, dataSource);
byte report[] = export(print);


回答2:

Dynamic report implementation for all types of format

Maven depeendecies to be included is as below

<!-- dynamic/jasper reports -->
    <dependency>
        <groupId>net.sourceforge.dynamicreports</groupId>
        <artifactId>dynamicreports-core</artifactId>
        <version>4.1.0</version>
    </dependency>
    <dependency>
        <groupId>org.eclipse.birt.runtime.3_7_1</groupId>
        <artifactId>com.lowagie.text</artifactId>
        <version>2.1.7</version>
    </dependency>

XHTML Code :

<h:commandLink id="csv" onclick="PF('data').hide();"
    action="#{dashboardInfoBean.downloadCsv}">
    <h:graphicImage name="images/img_trans.gif"
        styleClass="ico csvImg" />
</h:commandLink>
<h:commandLink id="pdf" onclick="PF('data').hide();"
    action="#{dashboardInfoBean.downloadPdf}">
    <h:graphicImage name="images/img_trans.gif"
        styleClass="ico pdfImg" />
</h:commandLink>
<h:commandLink id="excel" onclick="PF('data').hide();"
    action="#{dashboardInfoBean.downloadExcel}">
    <h:graphicImage name="images/img_trans.gif"
        styleClass="ico xlsImg" />
</h:commandLink>
<h:commandLink id="xml" onclick="PF('data').hide();"
    action="#{dashboardInfoBean.downloadXml}">
    <h:graphicImage name="images/img_trans.gif"
        styleClass="ico xmlImg" />
</h:commandLink>
<h:commandLink id="jasper" onclick="PF('data').hide();"
    action="#{dashboardInfoBean.downloadJasperReport}">
    <h:graphicImage name="images/img_trans.gif"
        styleClass="ico xmlImg" />
</h:commandLink>        

Java Code :

 //set datasource for creating the report
        report.setDataSource(dataSource);
        JasperPrint jasperPrint = report.toJasperPrint();
        HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
        ServletOutputStream servletOutputStream = response.getOutputStream();

        if(downloadFormat.equalsIgnoreCase("PDF")){
            response.setContentType("application/pdf");  
            response.addHeader("Content-disposition", "attachment; filename=report.pdf");
            JasperExportManager.exportReportToPdfStream(jasperPrint, servletOutputStream);
        } else if(downloadFormat.equalsIgnoreCase("XML")){
            //response.setContentType("application/pdf");  
            response.addHeader("Content-disposition", "attachment; filename=report.xml");
            JasperExportManager.exportReportToXmlStream(jasperPrint, servletOutputStream);
        } else if(downloadFormat.equalsIgnoreCase("CSV")){
            response.setContentType("text/plain");  
            response.addHeader("Content-disposition", "attachment; filename=report.csv");
            JRCsvExporter exporter = new JRCsvExporter();  
            exporter.setParameter(JRCsvExporterParameter.JASPER_PRINT,  
                    jasperPrint);  
            exporter.setParameter(JRCsvExporterParameter.OUTPUT_STREAM,  
                    servletOutputStream);  
            exporter.setParameter(JRExporterParameter.IGNORE_PAGE_MARGINS,  
                    Boolean.TRUE);  
            exporter.exportReport();  
        } else if(downloadFormat.equalsIgnoreCase("XLS")){
            response.setContentType("application/vnd.ms-excel");  
            response.addHeader("Content-disposition", "attachment; filename=report.xls");
            JExcelApiExporter exporterXLS = new JExcelApiExporter();  
            exporterXLS.setParameter(  
                JRXlsExporterParameter.JASPER_PRINT,  
                jasperPrint);  
            exporterXLS.setParameter(  
                JRXlsExporterParameter.IS_DETECT_CELL_TYPE,  
                Boolean.TRUE);  
            exporterXLS.setParameter(  
                JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND,  
                Boolean.FALSE);  
            exporterXLS.setParameter(  
                JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS,  
                Boolean.TRUE);  
            exporterXLS.setParameter(  
                JRXlsExporterParameter  
                    .IS_REMOVE_EMPTY_SPACE_BETWEEN_COLUMNS,  
                Boolean.TRUE);  
            // exporterXLS.setParameter(  
            // JRXlsExporterParameter.IS_IGNORE_CELL_BORDER,  
            // Boolean.TRUE);  
            exporterXLS.setParameter(JRXlsExporterParameter.OUTPUT_STREAM,  
                    servletOutputStream);  
            exporterXLS.exportReport();  
        }
        FacesContext.getCurrentInstance().responseComplete();


回答3:

Try this

JasperPrint jasperPrint = JasperFillManager.fillReport(report,
            params, dataSource != null ? new JRMapArrayDataSource(
                    dataSource) : new JREmptyDataSource());

        ByteArrayOutputStream out = new ByteArrayOutputStream();

        @SuppressWarnings("rawtypes")
        Exporter exporter;
        switch (format) {
        case PDF:
            exporter = new JRPdfExporter();
            exporter.setExporterOutput(new SimpleWriterExporterOutput(out));
            break;
        case CSV:
            exporter = new JRCsvExporter();
            exporter.setExporterOutput(new SimpleWriterExporterOutput(out));
            break;
        case XLSX:
            exporter = new JRXlsxExporter();
            exporter.setExporterOutput(new SimpleWriterExporterOutput(out));
            break;
        case HTML:
             exporter = new HtmlExporter();
            exporter.setExporterOutput(new SimpleWriterExporterOutput(out));
            break;
        default:
            throw new ReportException("Unknown export format");
        }
        exporter.setExporterInput(new SimpleExporterInput(jasperPrint));
        exporter.exportReport();