SSM读取excel文件更新数据库

需求

模仿新增库存的功能,前端上传excel文件(.xlsx)传入后端实现批量增加。

依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!--        adding support for multipart file upload functionality to servlets and web applications-->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
<!-- Java API To Access Microsoft Format Files-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>
<!-- Java API To Access Microsoft Format Files-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>

这里我之前犯了一个错误,我在导入1.3.3版本commons-fileupload的同时,还导入了2.4版本commons-io的依赖,最后启动项目的时候会有冲突,原因是commons-fileupload中已经包含有了commons-io且版本不同,故产生冲突。

前端

1
2
3
4
<form action="${pageContext.request.contextPath}/book/batchAdd" method="post" enctype="multipart/form-data">
选择文件:<input type="file" name="file">
<input type="submit" value="提交">
</form>

enctype就是encodetype就是编码类型的意思。

multipart/form-data是指表单数据有多部分构成,既有文本数据,又有文件等二进制数据的意思。

需要注意的是:默认情况下,enctype的值是application/x-www-form-urlencoded,不能用于文件上传,只有使用了multipart/form-data,才能完整的传递文件数据。

application/x-www-form-urlencoded不是不能上传文件,是只能上传文本格式的文件,multipart/form-data是将文件以二进制的形式上传,这样可以实现多种类型的文件上传。

Controller

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@RequestMapping("/batchAdd")
public String batchAdd(MultipartFile file) throws IOException, InvalidFormatException {

String originalFileName = file.getOriginalFilename(); // 获取原文件的名字,这里是books.xlsx
String myPath = "D:\\fileupload\\"+originalFileName;
file.transferTo(new File(myPath)); // 把获取到的文件file转化到目标文件,这里是在目录里创建了一个同样的文件

XSSFWorkbook wb = new XSSFWorkbook(new File(myPath)); // 当文件后缀为xlsx时用XSSFWorkbook

XSSFSheet xssfSheet = wb.getSheetAt(0); // 因为这文件里只有一张sheet,所以直接getSheetAt(0)写死

if (xssfSheet != null) {
for (int rowNum = 1; rowNum <= xssfSheet.getLastRowNum(); rowNum++) {
XSSFRow xssfRow = xssfSheet.getRow(rowNum); // 获取行
Books books = new Books(); // 对每一行创建一个对象
books.setBookName(xssfRow.getCell(0).getStringCellValue());
books.setBookCounts((int)xssfRow.getCell(1).getNumericCellValue());
books.setDetail(xssfRow.getCell(2).getStringCellValue());
bookService.addBook(books); //执行addBook把每一个对象加进去
}
}
return "redirect:/book/allBook";
}