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