posts - 22,comments - 35,trackbacks - 0
package  com.jagie.test;
import  java.io. * ;
import  jxl. * ;
import  jxl.write. * ;
import  jxl.format. * ;
import  java.util. * ;
import  java.awt.Color;
public   class  Test {

public   static   void  writeExcel(OutputStream os)  throws  Exception  {
jxl.write.WritableWorkbook wwb 
=  Workbook.createWorkbook(os);
jxl.write.WritableSheet ws 
=  wwb.createSheet( " TestSheet1 " 0 );
jxl.write.Label labelC 
=   new  jxl.write.Label( 0 0 " 我爱中国 " );
ws.addCell(labelC);
jxl.write.WritableFont wfc 
=   new  jxl.write.WritableFont(WritableFont.ARIAL,
20 , WritableFont.BOLD,  false ,
UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.GREEN);
jxl.write.WritableCellFormat wcfFC 
=   new  jxl.write.WritableCellFormat(wfc);
wcfFC.setBackground(jxl.format.Colour.RED);
labelC 
=   new  jxl.write.Label( 6 0 " 中国爱我 " ,wcfFC);
ws.addCell(labelC);
// 写入Exel工作表
wwb.write();
// 关闭Excel工作薄对象
wwb.close();

}


// 最好写一个这样的main方法来测试一下你的这个class是否写好了。
public   static   void  main(String[] args) throws  Exception {
File f
= new  File( " kk.xls " );
f.createNewFile();
writeExcel(
new  FileOutputStream(f));
}


}


写一个jsp,来利用Test这个javabean输出excel文档。

///////////////////////////test_excel.jsp//////////////////////////

<%@page import="com.jagie.test.Test" %>
<%
response.reset();
response.setContentType("application/vnd.ms-excel");
Test.writeExcel(response.getOutputStream());
%>

这样就大功告成了,你用ie访问test_excel.jsp就能在ie里面打开动态生成的excel文档了。一点乱码也没有。

也许有人会问: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的输出内容。所以输出就正常了。
posted on 2006-05-16 17:22 kelven 阅读(617) 评论(0)  编辑  收藏 所属分类: java

只有注册用户登录后才能发表评论。


网站导航: