用jxl解决jsp/java中excel处理问题

下载 jxl.jar的地址
http://www.andykhan.com/jexcelapi/index.html
下载最新版的jexcelap,如jexcelapi_2_6.tar.gz
解压缩,将其中的jxl.jar导入工程

解决中文问题


 写一个javaBean,利用JExcelApi来动态生成excel文档,我这里写一个最简单的,示意性的。复杂的你可能还要查询数据库什么的。
  1. ///Test.java///
  2. package com.jagie.test;
  3. import java.io.*;
  4. import jxl.*;
  5. import jxl.write.*;
  6. import jxl.format.*;
  7. import java.util.*;
  8. import java.awt.Color;
  9. public class Test{
  10.  public static void writeExcel(OutputStream os) throws Exception {
  11.   jxl.write.WritableWorkbook wwb = Workbook.createWorkbook(os);
  12.   jxl.write.WritableSheet ws = wwb.createSheet("TestSheet1", 0);
  13.   jxl.write.Label labelC = new jxl.write.Label(0, 0, "我爱中国");
  14.   ws.addCell(labelC);
  15.   jxl.write.WritableFont wfc = new jxl.write.WritableFont(WritableFont.ARIAL,20, WritableFont.BOLD, false,
  16.   UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.GREEN);
  17.   jxl.write.WritableCellFormat wcfFC = new jxl.write.WritableCellFormat(wfc);
  18.   wcfFC.setBackground(jxl.format.Colour.RED);
  19.   labelC = new jxl.write.Label(6, 0, "中国爱我",wcfFC);
  20.   ws.addCell(labelC);
  21.   //写入Exel工作表
  22.   wwb.write();
  23.   //关闭Excel工作薄对象
  24.   wwb.close();
  25.  }
  26.  //最好写一个这样的main方法来测试一下你的这个class是否写好了。
  27.  public static void main(String[] args)throws Exception{
  28.   File f=new File("kk.xls");
  29.   f.createNewFile();
  30.   writeExcel(new FileOutputStream(f));
  31.  }
写一个jsp,来利用Test这个javabean输出excel文档。
  1. ///test_excel.jsp//
  2. <%@page import="com.jagie.test.Test" %>
  3. <%
  4.  response.reset();
  5.  response.setContentType("application/vnd.ms-excel");
  6.  Test.writeExcel(response.getOutputStream());
  7. %> 
这样就大功告成了,你用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文件的 示意性代码是这样的:
  1. public void _jspService(javax.servlet.http.HttpServletRequest request,
  2. javax.servlet.http.HttpServletResponse response) throws java.io.IOException,
  3. javax.servlet.ServletException {
  4.  // declare and set well-known variables:
  5.  javax.servlet.ServletConfig config = getServletConfig();
  6.  javax.servlet.ServletContext application = config.getServletContext();
  7.  javax.servlet.jsp.tagext.Tag _activeTag = null;
  8.  // variables for Tag extension protocol
  9.  Object page = this;
  10.  javax.servlet.jsp.JspWriter out;
  11.  javax.servlet.jsp.PageContext pageContext =
  12.  javax.servlet.jsp.JspFactory.getDefaultFactory().getPageContext(this,
  13.  request, response, nulltrue, 8192, true);
  14.  response.setHeader("Content-Type""application/vnd.ms-excel; charset=GBK");
  15.  out = pageContext.getOut();
  16.  JspWriter _originalOut = out;
  17.  javax.servlet.http.HttpSession session = request.getSession(true);
  18.  try { // error page try block
  19.   response.setContentType("application/vnd.ms-excel;charset=GBK");
  20.   out.print("/r/n/r/n/r/n/r/n");
  21.   out.print("/r/n");
  22.   //[ /test_excel.jsp; Line: 6]
  23.   response.reset(); //[ /test_excel.jsp; Line: 7]
  24.   //response.setContentType("application/vnd.ms-excel");
  25.   //[ /test_excel.jsp; Line: 8]
  26.   Test.writeExcel(response.getOutputStream()); //[ /test_excel.jsp; Line: 9]
  27.   } catch (Throwable __ee) {
  28.    while (out != null && out != _originalOut) out = pageContext.popBody();
  29.   ((weblogic.servlet.jsp.PageContextImpl)pageContext).handlePageException((Throwable)__ee);
  30.  }
  31.  //before final close brace...
很明显,屏蔽response.setContentType("application/vnd.ms-excel");后,在 Test.writeExcel(response.getOutputStream());之前,response.reset(); 之后没有设置response contenttype的正确类型,当然输出为乱码了。而正确输出excel的jsp的编译后源码是这样的:

  1. public void _jspService(javax.servlet.http.HttpServletRequest request,
  2. javax.servlet.http.HttpServletResponse response) throws java.io.IOException,
  3. javax.servlet.ServletException
  4. {
  5.  // declare and set well-known variables:
  6.  javax.servlet.ServletConfig config = getServletConfig();
  7.  javax.servlet.ServletContext application = config.getServletContext();
  8.  javax.servlet.jsp.tagext.Tag _activeTag = null;
  9.  // variables for Tag extension protocol
  10.  Object page = this;
  11.  javax.servlet.jsp.JspWriter out;
  12.  javax.servlet.jsp.PageContext pageContext =
  13.   javax.servlet.jsp.JspFactory.getDefaultFactory().getPageContext(this, request, response, nulltrue, 8192, true);
  14.  out = pageContext.getOut();
  15.  JspWriter _originalOut = out;
  16.  javax.servlet.http.HttpSession session = request.getSession(true);
  17.  try { // error page try block
  18.   out.print("/r/n");
  19.   //[ /test_excel.jsp; Line: 2]
  20.   response.reset(); //[ /test_excel.jsp; Line: 3]
  21.   response.setContentType("application/vnd.ms-excel"); //[ /test_excel.jsp; Line: 4]
  22.   Test.writeExcel(response.getOutputStream()); //[ /test_excel.jsp; Line: 5]
  23.  } catch (Throwable __ee) {
  24.   while (out != null && out != _originalOut) out = pageContext.popBody();
  25.   ((weblogic.servlet.jsp.PageContextImpl)pageContext).handlePageException((Throwable)__ee);
  26.  }
  27.   //before final close brace...
大家可以看到在response.reset();之后,Test.writeExcel(response.getOutputStream());之前正确的设置了response的输出内容。所以输出就正常了。

最后,我来写写从jsp页面传入一个excel然后读取数据的过程吧

Struts 有个标签专门用来上传文件的

<td >     <html:file property="file" id="file"/>     </td>

你点了“浏览”按钮,文件传到那里去了呢?嗯,你要在form bean里面接收它,就是在你的xxxForm.java 里加上这样的代码

  1. private FormFile file;
  2. public FormFile getFile(){
  3. return this.file;
  4. }
  5. public void setFile(FormFile file){
  6. this.file=file;
  7. }

  8. private String fname;
  9. public String getFname(){
  10. return this.fname;
  11. }
  12. public void setFname(String fname){
  13.     this.fname=fname;
  14. }

  15. private String size;
  16. public String getSize(){
  17. return this.size;
  18. }
  19. public void setSize(String size){
  20. this.size=size;
  21. }
ok,这样你就可以写一个类来处理这个文件了,我们在struts里通常用action 类来做这个工作


  1. xxxAction.java
  2.     public ActionForward save(ActionMapping mapping, ActionForm form,
  3.               HttpServletRequest request, HttpServletResponse response)
  4.               throws Exception {
  5. String dir=servlet.getServletContext().getRealPath("/upload");//获取存放文件的文件夹的路径
  6.      FormFile file = xxForm.getFile();//获取传上来的文件
  7.   
  8.      
  9.       
  10.     String fileName=null;
  11.   
  12.     String fname=file.getFileName();
  13.     String size=Integer.toString(file.getFileSize())+"bytes";
  14.   
  15.     if(fname==null || fname.equals("")) ;
  16. else
  17. try{
  18.       InputStream streamIn=file.getInputStream();
  19.       OutputStream streamOut=new FileOutputStream(dir+"/"+fname);
  20.   
  21.       int bytesRead=0;
  22.       byte[] buffer=new byte[8192];
  23.       while((bytesRead=streamIn.read(buffer,0,8192))!=-1){
  24.        streamOut.write(buffer,0,bytesRead);
  25.       }
  26.       streamOut.close();
  27.       streamIn.close();
  28.   
  29.       xxForm.setFname(fname);
  30.       xxForm.setSize(size);
  31.   
  32.       file.destroy();
  33.   
  34.      }
  35.      catch(Exception e) {
  36.   
  37.       return mapping.findForward("error");
  38.      }
  39.   
  40.      if (fname != null) {
  41.   
  42.       List excellist = getDataFromExcel(dir+"/"+fname); //要对excel文件进行处理啦
  43.    
  44.      File uploadFile = new File(dir+"/"+fname);
  45.      uploadFile.delete();
  46.      }
  47.         
  48. }
  49. private List    getDataFromExcel(String dir){
  50. Workbook workbook; //工作簿
  51. workbook = Workbook.getWorkbook(new File(dir));
  52. Sheet sheet = workbook.getSheet(0); // '0' 表示获取你的第一个sheet
  53. for(int column=0;column<sheet.getColumns();column++){
  54. for(int row=0;row<sheet.getRows();();row++){
  55.     Cell cell=sheet.getCell(column ,row);   //读出每一个单元格里面的内容
  56.     System.out.println(cell);
  57. }
  58. }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值