需求描述:一个Excel文档中有三个sheet,需要根据不同的上传按钮,解析不同的sheet中的数据,组装成一个List
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>文件上传</title>
</head>
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
<body>
<form enctype="multipart/form-data">
<input type="file" name="file" id="file">
<input name="query" type="button" value="导入excel">
</form>
</body>
<script type="text/javascript">
$('input[name="query"]').click(function(){
var fd = new FormData();
fd.append("sheetNo", 2); //上传的参数名 参数值 k-v键值对
fd.append("file", $("#file").get(0).files[0]);//上传的文件file
$.ajax({
url:"/jiexi",
type:"post",
data:fd,
cache: false,
processData: false,
contentType: false,
success:function(data){
console.log(data);
alert("操作成功!");
},
error:function(e){
alert("网络错误,请重试!!");
}
});
})
</script>
</html>
二、为了数据的使用方便,我们根据表头的长度和传入的sheet1、sheet2、sheet3来判断。直接放代码
/**
* 功能描述:解析Excel接口
* @param file MultipartFile
* @param sheetNo int
* @return Object
* @author:qhyu
* @date:2018年8月15日
*/
@PostMapping(value = "/jiexi")
public Object jiexi(MultipartFile file,int sheetNo) throws IOException {
String fileName = file.getOriginalFilename();
// 判断文件是.xlsx或者xls结尾。如果不是则抛出提示信息
String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
if (!"xlsx".equals(suffix) && !"xls".equals(suffix)) {
System.out.println("请传入excel文件");
}
return getList(suffix, file.getInputStream(),sheetNo);
}
/**
* 功能描述: 获取解析excel的数据
* @param suffix String
* @param inputStream InputStream
* @param sheetNo int
* @return ArrayList<Object>
* @author:qhyu
* @date:2018年8月15日
*/
private ArrayList<Object> getList(String suffix, InputStream inputStream,int sheetNo) throws IOException {
ArrayList<Object> arrayList = new ArrayList<Object>();
// 具体执行导入,可以引入策略模式
// 解决excel2003和excel2007版本的问题
if ("xlsx".equals(suffix)) {
xlsxImp(inputStream, arrayList,sheetNo);
}
if ("xls".equals(suffix)) {
xlsImp(inputStream, arrayList,sheetNo);
}
// 万一新增一种新格式,对修改打开了,不符合oo编程规范
return arrayList;
}
/**
* 功能描述:2003xls导入查询
* @param inputStream InputStream
* @param arrayList ArrayList<Object>
* @author:qhyu
* @date:2018年8月15日
*/
private void xlsImp(InputStream inputStream, ArrayList<Object> arrayList, int index) throws IOException {
// 初始整个Excel
HSSFWorkbook workbook = new HSSFWorkbook(inputStream);
// 获取第一个sheet表
HSSFSheet sheet = workbook.getSheetAt(0);
for (int rowIndex = 2; rowIndex < sheet.getLastRowNum(); rowIndex++) {
HashMap<String, Object> hashMap = new HashMap<String, Object>();
HSSFRow row = sheet.getRow(rowIndex);
//整行都为空去掉
if(row==null) {
continue;
}
for (int cellIndex = 0; cellIndex < row.getLastCellNum(); cellIndex++) {
HSSFCell cell = row.getCell(cellIndex);
// 避免空指针异常
if (cell == null) {
hashMap.put(getKey(inputStream, index, cellIndex), " ");
continue;
}
// 判断格式
if (cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {
SimpleDateFormat sFormat = new SimpleDateFormat("yyyy-MM-dd");
Date date = HSSFDateUtil.getJavaDate(cell.getNumericCellValue());
hashMap.put(getKey(inputStream, index, cellIndex), sFormat.format(date));
} else if (cell.getCellType() == HSSFCell.CELL_TYPE_STRING) {
hashMap.put(getKey(inputStream, index, cellIndex), cell.getStringCellValue());
} else if (cell.getCellType() == HSSFCell.CELL_TYPE_FORMULA) {
hashMap.put(getKey(inputStream, index, cellIndex), cell.getCellFormula().toString());
} else if (cell.getCellType() == HSSFCell.CELL_TYPE_BLANK
|| cell.getCellType() == HSSFCell.CELL_TYPE_BOOLEAN
|| cell.getCellType() == HSSFCell.CELL_TYPE_ERROR) {
hashMap.put(getKey(inputStream, index, cellIndex), " ");
}
}
if (hashMap.containsValue(" ") || hashMap.containsValue(null)
|| hashMap.size() < sheet.getRow(0).getLastCellNum()) {
continue;
} else {
arrayList.add(hashMap);
}
}
}
/**
* 功能描述:2007xlsx导入查询
* @param inputStream InputStream
* @param arrayList ArrayList<Object>
* @author:qhyu @date:2018年8月15日
*/
private void xlsxImp(InputStream inputStream, ArrayList<Object> arrayList,int index) throws IOException {
XSSFWorkbook xssfWorkbook = new XSSFWorkbook(inputStream);
XSSFSheet sheet = xssfWorkbook.getSheetAt(index);
for (int rowIndex = 2; rowIndex <= sheet.getLastRowNum(); rowIndex++) {
HashMap<String, Object> hashMap = new HashMap<String, Object>();
XSSFRow row = sheet.getRow(rowIndex);
//整行都为空去掉
if(row==null) {
continue;
}
for (int cellIndex = 0; cellIndex < row.getLastCellNum(); cellIndex++) {
XSSFCell cell = row.getCell(cellIndex);
// 避免空指针异常
if (cell == null) {
hashMap.put(getKey(inputStream, index, cellIndex), " ");
continue;
}
// 判断是否是日期格式
if (cell.getCellType() == XSSFCell.CELL_TYPE_NUMERIC) {
SimpleDateFormat sFormat = new SimpleDateFormat("yyyy-MM-dd");
Date date = HSSFDateUtil.getJavaDate(cell.getNumericCellValue());
hashMap.put(getKey(inputStream, index, cellIndex), sFormat.format(date));
} else if (cell.getCellType() == XSSFCell.CELL_TYPE_STRING) {
hashMap.put(getKey(inputStream, index, cellIndex), cell.getStringCellValue());
} else if (cell.getCellType() == HSSFCell.CELL_TYPE_FORMULA) {
hashMap.put(getKey(inputStream, index, cellIndex), cell.getCellFormula().toString());
} else if (cell.getCellType() == XSSFCell.CELL_TYPE_BLANK
|| cell.getCellType() == XSSFCell.CELL_TYPE_BOOLEAN
|| cell.getCellType() == XSSFCell.CELL_TYPE_ERROR) {
hashMap.put(getKey(inputStream, index, cellIndex), " ");
}
}
if (hashMap.containsValue(" ") || hashMap.containsValue(null)
|| hashMap.size() < sheet.getRow(0).getLastCellNum()) {
continue;
} else {
arrayList.add(hashMap);
}
}
}
/**
* 功能描述:根据表头获取key值
* @param inputStream InputStream
* @return String
* @author:qhyu
* @date:2018年8月16日
*/
public static String getKey(InputStream inputStream, int index, int cell) {
String result = null;
// sheet1(客票核验身份证查询)
if (index == 0) {
switch (cell) {
case 0:
result="CardID";
break;
case 1:
result="FlightNo";
break;
case 2:
result="Segment";
break;
case 3:
result="Time";
break;
default:
break;
}
}
// sheet2(客票核验票号查询)
if (index == 1) {
switch (cell) {
case 0:
result="TicketNo";
break;
case 1:
result="FlightNo";
break;
case 2:
result="Segment";
break;
case 3:
result="Time";
break;
default:
break;
}
}
// sheet3(客票追踪)
if (index == 2) {
switch (cell) {
case 0:
result="TicketNo";
break;
default:
break;
}
}
return result;
}
controller中的方法区分了2003和2007版本,也就是xls和xlsx的区别,测试的时候需要另存为改后缀名,直接修改后缀是不行的。大部分是贴代码,自己测试过没有发现问题。