代码参考了其他博主的文章,自己加以修改而成。
注:目前阶段没有时间对代码优化,类型的判断并没有做,有需要的时候来更新。
后台excel工具类
package com.zbmes.common.util;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.fileupload.disk.DiskFileItem;
import org.apache.commons.io.FileUtils;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
/**
* Excel工具类
* @author DBQ
*/
public class ExcelUtils {
private final static String excel2003L = ".xls"; // 2003- 版本的excel
private final static String excel2007U = ".xlsx"; // 2007+ 版本的excel
/**
* 获取实体对象返回属性名称
* @param obj 实体对象
* @return
* @throws Exception
*/
public java.lang.reflect.Field[] findEntityAllTypeName(Object obj)
throws Exception {
Class<? extends Object> cls = obj.getClass();
return cls.getDeclaredFields();
}
/**
* 根据文件选择excel版本
* @return
* @throws Exception
*/
public Workbook chooseWorkbook(MultipartFile file) throws Exception {
Workbook workbook = null;
// 把MultipartFile转化为File
CommonsMultipartFile cmf = (CommonsMultipartFile) file;
DiskFileItem dfi = (DiskFileItem) cmf.getFileItem();
File fo = dfi.getStoreLocation();
String filename = file.getOriginalFilename();
String fileType = (filename.substring(filename.lastIndexOf("."),
filename.length())).toLowerCase();
if (excel2003L.equals(fileType)) {
workbook = new HSSFWorkbook(FileUtils.openInputStream(fo)); // 2003-
} else if (excel2007U.equals(fileType)) {
workbook = new XSSFWorkbook(FileUtils.openInputStream(fo)); // 2007+
} else {
throw new Exception("解析的文件格式有误!");
}
return workbook;
}
/**
* 公共的导入excel方法
* @param file 文件
* @param obj 实体类
* @return 实体类集合
* @throws IOException
*/
public List<Object> importBaseExcel(MultipartFile file,
Object obj) throws IOException {
Workbook workbook = null;
try {
// 读取文件内容
workbook = this.chooseWorkbook(file);
// 获取工作表
Sheet sheet = workbook.getSheetAt(0);
// 获取sheet中第一行行号
int firstRowNum = sheet.getFirstRowNum();
// 获取sheet中最后一行行号
int lastRowNum = sheet.getLastRowNum();
Row firstRow = sheet.getRow(0);
short lastCellNum = firstRow.getLastCellNum();
// 获取表头中的属性列 返回Field数组
Field[] fa = new Field[lastCellNum];
String classname = obj.getClass().getName();
Class<?> clazz = Class.forName(classname);
for (int i = 0; i < lastCellNum; i++) {
Cell cell = firstRow.getCell(i);
String fieldName = cell.getStringCellValue();
Field field = clazz.getDeclaredField(fieldName);
fa[i] = field ;
}
List<Object> list = new ArrayList<Object>();
// 遍历表格数据
for (int i = firstRowNum + 1; i <= lastRowNum; i++) {
Row row = sheet.getRow(i);
// 可以根据该类名生成Java对象
Object pojo = clazz.newInstance();
// 实体字段匹配sheet列
for (int j = 0; j < lastCellNum; j++) {
Cell cell = row.getCell(j);
String val = cell.getStringCellValue();
fa[j].setAccessible(true);
fa[j].set(pojo, val);
}
list.add(pojo);
}
return list;
} catch (Exception e) {
e.printStackTrace();
} finally {
workbook.close();
}
return null;
}
}
处理导入请求:
@RequestMapping("doImport")
public String doImport(HttpServletRequest request) throws IOException{
ShiroHttpServletRequest shiroRequest = (ShiroHttpServletRequest) request;
CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver();
MultipartHttpServletRequest mr = commonsMultipartResolver.resolveMultipart((HttpServletRequest) shiroRequest.getRequest());
Iterator<String> iter = mr.getFileNames();
String inputName = iter.next();
//获得文件
MultipartFile mf = mr.getFile(inputName);
List<Object> list = new ExcelUtils().importBaseExcel(mf, new ProcessInfo());
service.saveAll(list);
return "redirect:Index";
}