记一次Java实现导入Excel相关

前言 :在开发的业务中,我们通常都会遇到有数据的导入导出相关功能,以下是一种Excel 实现导入相关历程

注:因为现在大多数都是使用的Spring Boot微服务,使用Maven作为Jar包仓库,以下代码都是在Spring Boot环境下开发的

1. 准备

项目中添加相关的Excel相关操作的Maven依赖:

1
2
3
4
5
6
7
8
9
10
11
12
<!-- 实现对2007以下的Excel操作 xls -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.13</version>
</dependency>
<!-- 实现对2007以上的Excel操作 xlsx -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.13</version>
</dependency>

2. 相关导入代码实现

控制层代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
/**
* 导入Excel中的数据相关
* @param file
* @return
*/
@PostMapping("importExcel")
public Response importExcel(MultipartFile file) throws IOException {
if (!ExcelUtils.checkFile(file)){
return Response.initFail("文件格式无法通过");
}
Workbook workbook = ExcelUtils.getWorkBook(file);
List<Users> list = new ArrayList<>();
if (workbook != null) {
// 如果一个Excel中有多个sheet,遍历获取,如果只有一个使用workbook.getSheetAt(0);
for(int sheetNum = 0; sheetNum < workbook.getNumberOfSheets(); ++sheetNum) {
Sheet sheet = workbook.getSheetAt(sheetNum);
// 这是找到对应sheet导入需要的列相关信息
if ((sheet != null && sheet.getSheetName().equals("Users"))) {
int firstRowNum = sheet.getFirstRowNum();
/**
* 这里记一下,如果是一个新建的Excel文件,数据有多少行,获取的就是多少行
* 如果一个sheet中有100条数据,手动清空了50条,按理说获取时拿到的是50,
* 但是Excel中仍然获取的是100条,清空的数据行数据是空字符串,
* 因此在获取数据的时候需要对数据进行非空判断处理
*/
int lastRowNum = sheet.getLastRowNum();

// 遍历获取每行数据
for(int rowNum = firstRowNum + 1; rowNum <= lastRowNum; ++rowNum) {
Row row = sheet.getRow(rowNum);
// 对每行数据进行非空判断处理
if (row != null && !ExcelUtils.isRowEmpty(row)) {
int firstCellNum = row.getFirstCellNum();
int lastCellNum = row.getLastCellNum();
if (lastCellNum > 0) {
Users info = new Users();
// 遍历获取每列数据
for(int cellNum = firstCellNum; cellNum < lastCellNum; ++cellNum) {
Cell cell = row.getCell(cellNum);
if (cell != null) {
cell.setCellType(1);
switch(cellNum) {
case 0:
info.setUserName(cell.getStringCellValue());
break;
case 1:
info.setLoginName(cell.getStringCellValue());
break;
case 2:
info.setLoginPassword(cell.getStringCellValue());
break;
case 3:
info.setEmail(cell.getStringCellValue());
break;
case 4:
info.setPhone(Integer.parseInt(cell.getStringCellValue()));
break;
case 5:
info.setAddress(cell.getStringCellValue());
break;
case 6:
info.setLoginDate(cell.getDateCellValue());
break;
case 7:
info.setLoginIp(cell.getStringCellValue());
}
}
}
list.add(info);
}
}
}
}
}
}

// 然后将获取的 list 集合进行接下来的相关处理
// do something 。。。。。。。。。。。
return null;
}

3. 工具类 ExcelUtils的相关代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
package com.novel.common.poi;

import com.novel.common.core.utils.string.StringUtils;
import com.novel.common.file.utils.file.FileTypeUtils;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;

/**
* @author: zxj
* @date: 2021-04-01 11:24:02
* @tags: Excel相关操作的工具类
*/
public class ExcelUtils {

/**
* 获取当前文件操作对象
* @param file
* @return
*/
public static Workbook getWorkBook(MultipartFile file) {
String fileName = file.getOriginalFilename();
Object workbook = null;

try {
InputStream is = file.getInputStream();
if (fileName.endsWith("xls")) {
workbook = new HSSFWorkbook(is);
} else if (fileName.endsWith("xlsx")) {
workbook = new XSSFWorkbook(is);
}
} catch (IOException var4) {
var4.getMessage();
}

return (Workbook)workbook;
}

/**
* 校验文件 这里只是大概校验,按理说应该校验文件头信息
* @param file
* @throws IOException
*/
public static boolean checkFile(MultipartFile file) throws IOException {
if (null == file) {
return false;
}

String fileName = file.getOriginalFilename();
if (!fileName.endsWith("xls") && !fileName.endsWith("xlsx")) {
return false;
}else{
String fileType = FileTypeUtils.getFileType(file.getInputStream());
if (!fileType.equals("xls") && !fileType.equals("xlsx")){
return false;
}
}
return true;

}

/**
* 空行数据判断
* @param row
* @return
*/
public static boolean isRowEmpty(Row row) {
if (null == row) {
return true;
} else {
int firstCellNum = row.getFirstCellNum();
int lastCellNum = row.getLastCellNum();
int nullCellNum = 0;

for(int c = firstCellNum; c < lastCellNum; ++c) {
Cell cell = row.getCell(c);
if (null != cell && 3 != cell.getCellType()) {
cell.setCellType(1);
String cellValue = cell.getStringCellValue().trim();
if (StringUtils.isEmpty(cellValue)) {
++nullCellNum;
}
} else {
++nullCellNum;
}
}

if (nullCellNum == lastCellNum - firstCellNum) {
return true;
} else {
return false;
}
}
}
}