springboot实现 将execl文件上传后 字段对应的存入MySQL数据库
- demo结构
- 新建一个数据库
- maven中一般的插件就不说了主要要加上这几个 来实现读excel
- 利用mybatis-generator自动生成dao层和User实体类以及mapper映射文件
- 再附上一个辅助的类
- 进入正题 开始编写service层
- service接口实现类的编写
- 这里读取excel内容用到的一个工具类 ExcelUtil 编写如下
- 最后编写controller
- 现在来试一下效果
- 利用Postman上传该excel 文件
- 查看数据库内数据
demo结构
最近项目需要下载一个excel模板 填入数据后上传 将模板内数据读入mysql 所以写了个小demo来验证技术是否可行
这个demo就是简单的实现将excel字段转存mysql 没有其他业务需求
新建一个数据库
一张表
uid为主键 自增 都为非空
maven中一般的插件就不说了主要要加上这几个 来实现读excel
其余的就mysql jdbc等常规的 就不贴出来了
<!--poi-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.9</version>
</dependency>
<!--上传下载的包-->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
利用mybatis-generator自动生成dao层和User实体类以及mapper映射文件
如果不会用 请看之前的博客
链接:
贴上User
package com.excel.entity;
import java.io.Serializable;
public class User implements Serializable {
private Integer uid;
private String username;
private String password;
private static final long serialVersionUID = 1L;
public Integer getUid() {
return uid;
}
public void setUid(Integer uid) {
this.uid = uid;
}
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();
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(getClass().getSimpleName());
sb.append(" [");
sb.append("Hash = ").append(hashCode());
sb.append(", uid=").append(uid);
sb.append(", username=").append(username);
sb.append(", password=").append(password);
sb.append(", serialVersionUID=").append(serialVersionUID);
sb.append("]");
return sb.toString();
}
}
再附上一个辅助的类
package com.excel.entity;
import lombok.Data;
/**
* @author: zty
* @date 2019/9/5 下午12:19
* des:用于存放excel的相关信息
*/
@Data
public class ReadExcel {
//总行数
private int totalRows = 0;
//总条数
private int totalCells = 0;
//错误信息收集
private String errorMsg;
}
进入正题 开始编写service层
package com.excel.service;
import com.excel.entity.User;
import org.springframework.web.multipart.MultipartFile;
/**
* @author: zty
* @date 2019/9/5 下午12:01
* des:
*/
public interface UserService {
/**
* 插入
*/
int insert(User user);
/**
* 读取excel文件
*/
String readExcelFile(MultipartFile file);
}
service接口实现类的编写
package com.excel.service.Impl;
import com.excel.dao.UserMapper;
import com.excel.entity.User;
import com.excel.service.UserService;
import com.excel.util.ExcelUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
/**
* @author: zty
* @date 2019/9/5 下午12:06
* des:
*/
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public int insert(User user) {
return userMapper.insert(user);
}
/**
* 文件导入
* @param file
* @return
*/
@Override
public String readExcelFile(MultipartFile file) {
String result = "";
ExcelUtil excelUtil = new ExcelUtil();
List<User> ilist = excelUtil.getExcelInfo(file);
if(ilist != null && !ilist.isEmpty()){
//不为空 加入数据库
for(User user :ilist){
userMapper.insert(user);
}
result = "上传成功";
}else{
result = "上传失败";
}
return result;
}
}
这里读取excel内容用到的一个工具类 ExcelUtil 编写如下
package com.excel.util;
import com.excel.entity.ReadExcel;
import com.excel.entity.User;
import org.apache.poi.hssf.usermodel.HSSFCell;
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.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.multipart.MultipartFile;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
/**
* @author: zty
* @date 2019/9/5 下午12:12
* des:
*/
public class ExcelUtil {
/**
* 先创建一个实体类
*/
ReadExcel readExcel = new ReadExcel();
/**
* 读取Excel文件,获取信息集合
* @param mFile
* @return
*/
public List<User> getExcelInfo(MultipartFile mFile) {
//获取文件名
String fileName = mFile.getOriginalFilename();
List<User> ilist = null;
try {
//验证文件名是否合格
if(!validateExcel(fileName)){
//不合格的话直接return
return null;
}
//根据文件名判断是2003版本的还是2007版本的
boolean isExcel2003 = true;
if(isExcel2007(fileName)){
isExcel2003 = false;
}
ilist= createExcel(mFile.getInputStream(), isExcel2003);
} catch (Exception e) {
e.printStackTrace();
}
return ilist;
}
/**
* 判断是不是2003版本的excel
* @param filePath
* @return
*/
public static boolean isExcel2003(String filePath){
return filePath.matches("^.+\\.(?i)(xls)$");
}
/**
* 判断是不是2007版本的excel
* @param filePath
* @return
*/
public static boolean isExcel2007(String filePath){
return filePath.matches("^.+\\.(?i)(xlsx)$");
}
/**
* 判断是不是excel文件格式
* @param filePath
* @return
*/
public boolean validateExcel(String filePath){
if(filePath ==null||!(isExcel2003(filePath) || isExcel2007(filePath))){
readExcel.setErrorMsg("文件名不是excel格式");
return false;
}
return true;
}
/**
* 读取excel里面的信息
*/
public List<User> readExcelValue(Workbook wb){
List<User> ilist=new ArrayList<>();
//先得到一个sheet
Sheet sheet = wb.getSheetAt(0);
//得到excel里面的行数
int totalRows = sheet.getPhysicalNumberOfRows();
readExcel.setTotalRows(totalRows);
//得到excel里面的列,前提是有行
//大于1是因为我从第二行就是数据了,这个大家看情况而定
if(totalRows >1 && sheet.getRow(0)!=null){
int totalCells = sheet.getRow(0).getPhysicalNumberOfCells();
readExcel.setTotalCells(totalCells);
}
for (int r = 1 ; r < totalRows; r++){
Row row = sheet.getRow(r);
if(row == null){
continue;//如果行为空的话直接中断
}
User user = new User();
//循环xcel的列
for(int c = 0; c<readExcel.getTotalCells() ; c++){
Cell cell = row.getCell(c);
if(cell != null){
//根据excel需要导入的列数来写
if(c == 0){
if(cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC){
//如果是纯数字,比如你写的是38,
//cell.getNumericCellValue()获得是38.0,
//通过截取字符串去掉.0获得25
String name = String.valueOf(cell.getNumericCellValue());
//截取如果length()-2为零了,就说明只有一位数,就直接截取0到1就行
user.setUsername(name.substring(0,name.length()-2>0?name.length()-2:1));
}else{
//如果不是纯数字可以直接获得名称
user.setUsername(cell.getStringCellValue());
}
}else if (c == 1){
if(cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC){
String firstDept = String.valueOf(cell.getNumericCellValue());
user.setPassword(firstDept.substring(0,firstDept.length()-2>0?firstDept.length()-2:1));
}else{
user.setPassword(cell.getStringCellValue());
}
}
}
}
//最后将这些全部添加到ilist中
ilist.add(user);
}
return ilist;
}
public List<User> createExcel(InputStream is , boolean isExcel2003){
List<User> ilist = null;
try {
Workbook wb = null;
if(isExcel2003){
//如果是2003版本的就new一个2003的wb出来
wb = new HSSFWorkbook(is);
}else{
//否则就new 一个2007版的出来
wb = new XSSFWorkbook(is);
}
//再让wb去解析readExcelValue(Workbook wb)方法
ilist = readExcelValue(wb);
} catch (Exception e) {
e.printStackTrace();
}
return ilist;
}
}
注意判断excel版本
最后编写controller
package com.excel.controller;
import com.excel.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author: zty
* @date 2019/9/5 下午1:08
* des:
*/
@RestController
@RequestMapping(value = "/excel")
public class UserController {
@Autowired
private UserService userService;
@PostMapping("/upload")
public String uploadExcel(@RequestParam(value = "file")MultipartFile file, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse){
String result = userService.readExcelFile(file);
return result;
}
}
附上yml配置
是基础的实现
现在来试一下效果
现在数据库里字段为空我们来编辑excel文件(注意第一排为提供的模板 需要根据该模板来填 第一排不读入数据库)
利用Postman上传该excel 文件
post请求 利用form-data表单上传
回显示上传成功
查看数据库内数据
成功!