Springboot上傳excel並將表格資料匯入或更新mySql資料庫
阿新 • • 發佈:2018-12-18
1.在pom.xml檔案中匯入註解,主要利用POI
<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>
2.entity實體類
public class User implements Serializable { private Integer id; private String name; private String phone; private String address; private Date enrolDate; private String des; private static final long serialVersionUID = 1L; public User(Integer id, String name, String phone, String address, Date enrolDate, String des) { this.id = id; this.name = name; this.phone = phone; this.address = address; this.enrolDate = enrolDate; this.des = des; } public User() { super(); } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name == null ? null : name.trim(); } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone == null ? null : phone.trim(); } public String getAddress() { return address; } public void setAddress(String address) { this.address = address == null ? null : address.trim(); } public Date getEnrolDate() { return enrolDate; } public void setEnrolDate(Date enrolDate) { this.enrolDate = enrolDate; } public String getDes() { return des; } public void setDes(String des) { this.des = des == null ? null : des.trim(); } @Override public boolean equals(Object that) { if (this == that) { return true; } if (that == null) { return false; } if (getClass() != that.getClass()) { return false; } User other = (User) that; return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId())) && (this.getName() == null ? other.getName() == null : this.getName().equals(other.getName())) && (this.getPhone() == null ? other.getPhone() == null : this.getPhone().equals(other.getPhone())) && (this.getAddress() == null ? other.getAddress() == null : this.getAddress().equals(other.getAddress())) && (this.getEnrolDate() == null ? other.getEnrolDate() == null : this.getEnrolDate().equals(other.getEnrolDate())) && (this.getDes() == null ? other.getDes() == null : this.getDes().equals(other.getDes())); } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((getId() == null) ? 0 : getId().hashCode()); result = prime * result + ((getName() == null) ? 0 : getName().hashCode()); result = prime * result + ((getPhone() == null) ? 0 : getPhone().hashCode()); result = prime * result + ((getAddress() == null) ? 0 : getAddress().hashCode()); result = prime * result + ((getEnrolDate() == null) ? 0 : getEnrolDate().hashCode()); result = prime * result + ((getDes() == null) ? 0 : getDes().hashCode()); return result; } }
3.Controller介面
@RestController @RequestMapping("/test/") public class TestController { @Autowired private ITestService testService; @PostMapping("/import") public boolean addUser(@RequestParam("file") MultipartFile file) { boolean a = false; String fileName = file.getOriginalFilename(); try { a = testService.batchImport(fileName, file); } catch (Exception e) { e.printStackTrace(); } return a; } }
4.服務層介面
public interface ITestService {
boolean batchImport(String fileName, MultipartFile file) throws Exception;
}
5.業務層實現類
@Service
@Transactional(readOnly = true)
public class TestServiceImpl implements ITestService {
@Autowired
private UserMapper userMapper;
@Transactional(readOnly = false,rollbackFor = Exception.class)
@Override
public boolean batchImport(String fileName, MultipartFile file) throws Exception {
boolean notNull = false;
List<User> userList = new ArrayList<User>();
if (!fileName.matches("^.+\\.(?i)(xls)$") && !fileName.matches("^.+\\.(?i)(xlsx)$")) {
throw new MyException("上傳檔案格式不正確");
}
boolean isExcel2003 = true;
if (fileName.matches("^.+\\.(?i)(xlsx)$")) {
isExcel2003 = false;
}
InputStream is = file.getInputStream();
Workbook wb = null;
if (isExcel2003) {
wb = new HSSFWorkbook(is);
} else {
wb = new XSSFWorkbook(is);
}
Sheet sheet = wb.getSheetAt(0);
if(sheet!=null){
notNull = true;
}
User user;
for (int r = 1; r <= sheet.getLastRowNum(); r++) {
Row row = sheet.getRow(r);
if (row == null){
continue;
}
user = new User();
if( row.getCell(0).getCellType() !=1){
throw new MyException("匯入失敗(第"+(r+1)+"行,姓名請設為文字格式)");
}
String name = row.getCell(0).getStringCellValue();
if(name == null || name.isEmpty()){
throw new MyException("匯入失敗(第"+(r+1)+"行,姓名未填寫)");
}
row.getCell(1).setCellType(Cell.CELL_TYPE_STRING);
String phone = row.getCell(1).getStringCellValue();
if(phone==null || phone.isEmpty()){
throw new MyException("匯入失敗(第"+(r+1)+"行,電話未填寫)");
}
String add = row.getCell(2).getStringCellValue();
if(add==null){
throw new MyException("匯入失敗(第"+(r+1)+"行,不存在此單位或單位未填寫)");
}
Date date;
if(row.getCell(3).getCellType() !=0){
throw new MyException("匯入失敗(第"+(r+1)+"行,入職日期格式不正確或未填寫)");
}else{
date = row.getCell(3).getDateCellValue();
}
String des = row.getCell(4).getStringCellValue();
user.setName(name);
user.setPhone(phone);
user.setAddress(add);
user.setEnrolDate(date);
user.setDes(des);
userList.add(user);
}
for (User userResord : userList) {
String name = userResord.getName();
int cnt = userMapper.selectByName(name);
if (cnt == 0) {
userMapper.addUser(userResord);
System.out.println(" 插入 "+userResord);
} else {
userMapper.updateUserByName(userResord);
System.out.println(" 更新 "+userResord);
}
}
return notNull;
}
}
6.mapper層
@Mapper
public interface UserMapper {
void addUser(User sysUser);
int updateUserByName(User sysUser);
int selectByName(String name);
}
7.mybatis
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.why.MyProject.mapper.UserMapper">
<resultMap id="BaseResultMap" type="com.why.MyProject.entity.User">
<constructor>
<idArg column="t_id" javaType="java.lang.Integer" jdbcType="INTEGER" />
<arg column="t_name" javaType="java.lang.String" jdbcType="VARCHAR" />
<arg column="t_phone" javaType="java.lang.String" jdbcType="VARCHAR" />
<arg column="t_address" javaType="java.lang.String" jdbcType="VARCHAR" />
<arg column="t_enrol_date" javaType="java.util.Date" jdbcType="TIMESTAMP" />
<arg column="t_des" javaType="java.lang.String" jdbcType="VARCHAR" />
</constructor>
</resultMap>
<insert id="addUser" parameterType="com.why.MyProject.entity.User">
insert into user
(name,phone,address,enrol_date,des)
values
(
#{name},
#{phone},
#{address},
#{enrolDate},
#{des}
)
</insert>
<update id="updateUserByName" parameterType="com.why.MyProject.entity.User">
update user
set
phone=#{phone},
address=#{address},
enrol_date=#{enrolDate},
des=#{des}
where name = #{name}
</update>
<select id="selectByName" resultType="java.lang.Integer">
SELECT
count(*)
FROM user
WHERE name=#{name}
</select>
</mapper><?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.why.MyProject.mapper.UserMapper">
<resultMap id="BaseResultMap" type="com.why.MyProject.entity.User">
<constructor>
<idArg column="t_id" javaType="java.lang.Integer" jdbcType="INTEGER" />
<arg column="t_name" javaType="java.lang.String" jdbcType="VARCHAR" />
<arg column="t_phone" javaType="java.lang.String" jdbcType="VARCHAR" />
<arg column="t_address" javaType="java.lang.String" jdbcType="VARCHAR" />
<arg column="t_enrol_date" javaType="java.util.Date" jdbcType="TIMESTAMP" />
<arg column="t_des" javaType="java.lang.String" jdbcType="VARCHAR" />
</constructor>
</resultMap>
<insert id="addUser" parameterType="com.why.MyProject.entity.User">
insert into user
(name,phone,address,enrol_date,des)
values
(
#{name},
#{phone},
#{address},
#{enrolDate},
#{des}
)
</insert>
<update id="updateUserByName" parameterType="com.why.MyProject.entity.User">
update user
set
phone=#{phone},
address=#{address},
enrol_date=#{enrolDate},
des=#{des}
where name = #{name}
</update>
<select id="selectByName" resultType="java.lang.Integer">
SELECT
count(*)
FROM user
WHERE name=#{name}
</select>
</mapper>
8.excel示例