您的位置:首页 > 编程语言 > Java开发

java上传Excel实现数据的导入

2016-12-20 10:49 573 查看
本diors开发此功能是源于公司对于客户信息的导入功能,让运营人员可以将excel中的数据通过excel上传,导入到数据库系统中。经过总结,主要思路分为如下四个步骤:

1,(html部分自行脑补)在控制器里面创建List<HashMap<String,String>>准备接收所上传的Excel中的数据。

2,创建导出需要的工具类进行对数据处理,getDataForActivityAward(InputStream inputstream, int number) ,其中number用于指定每行读取到的截止位置。

3,将inputstream存入 Workbook对象,并通过三层for循环遍历sheet、row、cell。将每个cell存入map,最终用于返回Controller。

4,将接受到的list集合遍历,并将每个map中的素有元素一次获取到复制给model的对应属性,并将model数据存入到对应的数据库中。

代码部分如下:

jQuery校验:

/*检验上传文件是否为空、是否为excel文件、然后异步提交form*/
if($("#userExcel").val() == ''){
alert("请先选择需要导入的Excel文件");
return;
}
var v = $("#userExcel").val();
if(v.lastIndexOf(".xlsx") < 0 || v.lastIndexOf(".xls") < 0){
alert("请导入Excel文件");
return;
}
$("#myformId").ajaxSubmit({
type:"post",
url:"${base}/admin/addActivityAwardNew",
success:function(data){
alert(data);
window.location.href="${base}/admin/activityAwardNew";
}
});
Controller内对数据的接收与处理:

try {
List<HashMap<String,String>> list = ExportUtil.getDataForActivityAward(userExcel.getInputStream(),5);
if(list != null && list.size() > 0){
ActivityAwardRecord aar = new ActivityAwardRecord();
for(Map<String,String> map : list){
if(StringUtils.isNotBlank(map.get("0")) &&
StringUtils.isNotBlank(map.get("1")) &&
StringUtils.isNotBlank(map.get("2")) &&
StringUtils.isNotBlank(map.get("3")) &&
StringUtils.isNotBlank(map.get("4")) &&
StringUtils.isNotBlank(map.get("5")) ){
aar.setAwardId(awardId);
aar.setMobile(map.get("1"));
aar.setUserName(map.get("2"));
aar.setAwardType(map.get("3"));
aar.setAwardContent(map.get("4"));
aar.setAwardMoney(new BigDecimal(map.get("5")));
activityAwardRecordXService.addActivityAwardRecord(aar);
}
}
return "添加活动奖励成功";
}else{
return "Excel表数据有误或为空";
}
} catch (IOException e) {
e.printStackTrace();
return e.getMessage();
}
util工具类对excel数据的遍历和获取:

public static List<HashMap<String,String>> getDataForActivityAward(InputStream inputstream,int number) {
List<HashMap<String, String>> list = new ArrayList<HashMap<String,String>>();
HashMap<String,String> map = new HashMap<String,String>();
if(inputstream == null ){
return list;
}
try {
Workbook wb = WorkbookFactory.create(inputstream);
int sheetNum = wb.getNumberOfSheets();
Sheet sheet = null;
for(int sheetIndex = 0;sheetIndex<sheetNum;sheetIndex++){//遍历sheet(index 0开始)
sheet = wb.getSheetAt(sheetIndex);
Row row = null;
int firstRowNum = sheet.getFirstRowNum()+1;
int lastRowNum = sheet.getLastRowNum();
for (int rowIndex = firstRowNum;rowIndex<=lastRowNum;rowIndex++ ) {//遍历row(行 0开始)
row = sheet.getRow(rowIndex);
if(null != row){
int firstCellNum = row.getFirstCellNum();
int lastCellNum = row.getLastCellNum();
for (int cellIndex = firstCellNum; cellIndex < lastCellNum; cellIndex++) {//遍历cell(列 0开始)
Cell cell = row.getCell(cellIndex, Row.RETURN_BLANK_AS_NULL);
Object cellValue = null;
if (null != cell) {
switch (cell.getCellType()) {
case Cell.CELL_TYPE_STRING:
cellValue = cell.getRichStringCellValue().getString();
break;
case Cell.CELL_TYPE_NUMERIC:
if (DateUtil.isCellDateFormatted(cell)) {
cellValue= cell.getDateCellValue();
} else {
//此处对数字格式的数据转换为字符串,否则会出现科学计数法的显示。也可以使用“模板中设置单元格格式的方法避免”
DecimalFormat df = new DecimalFormat("#");
cellValue=df.format(cell.getNumericCellValue()).toString();
}
break;
case Cell.CELL_TYPE_BOOLEAN:
cellValue = cell.getBooleanCellValue();
break;
case Cell.CELL_TYPE_FORMULA:
cellValue = cell.getCellFormula();
break;
default:
System.out.println("not find match type.");
}
System.out.println("value:"+cellValue);
map.put(cellIndex+"", cellValue +"");
if(cellIndex == number){
list.add(map);
map = new HashMap<String,String>();
}
} else {
//TODO cell is null 用 *** 代替输出
}
}//end cell
}else{
//TODO row is null
}
}	//end row
}//end sheet

System.out.println(list.toString());
System.out.println(list.size());
} catch (Exception e) {
e.printStackTrace();
}
return list;
}


以上仅为本diors对这个小需求的开发总结,如有不做欢迎指正,在csdn第一遍博客,希望以后可以在这里和大家多交流,期待成长!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java excel 导入数据