注意点:
- 必须同步提交form表单
- Form表单编码方式 multipart/form-data
- 提交方式必须为post
- 上传文件对应 input type=”file” 元素要提供name属性
这里文件的导入解析我们使用Jquery ocupload
1.用到了新技术首先是导包 ,前端技术是导入js文件
导入JQuery ocupload
<script type="text/javascript" src="../../js/ocupload/jquery.ocupload-1.1.2.js"></script>
2.给导入按钮绑定upload事件
这里的红色字体标注的是验证表单类型,如果你不验证把他去掉就是直接无条件上传
$("#button-import").upload({
// 默认name为file ,可以不写
name: 'file'
action : '../../area_batchImport.action',
// 在选择文件的时候触发的事件
onSelect :function(){
// 选中文件后,关闭自动提交
this.autoSubmit = false ;
// 判定文件格式 ,以.xls 或者 .xlsx 结尾
var filename = this.filename();
var regex = /^.*\.(xls|xlsx)$/ ;
if(regex.test(filename)){
// 满足
this.submit();
}else{
//不满足
$.messager.alert("警告","只能上传.xls或.xlsx结尾的文件!","warning");
}
},
onComplete : function(response){
$.messager.alert("成功","文件上传成功!","info");
}
});
3.因为我们后台是使用的struts2,struts2的拦截器会对上传文件进行增强
4.然后我们在后台进行文件的接受(上传图片一样,只要是文件都有这3个参数)
在Action中进行定义这3个参数就可以接受到文件了,注意之前页面的上传文件绑定的name名字跟这里的name必须一致
(上传图片的话就是图片的那个input按钮的name属性的值)
private File [页面元素name]:表示获取文件
private String [页面元素name]ContentType:表示获取上传文件的类型
private String [页面元素name]FileName:表示获取上传的文件名
5.获取到文件了我们要将获取的文件进行解析让文件导入到数据库中
这里我们使用poi文件导入
5.1.进行依赖的注入
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>${poi.version}</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>${poi.version}</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>${poi.version}</version>
</dependency>
5.2在刚刚的action中我们进行数据的解析
这些导入需要我们事先知道Excel中的数据类型才可以,Excel中的数据放置的位置必须按照我们下面解析的顺序放
POI解析Excel 逻辑。
解析workbook(工作薄)---> sheet(工作表)---> row(行)---> cell(列/单元格)
@Action(value = "area_importArea")
public String importArea() throws IOException {
List<Area> areas = new ArrayList<Area>();//创建地区集合,用来存下面解析出的数据
// 编写解析代码逻辑
// 基于.xls 格式解析 HSSF
// 1、 加载Excel文件对象
HSSFWorkbook hssfWorkbook = new HSSFWorkbook(new FileInputStream(file));
// 2、 读取一个sheet
HSSFSheet sheet = hssfWorkbook.getSheetAt(0);//获取第一个sheet对象
// 3、 读取sheet中每一行,一行数据 对应 一个区域对象
for (Row row : sheet) {
// 第一行表头跳过
if (row.getRowNum() == 0) {
// 第一行 跳过
continue;
}
// 跳过空值的行,要求此行作废
if (row.getCell(0) == null
|| StringUtils.isBlank(row.getCell(0).getStringCellValue())) {
continue;
}
Area area = new Area();
area.setId(row.getCell(0).getStringCellValue());//区域编号
area.setProvince(row.getCell(1).getStringCellValue());//省份
area.setCity(row.getCell(2).getStringCellValue());//城市
area.setDistrict(row.getCell(3).getStringCellValue());//区域
area.setPostcode(row.getCell(4).getStringCellValue());//邮编
areas.add(area);
}
// 调用业务层
areaService.saveAreas(areas);
return NONE;
}
5.3有了数据的集合后台dao层直接进行保存即可