-1

I am trying to export a Resultset to an Excel Foramt. This is the code

public void createExcel1(){

            Statement stmt = null;
            Connection conn = null;

            try {
                conn = (new CreateConnection()).getConnection();
                stmt = conn.createStatement();

                ResultSet rs = stmt.executeQuery("Select * form customer;");


                FacesContext facesContext = FacesContext.getCurrentInstance();
                ExternalContext externalContext = facesContext
                        .getExternalContext();


                HttpServletResponse response = (HttpServletResponse) externalContext.getResponse();
                response.reset();
                response.setContentType("application/vnd.ms-excel");
                response.setHeader("Content-Disposition", "attachment; filename=Customer.xls");
                HSSFWorkbook workbook = new HSSFWorkbook();
                HSSFSheet sheet = workbook.createSheet("Cust");


                HSSFRow rowhead = sheet.createRow((short) 0);
                rowhead.createCell(0).setCellValue("ID");
                rowhead.createCell(1).setCellValue("Name");


                int i = 1;
                while (rs.next()){
                    HSSFRow row = sheet.createRow((short) i);
                    row.createCell(0).setCellValue(rs.getString("ID"));
                    row.createCell(1).setCellValue(rs.getString("Name"));

                    i++;
                }


                workbook.write(response.getOutputStream());

                response.flushBuffer();
                response.getOutputStream().flush();
                response.getOutputStream().close();



                } catch (SQLException e1) {
                    e1.printStackTrace();
                } catch (FileNotFoundException e1) {
                    e1.printStackTrace();
                } catch (IOException e1) {
                    e1.printStackTrace();
                }           

        }

This is the stack `

SEVERE: Servlet.service() for servlet [Faces Servlet] in context with path [/Test1] threw exception [getOutputStream() has already been called for this response] with root cause
java.lang.IllegalStateException: getOutputStream() has already been called for this response
    at org.apache.catalina.connector.Response.getWriter(Response.java:636)
    at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:213)
    at com.sun.faces.context.ExternalContextImpl.getResponseOutputWriter(ExternalContextImpl.java:834)
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.createResponseWriter(FaceletViewHandlingStrategy.java:1177)
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:398)
    at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
    at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:337)
    at org.apache.myfaces.tomahawk.application.ResourceViewHandlerWrapper.renderView(ResourceViewHandlerWrapper.java:169)
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:120)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:219)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:647)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at com.walmart.cdctraffic.utilities.ResponseHeaderFilter.doFilter(ResponseHeaderFilter.java:30)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:610)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1720)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1679)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Unknown Source)

I have gone through all the answers present on the net but still I am not able to rectify this error. I have tried to redirect the response also but that's also throwing some error. Kindly Help..!!

Chirag Kawariya
  • 205
  • 2
  • 4
  • 18
  • 1
    Wild guess - you are calling the `getOutputStream` twice in your code...one while flushing and another to close it. – Tirath Oct 05 '15 at 10:07
  • 1
    The error seems to be pretty self-explanatory: "getOutputStream() has already been called for this response". Which means you are not allowed to call `response.getOutputStream()` more than once. – RealSkeptic Oct 05 '15 at 10:08
  • The fact is that you closed manually the stream, but your JSF is still trying to use it. Since you're using JSF to render the page, try deleting your "response.getOutputStream().close();" line, and let JSF close the stream for you. – javatutorial Oct 05 '15 at 10:09
  • I tried deleting "response.getOutputStream().close();" but then also it's throwing the same error. – Chirag Kawariya Oct 05 '15 at 10:18

1 Answers1

0

The solution of this problem is that I have to add

facesContext.responseComplete();

after response.getOutputStream().flush(); and I had to remove *response.getOutputStream().close();**

Chirag Kawariya
  • 205
  • 2
  • 4
  • 18