[Spring boot] Spring boot 实现Excel批量导入数据并将文件保存到本地
🍳作者:天海奈奈
💭眼过千遍不如手锤一遍:推荐一款模拟面试,斩获大厂 o f f e r ,程序员的必备刷题平台 − − 牛客网
👉🏻点击开始刷题之旅
目录
前言
成果展示
了解Excel表格基本属性
表设计
引入依赖
工具类
Controller
entity
Mapper
UserService
测试
总结
前言
当我们给数据库中的表中添加数据时一般都是进入图形化界面进行手动添加,或者进直接导入现成的sql文件,但是有的时候我们会需要去导入大量的数据,这个时候我们不论是使用写好的接口还是去图形化界面添加都是十分费时费力的,这个时候使用Excel读取表格数据并进行导入就十分有必要了。本篇更着重于单个功能的开发,不会从头构建一个项目。
成果展示
只是为了证明功能正常运行所以并没有加太多
了解Excel表格基本属性
workbook :一整个表格文件
一个文件中有多个sheet
row 是 行
cell是一个单元格
这是打开了一个表跟文件,可以看出是可以有多个Sheet的,知道这几点也就够用了
表设计
这里使用的是我之前的用户表。
字段比较多我们只取关注2~4 也就是用户名,密码,个性签名.id是自增的我们导入数据也不会去有用户id这一项。这三个都是varchar类型,一会儿传入时转成String类型就行,如果是int的话我们需要先转成Double再使用intValue即可。
引入依赖
<!-- 表格处理-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.16</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.16</version>
</dependency>
工具类
public class ExcelUtil {
public static Object getCellValue(Cell cell){
switch (cell.getCellTypeEnum()){
//字符串
case STRING:
return cell.getStringCellValue();
//布尔
case BOOLEAN:
return cell.getBooleanCellValue();
//数值
case NUMERIC:
return cell.getNumericCellValue();
}
return null;
}
}
Controller
@PostMapping("/send/upload")
@ResponseBody
public ApiRestResponse uploadUser(@RequestParam("file")MultipartFile multipartFile) throws IOException {
//获取文件名
String fileName = multipartFile.getOriginalFilename();
String fixName = fileName.substring(fileName.lastIndexOf("."));
//生成唯一UUID
UUID uuid = UUID.randomUUID();
String newFileName = uuid.toString() + fixName;
//创建文件
File file = new File(Constant.FILE_UPLOAD_DIR);
File destFile = new File(Constant.FILE_UPLOAD_DIR + newFileName);
if(!file.exists()){
if(!file.mkdir()){
throw new XatuMallException(0000000,"文件创建失败");
}
}
try {
multipartFile.transferTo(destFile);
} catch (IOException e) {
e.printStackTrace();
}
userService.addUserList(destFile);
return ApiRestResponse.success();
}
这里注意,我们这个文件地址是需要配置的,并不是写一个路径就行。Springboot图片上传_天海奈奈的博客-CSDN博客_springboot 图片上传
配置方法这里有说,但是要记得还要在appli那个配置文件里加一行
file.upload.dir=D:/pictures/ 每个人不一样,但是这与你contant类里的地址是绑定的
entity
public class User {
private Integer id;
private String username;
private String password;
private String personalizedSignature;
private Integer role;
private Date createTime;
private Date updateTime;
private String emailAddress;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username == null ? null : username.trim();
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password == null ? null : password.trim();
}
public String getPersonalizedSignature() {
return personalizedSignature;
}
public void setPersonalizedSignature(String personalizedSignature) {
this.personalizedSignature = personalizedSignature == null ? null : personalizedSignature.trim();
}
public Integer getRole() {
return role;
}
public void setRole(Integer role) {
this.role = role;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Date getUpdateTime() {
return updateTime;
}
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
public String getEmailAddress() {
return emailAddress;
}
public void setEmailAddress(String emailAddress) {
this.emailAddress = emailAddress == null ? null : emailAddress.trim();
}
}
Mapper
public interface UserMapper {
User selectByName(String username);
}
xml
<select id="selectByName" parameterType="java.lang.String" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"></include>
from xatu_mall_user
where username = #{username,jdbcType=VARCHAR}
</select>
理解原理就好,不要去纠结表名。
UserService
Imp
@Override
public void addUserList(File destFile) throws IOException {
List<User> users = readUsersFromExcel(destFile);
for (int i = 0; i < users.size(); i++){
User user = users.get(i);
User userOld = userMapper.selectByName(user.getUsername());
if(userOld != null){
System.out.println("重名");
}
int count = userMapper.insertSelective(user);
if(count == 0){
System.out.println("添加失败");
}
}
}
private List<User> readUsersFromExcel(File excelFile) throws IOException {
ArrayList<User> listUser =new ArrayList<>();
FileInputStream fileInputStream = new FileInputStream(excelFile);
XSSFWorkbook xssfWorkbook = new XSSFWorkbook(fileInputStream);
XSSFSheet firstSheet = xssfWorkbook.getSheetAt(0);
Iterator<Row> iterator = firstSheet.iterator();
while(iterator.hasNext()){
org.apache.poi.ss.usermodel.Row nextRow = iterator.next();
Iterator<Cell> cellIterator = nextRow.cellIterator();
User aUser = new User();
while(cellIterator.hasNext()){
Cell nextCell = cellIterator.next();
int columnIndex = nextCell.getColumnIndex();
switch (columnIndex){
case 0:
aUser.setUsername((String) ExcelUtil.getCellValue(nextCell));
break;
case 1:
aUser.setPassword((String) ExcelUtil.getCellValue(nextCell));
break;
case 2:
aUser.setPersonalizedSignature((String) ExcelUtil.getCellValue(nextCell));
break;
}
}
listUser.add(aUser);
}
xssfWorkbook.close();
fileInputStream.close();
return listUser;
}
重名那里偷懒了,按理说应该抛出异常的。
void addUserList(File destFile) throws IOException;
测试
打开postman 这里需要注意的地方是我们是postMapping 并且
选择的是Body 和form-data
后面就能去选择我么要读取的表格文件了,但是我们读取的是xlsx xls是不能读的,你改后缀也是不行的,要建立时就是xlsx。
总结
这个技术也是很实用的技术,让我们可以很便捷的快速从表格中读取数据并将数据上传。文件保存到本地可以去看放的链接,实际上与上传图片是一样的。