一直感觉excel表的导入有很多代码,写一次忘一次,类太多,要知道怎么获取Workbook、Sheet、Cell、row等等,这么多类不可能一直记的住,都是写过之后保存,使用的时候拿出来改改,更烦人的是针对office03和07获取方式还有区别。自从使用了hutool工具包,一切都变得那么丝滑。核心代码仅有一行。同时支持03和07。
ExcelReader excelReader = ExcelUtil.getReader(file.getInputStream());
使用步骤及代码示例如下:
导入模板
引入jar包
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-poi</artifactId>
<version>5.7.16</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
工具类,也可以放入service实现类中
@Component
public class Excel07Utils {
// static 属性的注入,如果是放入service实现类中,则不需要static修饰,直接注解注入
// 第一种,set注入
private static UserMapper userMapper;
@Resource
private void setUserMapper(UserMapper userMapper) {
Excel07Utils.userMapper = userMapper;
}
// 第二种,lombok的set注入,需要引入lombok包
// @Setter
// private static UserMapper userMapper;
// @Autowired
// private void userMapper(UserMapper userMapper) {
// setUserMapper(userMapper);
// }
/**
* 导入excel
* @param file
*/
public static String importExcel(MultipartFile file) {
List<User> userList = new ArrayList<>();
try {
// 核心操作,读取上传文件,转换为 ExcelReader 对象,然后通过ExcelReader对象转换成java类型或对象
ExcelReader excelReader = ExcelUtil.getReader(file.getInputStream());
// 表头字段检查
List<Object> firstRow = excelReader.readRow(0);
if (!"账号".equals(firstRow.get(0)) || !"姓名".equals(firstRow.get(1))) {
return "请勿修改模板中的表头字段";
}
//从第二行开始获取表格内容(第一行是中文表头)
List<List<Object>> list = excelReader.read(1);
if (list.isEmpty()) {
return "数据为空";
}
// 检查文件中是否有重复数据(例如账号不允许重复,一般是某个字段不允许重复)
// 利用set的不重复特性
Set<Object> accountSet = new HashSet<>();
for (List<Object> cell : list) {
User user = new User();
if (ObjectUtils.isEmpty(cell.get(0)) || ObjectUtils.isEmpty(cell.get(1))) {
return "数据存在空值";
}
user.setAccount(cell.get(0).toString());
user.setName(cell.get(1).toString());
userList.add(user);
accountSet.add(cell.get(0).toString());
}
if (list.size() != accountSet.size()) {
return "文件中有重复数据";
}
// 检查是否与数据库中数据重复
for (User user : userList) {
User entity = userMapper.selectByAccount(user.getAccount());
if (!ObjectUtils.isEmpty(entity)) {
return "数据库中已存在此账号:" + user.getAccount();
}
}
//保存至数据库
// userMapper.saveBatch(userList);
} catch (IOException e) {
e.printStackTrace();
}
return "success";
}
}
核心代码:ExcelReader excelReader = ExcelUtil.getReader(file.getInputStream());
核心类:ExcelReader
除了这一行核心代码,下面的全部是业务上的处理,都可以删除和修改。
如果这一行核心代码记不住的话,那就记住一个ExcelReader 核心类即可。通过ExcelReader可以获取业务数据和其他表格的操作。