“ 机遇与挑战并存,努力的人会更加幸运。相信。” —— 23号老板
原创:凌空夜望,CSDN
最近在做SpringBoot项目,项目中需要上传Excel文件,对Excel文件中的内容进行解析,然后将需要的数据存入数据库,同时还要根据用户的需求,将需要的内容生成Excel文件,并下载下来。本篇主要是介绍Excel文件的上传,然后对文件进行解析处理的过程。使用的开发工具是IDEA 。
内容概要:
一、项目maven依赖
需要注意的是:这里选择的poi-ooxml和poi的依赖版本最好一致,否则可能会有两个依赖会出现不匹配的问题。本人曾遇到过poi-ooxml的版本是3.9,poi的版本是3.13,最终在测试阶段报错:
java.lang.IllegalAccessError: tried to access method org.apache.poi.util.POILogger.log(ILjava/lang/Object;)V from class org.apache.poi.openxml4j.opc.PackageRelationshipCollection
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
</dependency>
二、Controller层
/**
* 上传Excel文件
* @param request
* @return
* @throws Exception
*/
@PostMapping(value = "excel/upload")
@ResponseBody
public String uploadExcel(HttpServletRequest request) throws Exception {
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
MultipartFile file = multipartRequest.getFile("filename");
if (file.isEmpty()) {
return "文件不能为空";
}
InputStream inputStream = file.getInputStream();
List<List<Object>> list = HandleFile.parseExcel(inputStream,file.getOriginalFilename());
inputStream.close();
for (int i = 0; i < list.size(); i++) {
List<Object> lo = list.get(i);
//TODO 随意发挥
//可以将数据遍历出来后,存储到数据库中
System.out.println(lo);
}
return "上传成功";
}
三、HandleFile工具类
/**
* 解析Excel文件
*
* @param in
* @param fileName
*/
public static List<List<Object>> parseExcel(InputStream in, String fileName) throws Exception {
List list = null;
Workbook work = null;
list = new ArrayList<>();
//创建Excel工作薄
work = getWorkbook(in, fileName);
if (null == work) {
throw new Exception("创建Excel工作薄为空!");
}
Sheet sheet = null;
Row row = null;
Cell cell = null;
for (int i = 0; i < work.getNumberOfSheets(); i++) {
sheet = work.getSheetAt(i);
if (sheet == null) {
continue;
}
for (int j = sheet.getFirstRowNum(); j <= sheet.getLastRowNum(); j++) {
row = sheet.getRow(j);
if (row == null || row.getFirstCellNum() == j) {
continue;
}
List<Object> li = new ArrayList<>();
for (int y = row.getFirstCellNum(); y < row.getLastCellNum(); y++) {
cell = row.getCell(y);
li.add(cell);
}
list.add(li);
}
}
return list;
}
四、测试:增加静态页面和测试文件
目录结构:
静态页面:index.html
测试文件:test.xlsx
注意:访问静态页面的前端端口是在下图定义的,和访问项目的端口不是同一个
具体的访问路径是:http://localhost:8081/自己的项目名/templates/index.html
五、最终测试的结果: