项目实战 Java读取Excel数据
前言
最近项目需要增加一个功能,上传Excel表格进行批量导入。通过上传Excel表格的方式能够节省用户大量的时间提高用户的体验。博主查阅了相关资料,最终是成功实现了上传Excel表格进行批量导入。
本篇博客记录了上传Excel到读取Excel再到将读取到的数据插入到数据库的详细步骤,通过本篇博客可以成功实现读取Excel数据进行批量导入。
实现步骤
实现步骤主要分为两步:
- 从Excel表中读取数据
- 将获取到的数据插入到数据库中
导入POI依赖
注意:本篇博客是使用引入POI依赖的方式实现读取excel的数据
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml-schemas</artifactId> <version>4.1.2</version> </dependency>
示例Excel表结构
编写读取Excel工具类
实现思路
- POI读取是 先读行,再循环获取每列的信息。
- 另外一点需要注意的是,从示例的Excel表结构中可以看出我们实际上需要的数据是从第三行开始。所以行的循环从第三行开始,如:
// sheet.getPhysicalNumberOfRows()获取总的行数 //i=2从第三行开始循环 for (int i = 2; i < sheet.getPhysicalNumberOfRows(); i++) { }
- 在行循环中获取每一格的数据,进行数据收集。
// 循环读取每一个格 Row row = sheet.getRow(i); //用于收集excel中的数据 Map<String,String> studentDate =new HashMap<>();
读取Excel数据工具类实现代码
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中获取的数据,并插入到数据库中
先获取到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数据”