jsp 用smartupload上传Excel文件并在后台用jxl解析数据

最近开发了上传excel文件功能并解析数据,特做此记录和分享,以备不时之需,也希望对大家有用。

本例将要实现功能:

  1. 前台jsp页面上传excel文件。
  2. 用smartupload在后台接收excel文件。
  3. 用jxl.jar读取excel文件并收集数据。

一 、 前台上传文件
先上代码

first.jsp

<FORM   NAME="uploadForm" METHOD='POST' 
    action="upload.jsp" 
    ENCTYPE="multipart/form-data" 
    onSubmit="return uploadCheck(this);" 
    target="importFrame">

<tr bgcolor="#F4F4F4" align="left">
    <td>
         请选择导入文件:&nbsp;
         <input type=file name="filename">
         <input type="submit" value="导入数据" name="ff" id="ff">
    </td>
</tr>
</form>

<iframe name="importFrame" width="100%" height="0" src="" FRAMEBORDER=NO ></iframe>

<script>
    function uploadCheck(f){
        var s=f.filename.value;
        if(s==""){
          alert("请选择文件"); 
          return false;
        }else if("xls"!=s.substr(s.length-3,3)){
            alert("请选择扩展名为xls的文件");
            return false;
        }
        f.ff.disabled = true;//点击之后,不可点
        return true;
    }
</script>

代码很简单,不过有几个小细节需要注意。

1 .jxl 貌似只能处理.xls格式的EXCEL文件,所以这里js控制了;
2. first.jsp 中上传后,页面不跳转,需要在当前页面显示出处理结果,所以 使用了 form 的target属性,本例中为 importFrame
3. 点击“导入数据”按钮后,先把按钮置为不可点,防止重复提交;


二、smartupload在后台接收excel文件

需要提前下载smartupload.jar包。

代码如下:
upload.jsp

 <%

String returnMessage = ""; //导入结果返回消息

try{
    com.jspsmart.upload.SmartUpload upload=new com.jspsmart.upload.SmartUpload();
       upload.initialize(pageContext);
       upload.setMaxFileSize(10000000); //限制上传文件的大小1兆
       upload.upload();//上传
      //文件上传后的文件对象
      com.jspsmart.upload.File myFile = upload.getFiles().getFile(0);
      String strFileName = myFile.getFileName();
      String abspath =request.getRealPath("/")+"/myworkupload/"+strFileName;
      myFile.saveAs(abspath);
%>

这样,边接收到了前台上传的文件,保存在服务器的某个路径下。


三、JXL解析EXCEL文件

当然,使用jxl之前,还是先得下载jxl.jar包。

upload.jsp

int sheetNum=0;
File sourcefile=new File(filePath);
InputStream is = new FileInputStream(sourcefile);
jxl.Workbook rwb = Workbook.getWorkbook(is);       
Sheet rs = rwb.getSheet(sheetNum);//页

int col = rs.getColumns();//列
int row = rs.getRows();
System.out.println("(文件:"+filePath+"["+sheetNum+"页]):总共"+row+"行,"+col
列col``
);

上述代码读取excel中第一个sheet中的行数和列数,以备循环读取内容使用。

upload.jsp

List workContentList = new ArrayList();//
List detailContentList = new ArrayList();//
List belongToList = new ArrayList();//
List beginDateList = new ArrayList();//
List endDateList = new ArrayList();//
List noteList = new ArrayList();//

for(int i=0;i<row;i++){//开始读取       
    //此处1代表从第二列读取,如果需要循环列,此处要再设置一层循环,这里为了演示,暂时略掉        
    String workContent= rs.getCell(1, i).getContents();
    workContentList.add(workContent);
    //将第二列中的内容,放到list中做后续处理,后续处理程序省略了

            ...
            ...

    System.out.println("第"+(i+1)+"行数据="+workContent);
}

上述代码功能,参考注释。


四、返回first.jsp处理结果

最后,别忘了,我们first.jsp中还设置了一个frame等着结果呢。

upload.jsp

<script>
alert('处理成功或者失败');
window.parent.document.getElementById('ff').disabled=false;
</script>

由于前面我们设置了action在first.jsp页面的frame中展示结果,所以这里就是需要返回的处理结果,通过alert提示。

根据实际的处理结果,通过alert弹出到first.jsp页面中。

弹出之后,这里把 不可点 的按钮 “导入数据” 再设置成可点。


不会录视频,截几个图

文件后缀不符合要求时
这里写图片描述

上传成功时,上传按钮不可点:
这里写图片描述

点击确定后,按钮恢复:
这里写图片描述

好了,就先分享到这。有不正之处,欢迎留言讨论。

猜你喜欢

转载自blog.csdn.net/h517604180/article/details/80112249
今日推荐