编程思路:
- 前端input读取xls、xlsx的Excel文件;
- 使用js的formData封装文件和其他数据;
- 使用ajax请求发送到后台,注意:contentType和processData要设置成false;
- 后台使用MultipartFile接收文件,使用Workbook、Sheet、Row、Cell解析Excel;
- 使用ArrayList<ArrayList<Object>>接收数据,解析完毕。
引入依赖
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<!--解析json的jar包-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.10</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<!--接收Excel对象使用-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.0.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
<!--解析Excel对象使用-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.0.0</version>
</dependency>
前端页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Excel</title>
<script type="text/javascript" src="/demo/lib/jquery-3.4.1.min.js"></script>
</head>
<body>
<input type="file" id="file"><button id="submit">提交</button>
</body>
</html>
<script type="text/javascript">
$("#submit").click(function(){
var str="我是一个字符串"; //定义字符串
var array=["我","是","数","组"]; //定义数组
var file=$("#file").get(0).files[0]; //定义并获取文件,get(0)是将jquery对象转换为js对象,files[0]是获取这个文件。0代表第一个文件,由于只传了一个文件所以下标为0
var formData=new FormData();
formData.append("str",str);
formData.append("array",JSON.stringify(array));
formData.append("file",file);
$.ajax({
url:"/demo/index/analysisExcel",
type:"post",
data:formData,
contentType:false,
processData:false,
success:function (data) {
alert(data);
},
error:function () {
alert("error");
}
});
});
</script>
注意:"contentType:false"和"processData:false"绝对不能少,不然会无法传递文件
后台java解析代码
package com.example.demo.controller;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
/**
* @Description TODO
* @Author wangs
* @Date 2019/12/311:16
*/
@Controller
@RequestMapping("/index/")
public class IndexController {
@RequestMapping("toExcelPage")
public String toExcelPage(){
return "web/excel";
}
@RequestMapping("analysisExcel")
@ResponseBody
public String analysisExcel(MultipartFile file,String str,String array) throws IOException { //注意和前端名字保持一致
ObjectMapper objectMapper =new ObjectMapper();
String nativeStr =str; //获取字符串
InputStream inputStream = null;
try {
List<String> arrayList =(List)objectMapper.readValue(array, List.class); //读取前端数组存在list中
inputStream =file.getInputStream();//获取前端传递过来的文件对象,存储在“inputStream”中
String fileName = file.getOriginalFilename();//获取文件名
Workbook workbook =null; //用于存储解析后的Excel文件
//判断文件扩展名为“.xls还是xlsx的Excel文件”,因为不同扩展名的Excel所用到的解析方法不同
String fileType = fileName.substring(fileName.lastIndexOf("."));
if(".xls".equals(fileType)){
workbook= new HSSFWorkbook(inputStream);//HSSFWorkbook专门解析.xls文件
}else if(".xlsx".equals(fileType)){
workbook = new XSSFWorkbook(inputStream);//XSSFWorkbook专门解析.xlsx文件
}
ArrayList<ArrayList<Object>>list =new ArrayList<>();
Sheet sheet; //工作表
Row row; //行
Cell cell; //单元格
//循环遍历,获取数据
for(int i=0;i<workbook.getNumberOfSheets();i++){
sheet=workbook.getSheetAt(i);//获取sheet
for(int j=sheet.getFirstRowNum();j<=sheet.getLastRowNum();j++){//从有数据的第行开始遍历
row=sheet.getRow(j);
if(row!=null&&row.getFirstCellNum()!=j){ //row.getFirstCellNum()!=j的作用是去除首行,即标题行,如果无标题行可将该条件去掉
ArrayList tempList =new ArrayList();
for(int k=row.getFirstCellNum();k<row.getLastCellNum();k++){//这里需要注意的是getLastCellNum()的返回值为“下标+1”
cell =row.getCell(k);
tempList.add(cell);
}
list.add(tempList);
}
}
}
System.out.println("我是读取的字符串:"+nativeStr);
System.out.println("我是读取的数组:"+arrayList.toString());
System.out.println("我是解析的Excel:"+list.toString());
} catch (IOException e) {
e.printStackTrace();
}finally {
inputStream.close();
}
return "success";
}
}
进入页面,选择文件,点击提交
Excel中的的内容:
后台解析结果
成功!