不行的这样,因为要设定setContentType必须要在得到outputstream之前使用,好象是因为不同的contentType返回对应的OutputStream,而在JSP中,由于out是默认对象,当生成Servlet时,在jspService
方法中首先申请了一个PrintWriter的out对象,当进入try{}时,马上就执行了out=response.getWriter方法,而你在JSP里面写的除了JSP指令外,都是在这后面执行的,所以肯定会出错了,使用
<%@ page contentType="text/html; charset=GBK"设定吧,或是使用Servlet

解决方案 »

  1.   

    <%
     response.reset();
     response.setContentType("application/vnd.ms-excel");
     Test.writeExcel(response.getOutputStream());
    %> 
    有人会问:response.reset();可不可以不要这一句,我的建议是一定要写,除非你能保证response的buffer里面没有别的东西还有人也许会问:我在jsp开头加上<%@page contentType="application/vnd.ms-excel;charset=GBK" %>这一句,去掉response.setContentType("application/vnd.ms-excel");行不行?回答这个问题很简单,就是查看jsp服务器编译jsp后生成的java代码,如果改成这样,我的welogic7编译test_excel.jsp后生成的java文件的示意性代码是这样的:public void _jspService(javax.servlet.http.HttpServletRequest request, 
    javax.servlet.http.HttpServletResponse response) throws java.io.IOException, 
    javax.servlet.ServletException {  // declare and set well-known variables:
     javax.servlet.ServletConfig config = getServletConfig();
     javax.servlet.ServletContext application = config.getServletContext();
     javax.servlet.jsp.tagext.Tag _activeTag = null;
     // variables for Tag extension protocol Object page = this;
     javax.servlet.jsp.JspWriter out;
     javax.servlet.jsp.PageContext pageContext =
     javax.servlet.jsp.JspFactory.getDefaultFactory().getPageContext(this, 
     request, response, null, true, 8192, true); response.setHeader("Content-Type", "application/vnd.ms-excel; charset=GBK");
     out = pageContext.getOut();
     JspWriter _originalOut = out; javax.servlet.http.HttpSession session = request.getSession(true); try { // error page try block
      response.setContentType("application/vnd.ms-excel;charset=GBK");
      out.print("\r\n\r\n\r\n\r\n");
      out.print("\r\n");
      //[ /test_excel.jsp; Line: 6]
      response.reset(); //[ /test_excel.jsp; Line: 7]
      //response.setContentType("application/vnd.ms-excel"); 
      //[ /test_excel.jsp; Line: 8]
      Test.writeExcel(response.getOutputStream()); //[ /test_excel.jsp; Line: 9]
      } catch (Throwable __ee) {
       while (out != null && out != _originalOut) out = pageContext.popBody();
      ((weblogic.servlet.jsp.PageContextImpl)pageContext).handlePageException((Throwable)__ee);
     } //before final close brace...
    }   很明显,屏蔽response.setContentType("application/vnd.ms-excel");后,在Test.writeExcel(response.getOutputStream());之前,response.reset(); 之后没有设置response contenttype的正确类型,当然输出为乱码了。而正确输出excel的jsp的编译后源码是这样的:public void _jspService(javax.servlet.http.HttpServletRequest request, 
    javax.servlet.http.HttpServletResponse response) throws java.io.IOException,
    javax.servlet.ServletException 

     // declare and set well-known variables:
     javax.servlet.ServletConfig config = getServletConfig();
     javax.servlet.ServletContext application = config.getServletContext();
     javax.servlet.jsp.tagext.Tag _activeTag = null;
     // variables for Tag extension protocol Object page = this;
     javax.servlet.jsp.JspWriter out;
     javax.servlet.jsp.PageContext pageContext =
      javax.servlet.jsp.JspFactory.getDefaultFactory().getPageContext(this, request, response, null, true, 8192, true); out = pageContext.getOut();
     JspWriter _originalOut = out; javax.servlet.http.HttpSession session = request.getSession(true); try { // error page try block
      out.print("\r\n");
      //[ /test_excel.jsp; Line: 2]
      response.reset(); //[ /test_excel.jsp; Line: 3]
      response.setContentType("application/vnd.ms-excel"); //[ /test_excel.jsp; Line: 4]
      Test.writeExcel(response.getOutputStream()); //[ /test_excel.jsp; Line: 5]
     } catch (Throwable __ee) {
      while (out != null && out != _originalOut) out = pageContext.popBody();
      ((weblogic.servlet.jsp.PageContextImpl)pageContext).handlePageException((Throwable)__ee);
     }  //before final close brace...
    }   大家可以看到在response.reset();之后,Test.writeExcel(response.getOutputStream());之前正确的设置了response的输出内容。所以输出就正常了。-- 申明:转自CSDN某篇文档
      

  2.   

    <%@page contentType="application/msexcel"%>
    <%
       response.setHeader("Content-disposition","inline; filename=temp.xls");
    %>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
    <title>Excel预览页面</title>
    </head>
    <body>
    <%
    String ya=request.getParameter("ya");
    out.println(ya);
    %>
    </body>
    </html>直接这样就可以了啊。
    或者你用jxl.jar来进行excel的读取,然后显示在页面上就可以了。