最近项目需要增加一个功能,上传Excel表格进行批量导入。通过上传Excel表格的方式能够节省用户大量的时间提高用户的体验。博主查阅了相关资料,最终是成功实现了上传Excel表格进行批量导入。
本篇博客记录了上传Excel到读取Excel再到将读取到的数据插入到数据库的详细步骤,通过本篇博客可以成功实现读取Excel数据进行批量导入。
实现步骤主要分为两步:
注意:本篇博客是使用引入POI依赖的方式实现读取excel的数据
<dependency>
<groupId>org.apache.poigroupId>
<artifactId>poiartifactId>
<version>4.1.2version>
dependency>
<dependency>
<groupId>org.apache.poigroupId>
<artifactId>poi-ooxmlartifactId>
<version>4.1.2version>
dependency>
<dependency>
<groupId>org.apache.poigroupId>
<artifactId>poi-ooxml-schemasartifactId>
<version>4.1.2version>
dependency>
// sheet.getPhysicalNumberOfRows()获取总的行数
//i=2从第三行开始循环
for (int i = 2; i < sheet.getPhysicalNumberOfRows(); i++) {
}
// 循环读取每一个格
Row row = sheet.getRow(i);
//用于收集excel中的数据
Map<String,String> studentDate =new HashMap<>();
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
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.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author : [WangWei]
* @version : [v1.0]
* @className : ReadPatientExcelUtil
* @description : [从Excel表中读取学生数据]
* @createTime : [2022/11/13 22:28]
* @updateUser : [WangWei]
* @updateTime : [2022/11/13 22:28]
* @updateRemark : [描述说明本次修改内容]
*/
public class ReadStudentDateExcelUtil {
public static List<Map<String ,String>> readStudentDate(MultipartFile file){
//用于获取Excel中的数据
List<Map<String ,String>> studentDateList=new ArrayList<>();
//获取的是文件的完整名称,包括文件名称+文件拓展名
String path=file.getOriginalFilename();
try {
/*// 如果需要通过URL获取资源的加上以下的代码,不需要的省略就行
URL url = new URL(strURL);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
// 设置超时间为3秒
conn.setConnectTimeout(3*1000);
// 防止屏蔽程序抓取而返回403错误
conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
// 获取输入流
InputStream inputStream = conn.getInputStream();
......*/
// 也可以通过文件路径获取文件流
//InputStream inputStream = new FileInputStream("D://");
// 获取文件输入流
InputStream inputStream = file.getInputStream();
// 定义一个org.apache.poi.ss.usermodel.Workbook的变量
Workbook workbook = null;
// 截取路径名 . 后面的后缀名,判断是xls还是xlsx
if (path.substring(path.lastIndexOf("." )+1).equals("xls")){
workbook = new HSSFWorkbook(inputStream);
}else if (path.substring(path.lastIndexOf(" . " )+1).equals("xlsx")){
workbook = new XSSFWorkbook(inputStream);
} else {
throw new Exception("上传文件格式错误");
}
// 获取名为学生信息的sheet页
Sheet sheet = workbook.getSheet("学生信息");
// sheet.getPhysicalNumberOfRows()获取总的行数
for (int i = 2; i < sheet.getPhysicalNumberOfRows(); i++) {
Map<String,String> studentDate =new HashMap<>();
// 循环读取每一个格
Row row = sheet.getRow(i);
studentDate.put("code",row.getCell(0).toString());
studentDate.put("name",row.getCell(1).toString());
studentDate.put("sex",row.getCell(2).toString());
studentDate.put("identityCardId",row.getCell(3).toString());
studentDate.put("nation",row.getCell(4).toString());
studentDate.put("entranceDate",row.getCell(5).toString());
studentDate.put("academyName",row.getCell(6).toString());
studentDate.put("professionName",row.getCell(7).toString());
studentDate.put("className",row.getCell(8).toString());
studentDateList.add(studentDate);
}
} catch (Exception e) {
e.printStackTrace();
}
return studentDateList;
}
按照上述代码就可以实现从excel表格中读取数据了
先获取到excel中所有的数据,再通过for循环的方式将数据取出,set到实体中,最后插入到数据库中。
下面的代码不完整,也较为简单。只是起到一个示例的作用。
示例:
//得到从Excel中获取所有数据
List<Map<String ,String>> studentDateList= ReadStudentDateExcelUtil.readStudentDate(excelFile);
//获取学院名
for (Map<String ,String> map:studentDateList) {
//实例化一个学院实体
AcademyEntity academyEntity=new AcademyEntity();
//获取到学院的名称
academyEntity.setName(map.get("academyName"));
}
//最后插入到数据库中
示例实体:
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
@Entity
@Table(name = "tt_academy")
public class AcademyEntity extends BaseAttribute {
@Column(name = "name")
private String name;
/**
* 机构代码
*/
@Column(name = "code")
private String code;
@Column(name = "type")
private String type;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
最开始的时候由于没有接触过通过上传excel表格的方式进行批量导入,所以一开始就有些恐惧,心态有些不好。当真正做完整个需求的时候,发现其实也还是挺简单的,自己努努力还是可以完成的。
收获:1.分解问题:最开始的时候总是想着一口气解决,所以开始在搜索引擎上搜索的关键字是“java 实现excel批量导入”,对于我来说这样搜索带来的后果是看相关资料时内容太多了,无法聚焦,吸收不了。之后自己发现了自己出现了这个问题,之后调整了策略,进行问题的分解,想要实现上传excel表格的方式进行批量导入,第一步:从excel中读取数据。第二步:获取读取到的数据最后插入数据库。再通过搜索引擎查阅关键字如:“java 读取excel数据”