设为首页 收藏本站
查看: 726|回复: 0

[经验分享] Apache FileUpload 上传以及 JExcelApi 解析

[复制链接]

尚未签到

发表于 2017-1-5 11:10:34 | 显示全部楼层 |阅读模式
  最近遇到点读取 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 然后下载的方法,如果以后遇到,一定继续完善。

请注意!引用、转贴本文应注明原作者:Rosen Jiang 以及出处:http://www.blogjava.net/rosenhttp://www.blogjava.net/rosen/aggbug/94940.html

Rosen 2007-01-19 15:19 发表评论

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-324218-1-1.html 上篇帖子: Django的Apache/mod_python配置 下篇帖子: Apache+负载均衡+gzip(自带的)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表