How to show excel using jsp avoiding “No input sou

2019-02-20 13:59发布

问题:

I have written some code to show excel in a website.

But I'm getting this exception

net.sf.jasperreports.engine.JRRuntimeException: No input source supplied to the exporter.

My code

import in jsp

<%@ page import="java.io.*"%>
<%@ page import="java.sql.Connection"%>
<%@ page import="java.sql.DriverManager"%>
<%@ page import="java.util.HashMap"%>
<%@ page import="java.util.Map"%>
<%@ page import="net.sf.jasperreports.engine.*"%>
<%@ page import="java.io.ByteArrayOutputStream"%>
<%@ page import="net.sf.jasperreports.view.JasperViewer"%>
<%@ page import="net.sf.jasperreports.engine.export.*"%>

jsp code to export to excel

        <%
        Connection conn = null;
        String no1 = request.getParameter("no1");
        String no2 = request.getParameter("no2");

        System.out.println("get value " + no1 + " " +no2);
        try {
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/ams2"
                                                ,"root","passwd1234");
            File reportFile = new File (application.getRealPath("//jasper//report//Blank_A4_2.jasper"));
            Map parameters = new HashMap();

            parameters.put("no1",no1);
            parameters.put("no2",no2);
            System.out.println("123 "+parameters);

            ByteArrayOutputStream xlsReport = new ByteArrayOutputStream();
            JRXlsExporter exporter = new JRXlsExporter();
            exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, xlsReport);
            exporter.setParameter(JRExporterParameter.OUTPUT_FILE, "C:\\");
            exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, "sample.xls");
            exporter.exportReport();

            byte bytes[] = new byte[10];
            bytes = xlsReport.toByteArray();
            response.setContentType("application/vnd.ms-excel");

            response.setContentLength(bytes.length);
            xlsReport.close();
            ServletOutputStream outStream = response.getOutputStream();
            outStream.write(bytes,0,bytes.length);
            outStream.flush();
            outStream.close();

        } catch (Exception ex) {
            out.println("Error " + ex);
        }
    %>

How can this be fixed?

回答1:

If you are not using a very old version of JasperReports, you are using deprecated methods and most importantly you are not passing the JasperPrint to the exporter.

No input source supplied to the exporter.

You need to fill the report, using the JasperFillManager.fillReport

Example code (jasper report v5 or above)

JasperDesign jasperDesign = JRXmlLoader.load(new FileInputStream(reportFile));
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperDesign, parameters, conn);

JRXlsExporter exporter = new JRXlsExporter();
exporter.setExporterInput(new SimpleExporterInput(jasperPrint)); //The JasperPrint, filled report
exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(xlsReport)); //Your ByteArrayOutputStream 

SimpleXlsReportConfiguration configuration = new SimpleXlsReportConfiguration();
configuration.setOnePagePerSheet(true);
configuration.setDetectCellType(true);
configuration.set //The other properties you like to set
exporter.setConfiguration(configuration);

exporter.exportReport();