框架Spring + Mybatis + SpringMVC.
使用jar包: poi-ooxml 3.15-beta2 注意: 不同的poi的jar包所带有的功能是不一样的.如果你的项目中使用了其他poi的jar包而导致以下代码在你的项目中提示报错,请自行甄别.
先写一个基础的上传jsp
需要用到两个 js :
jquery-3.3.1.min.js
ajaxfileupload.js
上传Excel//点击 a 标签, 触发 input 框, 选择要上传的文件
function uploadExcel(){
document.getElementById("excel").click();
}
//注意 input 中的 onchange -- 表名到选中文件之后,会触发方法ajaxFileUpload().
function ajaxFileUpload() {
// 进行ajax 上传.
$.ajaxFileUpload({
url : '/admin/test/importExcel.do',//url.
secureuri : false,//是否启用安全提交,默认为false。
fileElementId : 'excel',//需要上传的文件域的ID,即的ID。
dataType : 'String',//服务器返回的数据类型(有json和String)
data : {/*filetype : "images"*/},// 自定义参数
type: 'post',//当要提交自定义参数时,这个参数要设置成post
success : function(data, status) {
alert("上传成功"+data);
},
error : function(data, status, e) {
alert("上传失败");
}
})
return false;
}
以上, 就只是一个简单的上传页面 , 该页面不仅使用上传Excel, 确切的说, 任何资源的上传都可以用上这个简化版.其中一些参数自行替换成自己的即可.
注意: jsp中的input框中的name名称要和Controller层中指定方法上的参数名称相同:MultipartFile multipartFile ---->
接下来开始Controller的方法:@RequestMapping(value = "/importExcel", method = RequestMethod.POST)
@ResponseBody
public String importExcel(HttpServletRequest request, MultipartFile multipartFile) throws Exception {
//准备List容器进行存储数据
List> ListMap = new ArrayList>();
//利用Workbook接口和判断excel版本创建相应版本 HSSFWorkbook/XSSFWorkbook对象
org.apache.poi.ss.usermodel.Workbook workbook = null;
// 获取上传文件的原始名称
String filename = multipartFile.getOriginalFilename();
//获取文件后缀名称,如果后缀是xls则结果为true,如果为xlsx,则结果为false.
boolean isExcel2003 = filename.toLowerCase().endsWith("xls") ? true : false;
//根据不同版本,创建不同的EXCEL表格. 注意: 有的poi的jar包在这一步是不适用的.如果不适用则只能根据不同文件进行不同的方法处理了.
if (isExcel2003) {
workbook = new org.apache.poi.hssf.usermodel.HSSFWorkbook(multipartFile.getInputStream());
} else {
workbook = new org.apache.poi.xssf.usermodel.XSSFWorkbook(multipartFile.getInputStream());
}
//创建这个EXCEL的一页. 一个工作簿有多个sheet,可以把工作簿就看成一本书, sheet就是页. 每页里面就是一张Excel表格了.
org.apache.poi.ss.usermodel.Sheet sheet = workbook.getSheetAt(0);
//获取EXCEL第一页中(列头)的总列数.
int physicalNumberOfCells = sheet.getRow(0).getPhysicalNumberOfCells();
/**
* 通常第一行都是标题,所以从第二行开始读取数据.这要根据实际情况自行定义开始索引.
*/
for (int i = 1; i < sheet.getLastRowNum() + 1; i++) {
//准备容器
HashMap stringStringHashMap = new HashMap<>();
//获取这个一页中这个表格的一行数据.
org.apache.poi.ss.usermodel.Row row = sheet.getRow(i);
//如果该行里面存在数据.
if (row != null) {
//遍历这行的所有列,按顺序取值,并存入一个map中,key为列的顺序,value为EXCEL这一列的具体值
for (int j = 0; j < physicalNumberOfCells; j++) {
//指定每行每列的接收类型为String
String key = "" + j;
//获取每一列
org.apache.poi.ss.usermodel.Cell cell = row.getCell(j);
//准备接收列内容的容器.
String value = "";
//由于每一列的值类型都可能不同, 所以要根据不同类型进行转换, 否则取值时候会出现问题.
//如果列内容不为null
if (cell != null) {
//则判断是否为数值-- 数据又分两种: 日期和纯数字.
if (0 == cell.getCellType()) {
// 如果是日期类型.
if (org.apache.poi.hssf.usermodel.HSSFDateUtil.isCellDateFormatted(cell)) {
// 则以日期格式获取列值
Date date = cell.getDateCellValue();
//并指定日期格式,进行格式化
DateFormat formater = new SimpleDateFormat(
"yyyy-MM-dd");
value = formater.format(date);
} else {
//如果不是日期, 则为纯数字. 我在这里直接以String类型接收, 正常来讲是要用纯数字接收的.
cell.setCellType(org.apache.poi.ss.usermodel.Cell.CELL_TYPE_STRING);
value = cell.getStringCellValue();
}
} else {
//如果不为数值, 既不是日期也不是纯数字, 在这里, 统统设置成以字符串进行接收. 如果想具体区别接收,请自行百度.
cell.setCellType(org.apache.poi.ss.usermodel.Cell.CELL_TYPE_STRING);
value = cell.getStringCellValue();
}
} else {
//如果列内容为null, 则直接设置内容为 " ";
value = "";
}
//存储map中
if (StringUtils.isEmpty(value)) {
value = "";
}
//将这一列, 以列序号为key, 列内容为值, 存入准备好的map容器中.
stringStringHashMap.put(key, value);
}
//最后, 将这一行作为一个整体对象存进List中.
ListMap.add(stringStringHashMap);
} else {
break;
}
}
//以上, 就得到了上传进来的Excel中的数据.
/**---------------------------华丽的分割线---------------------------------*/
//以下,则可以对该数据进行自己项目的不同操作.
//最后,返回处理成功的标识即可.
return "true";
}
以上, 仅仅只是拿到了上传的Excel, 并将所有内容读取到由多个Map组成的List里面. 至于拿到表格数据后需要做什么具体操作, 直接对这个List里面的数据进行操作即可.