1、前台页面,如下图所示,注意划红线区域不要写错,尤其是form表单,enctype="multipart/form-data" 不要忘写
2. 后台Controller
@RequestMapping("import-employee")
public String importEmployee(EmployeeModel eQuery,
@RequestParam("file") MultipartFile file) {
List<EmployeeModel> emp= new ArrayList<EmployeeModel>();
if (!file.isEmpty()) {
String extent = importEmployeeService.getExtensionName(file
.getOriginalFilename()); //获取文件后缀名 getExtensionName 后文有介绍继续往下看
if (StringUtil.isEmpty(extent)) {
return "redirect:student-manage.htm";
}
String tempFileName = (new Date()).getTime() + "." + extent; //生成随机新的文件名,主要避免缓存带来的干扰
File temp = new File(tempFileName);
try {
temp.createNewFile(); //创建新文件
file.transferTo(temp);//将上传文件写入服务器指定文件
} catch (IOException e1) {
logger.error(e1.getMessage());
}try {
emp = importEmployeeService.getEmployeeInfomation(temp); //用来读取excel中的数据,并插入到数据库
} catch (Exception e) {
return "redirect:student-manage.htm";
}if (temp.exists()) {
temp.delete(); //删除临时文件
}
}
return "redirect:student-manage.htm";
}
获取后缀名方法
public String getExtensionName(String filename) {
if ((filename != null) && (filename.length() > 0)) {
int dot = filename.lastIndexOf('.');
if ((dot > -1) && (dot < (filename.length() - 1))) {
return filename.substring(dot + 1);
}
}
return filename;
}
核心部分
public List<EmployeeModel> getEmployeeInfomation(File file) {
Workbook wb = null;
Row row = null;
Row row2 = null;
Sheet sheet = null;
InputStream is = null;
List<EmployeeModel> list;
try {
// 设置要读取的文件路径
is = new FileInputStream(file);
// 如果不支持标记、重置, 则包装它
if (!is.markSupported()) {
is = new PushbackInputStream(is, 8);
}
// //创建工作薄,读取2003Excel和2007Excel
// HSSFWorkbook相当于一个excel文件,HSSFWorkbook是解析excel2007之前的版本(xls)
// 之后版本使用XSSFWorkbook(xlsx)
if (POIFSFileSystem.hasPOIFSHeader(is)) {
wb = new HSSFWorkbook(is);
} else if (POIXMLDocument.hasOOXMLHeader(is)) {
wb = new XSSFWorkbook(OPCPackage.open(is));
}
is.close();
} catch (IOException e) {
error = "Read error for File format ";
e.printStackTrace();
return null;
} catch (InvalidFormatException e2) {
error = "文件读取错误请检查文件格式是否正确";
e2.printStackTrace();
return null;
} catch (Exception e3) {
error = "文件读取错误请检查文件格式是否正确";
e3.printStackTrace();
return null;
}
// 获取第一个工作薄
sheet = wb.getSheetAt(0);
list = new ArrayList<EmployeeModel>();
// 获取总行数
int sumRow = sheet.getLastRowNum();
// 检查所有的行
//int maxRow = ExcelConstants.MAX_ROWS;
// System.out.println("最大"+maxRow+"行、、、、、、、、、、、、、、、、、、、、、");
if (sumRow <0) {
// error = "工作表的行数不能大于" + maxRow + ",请重新设定导入数据的行数,分到几张表中再次导入!";
return null;
}
SimpleDateFormat pattFormat = new SimpleDateFormat("dd/MM/yyyy");
if(sumRow>50){
List<SystemItemConfigModel> emp = systemItemConfigMapper.getSystemItemResultByCode("ImportEmployeeNum");
String empNum=null;
if(emp!=null&&emp.size()>0){
// https://137.200.48.72:8443/upload
empNum=emp.get(0).getItem_name();
}
sumRow=Integer.parseInt(empNum);
}
// 获得行(默认重 0开始)
for (int i = 1; i <= sumRow; i++) {
EmployeeModel model1 = new EmployeeModel();
// 获取行
row = sheet.getRow(i);
// 如果整行不能为空 执行下列代码
if (row.getCell(0) != null && row.getCell(1) != null) {
model1.setEmployeeCode(getValue(row.getCell(1))); //getValue 用来判断excel中的数据类型,例如时间进行格式化
model1.setName(getValue(row.getCell(2)));
... 此处省略一些字段,根据需要自行调整
EmployeeModel employeeModel = employeeMapper.getByCode(model1.getEmployeeCode());
if (employeeModel == null) {
employeeMapper.insert(model1);
}else{
employeeMapper.updateEmployee(model1);
}
list.add(model1);
}
}
return list;
}
//解决excel类型问题,获得数值
public static String getValue(Cell cell) {
String value = "";
if(null==cell){
return value;
}
switch (cell.getCellType()) {
//数值型
case Cell.CELL_TYPE_NUMERIC:
if (HSSFDateUtil.isCellDateFormatted(cell)) {
//如果是date类型则 ,获取该cell的date值
Date date = HSSFDateUtil.getJavaDate(cell.getNumericCellValue());
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
value = format.format(date);;
}else {// 纯数字
BigDecimal big=new BigDecimal(cell.getNumericCellValue());
value = big.toString();
//解决1234.0 去掉后面的.0
if(null!=value&&!"".equals(value.trim())){
String[] item = value.split("[.]");
if(1<item.length&&"0".equals(item[1])){
value=item[0];
}
}
}
break;
//字符串类型
case Cell.CELL_TYPE_STRING:
value = cell.getStringCellValue().toString();
break;
// 公式类型
case Cell.CELL_TYPE_FORMULA:
//读公式计算值
value = String.valueOf(cell.getNumericCellValue());
if (value.equals("NaN")) {// 如果获取的数据值为非法值,则转换为获取字符串
value = cell.getStringCellValue().toString();
}
break;
// 布尔类型
case Cell.CELL_TYPE_BOOLEAN:
value = " "+ cell.getBooleanCellValue();
break;
// 空值
case Cell.CELL_TYPE_BLANK:
value = "";
break;
// 故障
case Cell.CELL_TYPE_ERROR:
value = "";
break;
default:
value = cell.getStringCellValue().toString();
}
if("null".endsWith(value.trim())){
value="";
}
return value;
}