可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
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
net.sourceforge.dynamicreportsdynamicreports-core4.1.0org.eclipse.birt.runtime.3_7_1com.lowagie.text2.1.7
XHTML Code :
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();