最近开发了上传excel文件功能并解析数据,特做此记录和分享,以备不时之需,也希望对大家有用。
本例将要实现功能:
- 前台jsp页面上传excel文件。
- 用smartupload在后台接收excel文件。
- 用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>
请选择导入文件:
<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页面中。
弹出之后,这里把 不可点 的按钮 “导入数据” 再设置成可点。
不会录视频,截几个图
文件后缀不符合要求时
上传成功时,上传按钮不可点:
点击确定后,按钮恢复:
好了,就先分享到这。有不正之处,欢迎留言讨论。