本站首页    管理页面    写新日志    退出


«August 2025»
12
3456789
10111213141516
17181920212223
24252627282930
31


公告
 本博客在此声明所有文章均为转摘,只做资料收集使用。

我的分类(专题)

日志更新

最新评论

留言板

链接

Blog信息
blog名称:
日志总数:1304
评论数量:2242
留言数量:5
访问次数:7593789
建立时间:2006年5月29日




[Java Open Source]Apache FileUpload 上传以及 JExcelApi 解析
软件技术

lhwork 发表于 2007/1/20 10:56:55

最近遇到点读取 Excel 数据的问题,于是花了点时间找开源工具。要解析 Excel,首当其冲的是上传文件,以前在项目里我们用 SmartUpload 进行上传,不过这个项目似乎已经停止开发了,于是在这里我使用 Apache Commons FileUpload,可以在 http://jakarta.apache.org/commons/fileupload 找到。目前该项目的最新版本是 1.1.1,网上有大量的范例程序,不过后来用的时候发现大部分方法在新版本中都不推荐使用了,于是好好读了一回 API 和官方范例。 先来看看如何上传文件,Servlet 很简单,在这里我限制了最大上传量为 1M,且直接读进内存中,不进行磁盘临时文件缓存。 import  java.io.IOException; import  java.io.PrintWriter; import  java.io.File; import  java.net.URI; import  java.net.URL; import  javax.servlet.ServletException; import  javax.servlet.http.HttpServlet; import  javax.servlet.http.HttpServletRequest; import  javax.servlet.http.HttpServletResponse; import  java.util.List; import  org.apache.commons.fileupload.RequestContext; import  org.apache.commons.fileupload.servlet.ServletRequestContext; import  org.apache.commons.fileupload.servlet.ServletFileUpload; import  org.apache.commons.fileupload.disk.DiskFileItemFactory; import  org.apache.commons.fileupload.FileItem; public   class  UploadServlet  extends  HttpServlet {     /**      * Constructor of the object.      */      public  UploadServlet() {         super ();    }     /**      * Destruction of the servlet.      */      public   void  destroy() {         super .destroy();    }     public   void  doGet(HttpServletRequest request, HttpServletResponse response)             throws  ServletException, IOException {    }     /**      * 上传文件     *      *  @param  request     *  @param  response     *  @throws  ServletException     *  @throws  IOException      */      public   void  doPost(HttpServletRequest request, HttpServletResponse response)             throws  ServletException, IOException {        response.setContentType( " text/html " );        response.setCharacterEncoding( " gbk " );        PrintWriter out  =  response.getWriter();        out.println( " <html> " );        out.println( "   <head><title>提示</title></head> " );        out.println( "   <body> " );         //  不用获取 URL 对象也行,直接用 getServletContext().getRealPath("/") 代替。         URL url  =  getServletContext().getResource( " / " );         //  从 HTTP servlet 获取 fileupload 组件需要的内容         RequestContext requestContext  =   new  ServletRequestContext(request);         //  判断是否包含 multipart 内容          if  (ServletFileUpload.isMultipartContent(requestContext)) {             //  创建基于磁盘的文件工厂             DiskFileItemFactory factory  =   new  DiskFileItemFactory();             //  设置直接存储文件的极限大小,一旦超过则写入临时文件以节约内存。默认为 1024 字节             factory.setSizeThreshold( 1024   *   1024 );             //  创建上传处理器,可以处理从单个 HTML 上传的多个上传文件。             ServletFileUpload upload  =   new  ServletFileUpload(factory);             //  最大允许上传的文件大小             upload.setSizeMax( 1024   *   1024 );             //  处理上传             List items  =   null ;             try  {                items  =  upload.parseRequest(requestContext);                 //  由于提交了表单字段信息,需要进行循环区分。                  for  ( int  i  =   0 ; i  <  items.size(); i ++ ) {                    FileItem fi  =  (FileItem) items.get(i);                     //  如果不是表单内容,取出 multipart。                      if  ( ! fi.isFormField()) {                         //  上传文件路径和文件、扩展名。                         String sourcePath  =  fi.getName();                        String[] sourcePaths  =  sourcePath.split( " \\\\ " );                         //  获取真实文件名                         String fileName  =  sourcePaths[sourcePaths.length  -   1 ];                         //  创建一个待写文件                         File uploadedFile  =   new  File( new  URI(url.toString() + fileName));                         //  写入                         fi.write(uploadedFile);                        out.println(fileName + " 上传成功。 " );                    }                }            }  catch  (Exception e) {                out.println( " 上传失败,请检查上传文件大小是否超过1兆,并保证在上传时该文件没有被其他程序占用。 " );                out.println( " <br>原因: " + e.toString());                e.printStackTrace();            }        }        out.println( "   </body> " );        out.println( " </html> " );        out.flush();        out.close();    }     /**      * Initialization of the servlet.     *      *  @throws  ServletException      */      public   void  init()  throws  ServletException {    }} 上面的程序示范了如何上传文件到服务器,本文的主要目的不光是上传,还要进行 Excel 解析,抽取有用的内容。开源的 Excel 解析器很多,在此我选择了 JExcelApi,可以在 http://jexcelapi.sourceforge.net 找到,据说是韩国人开发的,最新版本是 2.6.2。为什么没有选 POI,原因也是因为它 N 久没有更新了。我总是喜欢最新的东东,比如 Adobe 的 PDF Reader,硬是下载了 8.0,结果感觉还没有 6.0 好用。:( 以下程序修改直上传,做了部分调整,取消了文件储存,直接通过读取输入流进行解析,并假设约定的 Excel 文件有五列 N 行,第一行为标题信息。 import  java.io.IOException; import  java.io.PrintWriter; import  javax.servlet.ServletException; import  javax.servlet.http.HttpServlet; import  javax.servlet.http.HttpServletRequest; import  javax.servlet.http.HttpServletResponse; import  java.util.List; import  org.apache.commons.fileupload.RequestContext; import  org.apache.commons.fileupload.servlet.ServletRequestContext; import  org.apache.commons.fileupload.servlet.ServletFileUpload; import  org.apache.commons.fileupload.disk.DiskFileItemFactory; import  org.apache.commons.fileupload.FileItem; import  jxl.Workbook; import  jxl.Sheet; import  jxl.Cell; public   class  UploadServlet  extends  HttpServlet {             /**      * Constructor of the object.      */      public  UploadServlet() {         super ();    }     /**      * Destruction of the servlet.      */      public   void  destroy() {         super .destroy();    }     public   void  doGet(HttpServletRequest request, HttpServletResponse response)             throws  ServletException, IOException {    }     /**      * 上传文件     *      *  @param  request     *  @param  response     *  @throws  ServletException     *  @throws  IOException      */      public   void  doPost(HttpServletRequest request, HttpServletResponse response)             throws  ServletException, IOException {        response.setContentType( " text/html " );        response.setCharacterEncoding( " gbk " );        PrintWriter out  =  response.getWriter();        out.println( " <html> " );        out.println( "   <head><title>提示</title></head> " );        out.println( "   <body> " );         //  声明文件域         FileItem fileItem  =   null ;         //  从 HTTP servlet 获取 fileupload 组件需要的内容         RequestContext requestContext  =   new  ServletRequestContext(request);         //  判断是否包含 multipart 内容,如果不包含,则不进行任何处理。          if  (ServletFileUpload.isMultipartContent(requestContext)) {             //  创建基于磁盘的文件工厂             DiskFileItemFactory factory  =   new  DiskFileItemFactory();             //  设置直接存储文件的极限大小,一旦超过则写入临时文件以节约内存。默认为 1024 字节             factory.setSizeThreshold( 1024   *   1024 );             //  创建上传处理器,可以处理从单个 HTML 上传的多个上传文件。             ServletFileUpload upload  =   new  ServletFileUpload(factory);             //  最大允许上传的文件大小             upload.setSizeMax( 1024   *   1024 );             try  {                 //  处理上传                 List items  =   null ;                items  =  upload.parseRequest(requestContext);                 //  由于提交了表单字段信息,需要进行循环区分。                  for  ( int  i  =   0 ; i  <  items.size(); i ++ ) {                    FileItem fi  =  (FileItem) items.get(i);                     //  如果不是表单内容,取出 multipart。                      if  ( ! fi.isFormField()) {                        fileItem  =  fi;                         // 一次只上传单个文件                          break ;                    }                }                out.println(parseExcel(fileItem));            }  catch  (Exception e) {                out.println( " 上传失败!请检查上传的文件是否为excel格式、信息是否完整完整、且大小是否超过1兆。 " );                out.println( " <br>原因: " + e.toString());                e.printStackTrace();            }        }        out.println( "   </body> " );        out.println( " </html> " );        out.flush();        out.close();    }     /**      * 分析excel文件     *      *  @param  FileItem fi 文件域     *  @return  String     *  @throws  Exception      */      private  String parseExcel(FileItem fi)  throws  Exception{         //  声明 Workbook         Workbook workbook  =   null ;         try {            workbook  =  Workbook.getWorkbook(fi.getInputStream());            Sheet sheet  =  workbook.getSheet( 0 );             // 总行数              int  count  =  sheet.getRows();             // 取出标题               String a1  =  sheet.getCell( 0 , 0 ).getContents();              String a2  =  sheet.getCell( 1 , 0 ).getContents();              String a3  =  sheet.getCell( 2 , 0 ).getContents();              String a4  =  sheet.getCell( 3 , 0 ).getContents();              String a5  =  sheet.getCell( 4 , 0 ).getContents();             // 取出内容              for ( int  i  =   1 ;i  <  count;i ++ ){                Cell[] cells  =  sheet.getRow(i);                System.out.println(cells[ 0 ].getContents()                         + cells[ 1 ].getContents() + cells[ 2 ].getContents()                         + cells[ 3 ].getContents() + cells[ 4 ].getContents());            }             return   " 上传成功。 " ;                    } catch (Exception e){             throw  e;        } finally {             if (workbook != null ){                workbook.close();            }        }    }         /**      * Initialization of the servlet.     *      *  @throws  ServletException      */      public   void  init()  throws  ServletException {    }} JExcelApi 用起来很简单,而且还可以根据 Excel 中数据类型转换成 Java 数据类型,比如 int、double,具体信息可以参考它的开发指南。当然,本范例还提供现构造 Excel 然后下载的方法,如果以后遇到,一定继续完善。


阅读全文(3680) | 回复(1) | 编辑 | 精华
 


回复:Apache FileUpload 上传以及 JExcelApi 解析
软件技术

rosen(游客)发表评论于2007/1/23 10:10:46

请尊重他人劳动成果,附上作者声明! 请注意!引用、转贴本文应注明原作者:Rosen Jiang 以及出处:http://www.blogjava.net/rosen


个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


» 1 »

发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.359 second(s), page refreshed 144767030 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号