上一篇博客我们分享了UI设计经验《漂亮的弹出框效果》。今天我们来分享一下数据上传经验:导入Excel!
1、引入commons-fileupload.jar包,添加相关依赖
2、添加ExcelUtility工具类
3、配置SpringMVC
4、上传Excel文件将并存入数据库
1、引入commons-fileupload.jar包,在web的pom文件里添加相关依赖:
commons-fileupload
commons-fileupload
1.3.1
(1)ExcelUtility工具类中Excel导入代码:
/**
* excel表导入
* @param in 承载着Excel的输入流
* @param sheetName 要输入的工作表名称集合,如String[] sheetName={"sheet1","sheet2","sheet3","sheet4"}
* @param entityClass List中对象的类型
* @param fieldMap Excel中的中文列头和类的英文属性的对应关系Map
* @param uniqueFields 指定业务主键组合(即复合主键),这些列的组合不能重复
* @return
*/
public List excelToList(InputStream in, String[] sheetName,
LinkedHashMap> entityClass,
LinkedHashMap> fieldMap,
LinkedHashMap uniqueFields) {
// 定义要返回的List列表
List resultList = new ArrayList();
try {
// 根据Excel数据源创建WorkBook
Workbook wb = Workbook.getWorkbook(in);
// 获取工作表
for (int k = 0; k < sheetName.length; k++) {
resultList.clear();
Sheet sheet = wb.getSheet(sheetName[k]);
String singleSheetName = sheetName[k]; // 获取sheet名为
Class> enClassName = null;
// 给对象中的sheet所对应的实体
for (Entry> entry : entityClass.entrySet()) {
// 获取中文字段名
String enSheetName = entry.getKey();
// 获取英文字段名
if (enSheetName.equals(singleSheetName)) {
enClassName = entry.getValue();
}
}
// 获取工作表的有效行数
int realRows = 0;
for (int i = 0; i < sheet.getRows(); i++) {
int nullCols = 0;
for (int j = 0; j < sheet.getColumns(); j++) {
Cell currentCell = sheet.getCell(j, i);
if (currentCell == null
|| "".equals(currentCell.getContents()
.toString())) {
nullCols++;
}
}
if (nullCols == sheet.getColumns()) {
break;
} else {
realRows++;
}
}
// 如果Excel中没有数据则提示错误
if (realRows <= 1) {
throw new ExcelException("Excel文件中的" + sheetName[k]
+ "没有任何数据");
}
Cell[] firstRow = sheet.getRow(0);
String[] excelFieldNames = new String[firstRow.length];
// 获取Excel中的列名
for (int i = 0; i < firstRow.length; i++) {
excelFieldNames[i] = firstRow[i].getContents().toString()
.trim();
}
// 判断需要的字段在Excel中是否都存在
boolean isExist = true;
List excelFieldList = Arrays.asList(excelFieldNames);
LinkedHashMap enfiledMap = new LinkedHashMap();
// 给对象中的sheet所对应的普通字段
for (Entry> entry : fieldMap
.entrySet()) {
// 获取中文字段名
String enSheetName = entry.getKey();
// 获取英文字段名
if (enSheetName.equals(singleSheetName)) {
enfiledMap = entry.getValue();
for (String cnName : enfiledMap.keySet()) {
if (!excelFieldList.contains(cnName)) {
isExist = false;
break;
}
}
}
}
// 如果有列名不存在,则抛出异常,提示错误
if (!isExist) {
throw new ExcelException("Excel中缺少必要的字段,或字段名称有误");
}
// 将列名和列号放入Map中,这样通过列名就可以拿到列号
LinkedHashMap colMap = new LinkedHashMap();
for (int i = 0; i < excelFieldNames.length; i++) {
colMap.put(excelFieldNames[i], firstRow[i].getColumn());
}
// 给对象中的sheet所对应的确定重复字段
for (Entry fields : uniqueFields.entrySet()) {
// 获取中文字段名
String enSheetName = fields.getKey();
String[] enuniqueFile=null;
// 获取英文字段名
if (enSheetName.equals(singleSheetName)) {
enuniqueFile = fields.getValue();
// 判断是否有重复行
// 1.获取uniqueFields指定的列
Cell[][] uniqueCells = new Cell[enuniqueFile.length][];
for (int i = 0; i < enuniqueFile.length; i++) {
int col = colMap.get(enuniqueFile[i]);
uniqueCells[i] = sheet.getColumn(col);
}
// 2.从指定列中寻找重复行
for (int i = 1; i < realRows; i++) {
int nullCols = 0;
for (int j = 0; j < enuniqueFile.length; j++) {
String currentContent = uniqueCells[j][i].getContents();
Cell sameCell = sheet.findCell(currentContent,
uniqueCells[j][i].getColumn(),
uniqueCells[j][i].getRow() + 1,
uniqueCells[j][i].getColumn(),
uniqueCells[j][realRows - 1].getRow(), true);
if (sameCell != null) {
nullCols++;
}
}
if (nullCols == enuniqueFile.length) {
throw new ExcelException("Excel中有重复行,请检查");
}
}
}
}
// 将sheet转换为list
for (int i = 1; i < realRows; i++) {
if (enClassName!=null) {
// 新建要转换的对象
T entity = (T) enClassName.newInstance();
// 给对象中的字段赋值
for (Entry entry : enfiledMap.entrySet()) {
// 获取中文字段名
String cnNormalName = entry.getKey();
// 获取英文字段名
String enNormalName = entry.getValue();
// 根据中文字段名获取列号
int col = colMap.get(cnNormalName);
// 获取当前单元格中的内容
String content = sheet.getCell(col, i).getContents()
.toString().trim();
// 给对象赋值
setFieldValueByName(enNormalName, content, entity);
}
resultList.add(entity);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return resultList;
}
(2)在web的pom文件里添加相关依赖:
com.tgb
itoo-assess-tool
0.0.1-SNAPSHOT
3、配置SpringMVC
(1)前台Jsp代码
导入
(2)前台js代码
function uploadExcel(){
//得到上传文件的全路径
var fileName= $('#uploadExcel').filebox('getValue')
//进行基本校验
if(fileName==""){
alert("请选择上传文件!");
}else{
//对文件格式进行校验
var d1=/\.[^\.]+$/.exec(fileName);
if(d1==".xls"){
$('#Manage').form('submit', {
url : "${pageContext.request.contextPath}/student/import",
onSubmit : function() {
return $(this).form('validate');
},
success : function(result) {
var result = eval('(' + result + ')');
if (result.errorMsg) {
$.messager.show({
title : 'Error',
msg : result.errorMsg
});
} else {
$.messager
.alert(
"提示",
"导入成功!",
"info");
$('#studentImport').dialog('close'); // close the dialog
$('#dg').datagrid('reload'); // reload the Student data
}
}
});
}else{
alert("请选择xls格式文件!");
$('#uploadExcel').filebox('setValue','');
}
}
}
//导入学生
function importTeacehr(){
$('#studentImport').dialog('open').dialog('setTitle', '批量导入');
}
(3)后台Controller代码
private ExcelUtil excelUtil;
public ExcelUtil getExcelUtil() {
return excelUtil;
}
public void setExcelUtil(ExcelUtil excelUtil) {
this.excelUtil = excelUtil;
}
/**
* 导出excel模板
* @param request请求
* @param resposne 响应
* @throws UnsupportedEncodingException编码异常
*/
@RequestMapping("/student/leadToExcelTemplet")
public void leadToExcelQuestionBankTemplet(HttpServletRequest request,
HttpServletResponse response) throws UnsupportedEncodingException {
excelUtil=new ExcelUtil();
try {
// excel表格的表头,map
LinkedHashMap fieldMap = new LinkedHashMap();
fieldMap.put("code","学号");
fieldMap.put("name","姓名");
fieldMap.put("sex","性别");
fieldMap.put("institution", "学院");
……
fieldMap.put("class", "班级");
// excel的sheetName
String sheetName = 学生信息";
// 导出
excelUtil.leadToExcel(fieldMap, sheetName,
response);
System.out.println("导出模板成功~~~~");
} catch (ExcelException e) {
e.printStackTrace();
}
}
/**
* @MethodName : importTeacher
* @Description : 导入
* @throws Exception
*/
@RequestMapping("/student/import")
public void importTeacher(
@RequestParam("uploadExcel") CommonsMultipartFile uploadExcel,
HttpServletResponse response, HttpServletRequest request) throws Exception {
String result="error";
jacksonJsonUntil =new JacksonJsonUntil();
InputStream in;
excelUtil=new ExcelUtil();
boolean flag = false;
try {
in = uploadExcel.getInputStream();
String sheetName = null;
// 导入Excel前的准备工作
LinkedHashMap normalFieldMap = new LinkedHashMap();
// 1.设置Excel中字段名和类的普通属性名的对应关系,如:用户的用户名等
fieldMap.put("code","学号");
fieldMap.put("name","姓名");
fieldMap.put("sex","性别");
fieldMap.put("institution", "学院");
……
fieldMap.put("class", "班级");
sheetName = "学生信息";
String[] uniqueFields = { "学号", "姓名", "班级" };
int error=excelUtil.importExcel(in, Teacher.class, normalFieldMap, referFieldMap,thirdFieldMap, uniqueFields, response);
if (error==0) {
result="success";
}
} catch (Exception e) {
e.printStackTrace();
}
jacksonJsonUntil.beanToJson(response, result);
}
数据上传经验--导入Excel就分享到这里,下篇博客继续分享数据下载经验--《导出Excel》。