• 项目实战 Java读取Excel数据


    前言

    最近项目需要增加一个功能,上传Excel表格进行批量导入。通过上传Excel表格的方式能够节省用户大量的时间提高用户的体验。博主查阅了相关资料,最终是成功实现了上传Excel表格进行批量导入。
    本篇博客记录了上传Excel到读取Excel再到将读取到的数据插入到数据库的详细步骤,通过本篇博客可以成功实现读取Excel数据进行批量导入。

    实现步骤

    实现步骤主要分为两步:

    1. 从Excel表中读取数据
    2. 将获取到的数据插入到数据库中

    导入POI依赖

    注意:本篇博客是使用引入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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    示例Excel表结构

    在这里插入图片描述

    编写读取Excel工具类

    实现思路

    1. POI读取是 先读行,再循环获取每列的信息。
    2. 另外一点需要注意的是,从示例的Excel表结构中可以看出我们实际上需要的数据是从第三行开始。所以行的循环从第三行开始,如:
    // sheet.getPhysicalNumberOfRows()获取总的行数
    //i=2从第三行开始循环
    for (int i = 2; i < sheet.getPhysicalNumberOfRows(); i++) {
    
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    1. 在行循环中获取每一格的数据,进行数据收集。
     	// 循环读取每一个格
       Row row = sheet.getRow(i);
       //用于收集excel中的数据
      Map<String,String> studentDate =new HashMap<>();
    
    • 1
    • 2
    • 3
    • 4

    读取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;
            }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79

    按照上述代码就可以实现从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"));
                }
           //最后插入到数据库中
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    示例实体:

    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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    总结

    最开始的时候由于没有接触过通过上传excel表格的方式进行批量导入,所以一开始就有些恐惧,心态有些不好。当真正做完整个需求的时候,发现其实也还是挺简单的,自己努努力还是可以完成的。

    收获:1.分解问题:最开始的时候总是想着一口气解决,所以开始在搜索引擎上搜索的关键字是“java 实现excel批量导入”,对于我来说这样搜索带来的后果是看相关资料时内容太多了,无法聚焦,吸收不了。之后自己发现了自己出现了这个问题,之后调整了策略,进行问题的分解,想要实现上传excel表格的方式进行批量导入,第一步:从excel中读取数据。第二步:获取读取到的数据最后插入数据库。再通过搜索引擎查阅关键字如:“java 读取excel数据”

    如果博主的文章对您有所帮助,可以评论、点赞、收藏,支持一下博主!!!

  • 相关阅读:
    数据库实验报告(六)
    【python】pycharm导入anaconda环境
    学会使用Pandas进行数据清洗
    TR5521设计资料|TR5521替代方案|DP转VGA设计参考
    基于VUE和Node.js的医院挂号预约管理系统
    轻量级 SSO 方略
    STM32单片机C语言模块化编程实战:LED控制详解与示例
    【解决AWS上死机问题】
    商城|商城小程序|基于微信小程序的智慧商城系统设计与实现(源码+数据库+文档)
    中国帘子布市场投资前景分析及供需格局研究预测报告
  • 原文地址:https://blog.csdn.net/wangwei021933/article/details/127858062