1.引入依赖
<!--poi依赖-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.15</version>
</dependency>
2.配置springmvc
<!-- 配置文件上传解析器 id:必须是multipartResolver-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="#{1024*1024*80}"/>
<property name="defaultEncoding" value="utf-8"/>
</bean>
3.前端
1.表单提交
<!--
文件上传的表单:
1)表单组件必须使用:<input type="file">
2)请求方式只能用post:
get:参数通过请求头提交,放在url后;只能提交文本数据;对参数的长度由限制;安全性低;效率高.
post:参数通过请求题提交;不但能提交文本数据,还能提交二进制数据;理论上对参数的长度没有限制;安全性相对较高;效率较低.
3)表单的编码格式只能用:multipart/form-data
根据HTTP协议的规定,客户端每次向后台提交参数,都会对所有的参数进行统一编码,默认采用的编码格式时urlencoded,这种编码格式只能对文本数据进行编码;
浏览器首先把所有参数都转换为文本数据,然后进行urlencoded编码,然后再发送到后台.
文件上传的表单,只能用 multipart/form-data,阻止浏览器的默认行为.
-->
<form action="workbench/activity/fileUpload.do" method="post" enctype="multipart/form-data">
<input type="file" name="activityFile"><br>
<input type="submit" value="提交">
</form>
2.ajax提交
$("#importActivityBtn").click(function () {
//收集参数
var activityFileName=$("#activityFile").val();//文件的名称
//表单验证
var suffix=activityFileName.substr(activityFileName.lastIndexOf(".")+1).toLocaleLowerCase();//dsad.dsad.dsad.xls xxx.Xls xxx.XLS xxx.XLs
if(suffix!='xls'){
alert("只支持.xls文件");
return;
}
//获取文件
var activityFile=$("#activityFile")[0].files[0];
//FormData:是ajax提供的一个接口,可以模拟键值对向后台提交参数;
//FormData最大的优势是不但能提交文本数据,还能提交二进制数据.
var formData=new FormData();
formData.append("activityFile",activityFile);
//发送请求
//processData:false,contentType:false必须写
$.ajax({
url:'地址',
data:formData,
type:'post',
processData:false,//默认情况下,ajax每次向后台提交参数,都会首先把所有参数都统一转化成字符串;设置processData=false,可以阻止ajax这种行为
contentType:false,//默认情况下,ajax每次向后台提交参数,都会把所有参数统一进行urlencoded编码;把contentType=false,可以阻止ajax的这种行为
dataType:'json',
success:function (data) {
.......
}
});
});
ajax的前端html
<div class="modal fade" id="importActivityModal" role="dialog">
<div class="modal-dialog" role="document" style="width: 85%;">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal">
<span aria-hidden="true">×</span>
</button>
<h4 class="modal-title" id="myModalLabel">导入市场活动</h4>
</div>
<div class="modal-body" style="height: 350px;">
<div style="position: relative;top: 20px; left: 50px;">
请选择要上传的文件:<small style="color: gray;">[仅支持.xls]</small>
</div>
<div style="position: relative;top: 40px; left: 50px;">
<input type="file" id="activityFile">
</div>
<div style="position: relative; width: 400px; height: 320px; left: 45% ; top: -40px;" >
<h3>重要提示</h3>
<ul>
<li>操作仅针对Excel,仅支持后缀名为XLS的文件。</li>
<li>给定文件的第一行将视为字段名。</li>
<li>请确认您的文件大小不超过5MB。</li>
<li>日期值以文本形式保存,必须符合yyyy-MM-dd格式。</li>
<li>日期时间以文本形式保存,必须符合yyyy-MM-dd HH:mm:ss的格式。</li>
<li>默认情况下,字符编码是UTF-8 (统一码),请确保您导入的文件使用的是正确的字符编码方式。</li>
<li>建议您在导入真实数据之前用测试文件测试文件导入功能。</li>
</ul>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
<button id="importActivityBtn" type="button" class="btn btn-primary">导入</button>
</div>
</div>
</div>
</div>
4.后端(这个是ajax的,表单提交一样的原理)
@RequestMapping("...")
(@ResponseBody ajax返回数据带着)
public Object importActivitys(MultipartFile activityFile)
try {
InputStream is=activityFile.getInputStream();
HSSFWorkbook wb=new HSSFWorkbook(is);
//根据wb获取一个HSSFSheet对象,封装了一页中的所有信息
HSSFSheet sheet=wb.getSheetAt(0);//页的编号,编号从0开始,0表示第一页,....
HSSFRow row=null;
HSSFCell cell= null;
for(int i=1;i<=sheet.getLastRowNum();i++) {//getLastRowNum():最后一行的编号
row=sheet.getRow(i);//行的编号,编号从0开始,0表示第一行,....
for(int j=0;j<row.getLastCellNum();j++) {//getLastCellNum():最后一列的编号+1,也就是这一行中的总列数
cell=row.getCell(j);//列的编号,编号从0开始,0表示第一列
做操作
}
}
返回前端的代码
}
工具类
public class HSSFUtils {
public static String getCellValueForStr(HSSFCell cell){
String ret="";
switch (cell.getCellType()){
case HSSFCell.CELL_TYPE_STRING:
ret=cell.getStringCellValue();
break;
case HSSFCell.CELL_TYPE_NUMERIC:
if (HSSFDateUtil.isCellDateFormatted(cell)) {
Date date = cell.getDateCellValue();
ret = TimeTool.dateToFormatTime(date, format)+"";
} else {
double dValue = cell.getNumericCellValue();
DecimalFormat df = new DecimalFormat("0");
ret = df.format(dValue)+"";
}
break;
case HSSFCell.CELL_TYPE_BOOLEAN:
ret=cell.getBooleanCellValue()+"";
break;
case HSSFCell.CELL_TYPE_FORMULA:
ret=cell.getCellFormula();
break;
default:
ret="";
}
return ret;
}
}