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 ,? " 我愛中國(guó) " );
          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 ,? " 中國(guó)愛我 " ,wcfFC);
          ws.addCell(labelC);
          // 寫入Exel工作表
          wwb.write();
          // 關(guān)閉Excel工作薄對(duì)象
          wwb.close();

          }


          // 最好寫一個(gè)這樣的main方法來測(cè)試一下你的這個(gè)class是否寫好了。
          public ? static ? void ?main(String[]?args) throws ?Exception {
          File?f
          = new ?File( " kk.xls " );
          f.createNewFile();
          writeExcel(
          new ?FileOutputStream(f));
          }


          }


          寫一個(gè)jsp,來利用Test這個(gè)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里面打開動(dòng)態(tài)生成的excel文檔了。一點(diǎn)亂碼也沒有。

          也許有人會(huì)問:response.reset();可不可以不要這一句,我的建議是一定要寫,除非你能保證response的buffer里面沒有別的東西。

          還有人也許會(huì)問:我在jsp開頭加上<%@page contentType="application/vnd.ms-excel;charset=GBK" %>這一句,去掉response.setContentType("application/vnd.ms-excel");行不行?回答這個(gè)問題很簡(jiǎn)單,就是查看jsp服務(wù)器編譯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(); 之后沒有設(shè)置response contenttype的正確類型,當(dāng)然輸出為亂碼了。而正確輸出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());之前正確的設(shè)置了response的輸出內(nèi)容。所以輸出就正常了。
          posted on 2006-05-16 17:22 kelven 閱讀(626) 評(píng)論(0)  編輯  收藏 所屬分類: java
          主站蜘蛛池模板: 寿阳县| 东乡县| 南汇区| 敖汉旗| 黄浦区| 荆门市| 锡林浩特市| 尚志市| 新闻| 万盛区| 新疆| 布拖县| 崇明县| 南江县| 资兴市| 万盛区| 青岛市| 星子县| 孝昌县| 吴江市| 玉环县| 遂昌县| 达日县| 阿鲁科尔沁旗| 多伦县| 衢州市| 万山特区| 上饶市| 堆龙德庆县| 施秉县| 嘉善县| 呼图壁县| 邵武市| 平顺县| 盐亭县| 中西区| 瓦房店市| 永福县| 南川市| 万山特区| 板桥市|