Springboot+Poi导入Excel表格实现过程详解

 更新时间:2020年09月18日 15:48:46   作者:miracle2  
这篇文章主要介绍了Springboot+Poi导入Excel表格实现过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

导入表格的主要思路就是:首先从前端页面上传文件,这里先区分一下Multipartfile和File,前者代表的是HTML中form data方式上传的文件,后者是文件系统的抽象,前者信息较少,只有二进制数据+文件名称,所以我们一般先上传的Multipartfile文件要转换成File文件我们才可以读取文件的内容。下面一步一步的讲解

Tips:

1、先生成临时文件,同时记得使用transferTo()方法把MultipartFile文件类型转成File类型:

File excelFile=excelService.temp(file);
//对应的temp()方法
  public File temp(MultipartFile multipartFile) throws IOException {
    //这里用系统当前时间加文件后缀名来做临时文件的名字,防止生成的临时文件重复
    final File excelFile=File.createTempFile(new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()),Prefix(multipartFile));
    //把MulitipartFile 文件转成File文件
    multipartFile.transferTo(excelFile);
    return excelFile;
  }

2、生成临时文件之后我们就可以取解析这个临时文件的内容了:

//开始从临时文件中取出数据进行解析
      sysVeterinaryList=excelService.readExcel(excelFile);

//readExcel()的具体实现如下:
 public List<SysVeterinary> readExcel(File file) throws IOException {

    List<SysVeterinary> sysVeterinaryList =new ArrayList<>();
    Workbook workbook;
    try{
      //操作07版本后的Excel表格,扩展名是.xlsx
      workbook = new XSSFWorkbook(file);
    } catch (Exception e) {
      //操作的是03年及以前的版本,扩展名为.xls
      workbook = new HSSFWorkbook(new FileInputStream(file));
    }

    //选择第一个工作簿,即第一个表格
    Sheet sheets = workbook.getSheetAt(0);
    //getPhysicalNumberOfRows获取的是物理行数,就是不包括那些空行(隔行的)的情况
    //表格的第0行是表头,标识每个字段,所以这里直接从第一行开始解析数据
    for(int i=1;i<sheets.getPhysicalNumberOfRows();i++){
      Row row = sheets.getRow(i);
      try{
        SysVeterinary sysVeterinary = new SysVeterinary();
        String[] strrs=getString(row);
        if(!strrs[0].equals("")&&!strrs[1].equals("")&&!strrs[2].equals("")&&!strrs[3].equals("")&&!strrs[4].equals("")&&!strrs[5].equals("")&&!strrs[6].equals("")){
          //名称
          sysVeterinary.setVeterinaryName(strrs[0]);
          //地址
          sysVeterinary.setVeterinaryAddress(strrs[1]);
          //经度
          sysVeterinary.setVeterinaryLongitude(strrs[2]);
          //纬度
          sysVeterinary.setVeterinaryLatitude(strrs[3]);
          //联系方式
          sysVeterinary.setVeterinaryPhone(strrs[4]);
          //户主名
          sysVeterinary.setVeterinaryStoreKeeper(strrs[5]);
          //兽医店规模
          sysVeterinary.setVeterinaryScope(strrs[6]);
          //技术水平
          sysVeterinary.setVeterinarySkill(strrs[7]);
          sysVeterinaryList.add(sysVeterinary);
        }else {
          System.out.println("无效行数"+i);
        }
      }catch (Exception e){
        e.printStackTrace();
      }
    }
    return sysVeterinaryList;
  }

3、第2点的红色代码主要是对每一行的单元格数据进行操作,就是我先把这一行的所有单元格内容的类型全部转换成String类型,如果最后要存进数据库的类型不是字符串类型的话,那我们就可以在具体赋值之前再转成我们想要的类型就可以了,下面是把单元格转成String的方法:

/**
   * //该方法是把每行的单元格内容全部都先转成字符传类型,再一一读取
   * @param row
   * @return
   */

  public String[] getString(Row row){
    String[] strs=new String[8];
    for(int j =0;j<strs.length;j++){
      //把行内的单元格内容当作字符串获取,,单元格的第一行是序号,不需要入库,所以这里从第二各单元格开始
      row.getCell(j+1).setCellType(CellType.STRING);
      //获取某个单元格里面的值
      strs[j] = row.getCell(j+1).getStringCellValue();
    }
    return strs;

  }

4、在第2点中解析完返回的数据就是我们最终要保存到数据库里面的数据了,当我们解析完这个临时文件的时候我们就可以把之前生成的临时文件给删除了,具体的代码如下:

//每次解析完就删除临时文件
      excelService.deleteFile(excelFile);
//实现
  /**
   * 删除之前生成的临时文件,参数File... 这样子定义的意思
   * 是表示参数的个数是不确顶的,因为上传文件的时候,有可能会同时上传几个文件
   * @param files
   */

  public void deleteFile(File... files){
    for(File file:files){
      if(file.exists()){
        file.delete();
      }
    }

  }

做完上面一系列的操作,数据解析完了

其实上面的还是不算完善的,比如如果导入的数据量非常大的时候,我们就可以先做一个判断,就是每次读取? 导入?的条数是有限制的,就是一次性只能存多少条,存完再寻接下来的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 为何HashSet中使用PRESENT而不是null作为value

    为何HashSet中使用PRESENT而不是null作为value

    这篇文章主要介绍了为何HashSet中使用PRESENT而不是null作为value,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • jdbc连接oracle数据库功能示例

    jdbc连接oracle数据库功能示例

    这篇文章主要介绍了jdbc连接oracle数据库功能,结合实例形式详细分析了java基于jdbc连接Oracle数据库的具体操作步骤与相关实现技巧,需要的朋友可以参考下
    2017-01-01
  • java8快速实现List转map 、分组、过滤等操作

    java8快速实现List转map 、分组、过滤等操作

    这篇文章主要介绍了java8快速实现List转map 、分组、过滤等操作,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • java编程无向图结构的存储及DFS操作代码详解

    java编程无向图结构的存储及DFS操作代码详解

    这篇文章主要介绍了java编程无向图结构的存储及DFS操作代码详解,具有一定借鉴价值,需要的朋友可以了解下。
    2017-12-12
  • Java堆&优先级队列示例讲解(上)

    Java堆&优先级队列示例讲解(上)

    这篇文章主要通过示例详细为大家介绍Java中的堆以及优先级队列,文中的示例代码讲解详细,对我们了解java有一定帮助,需要的可以参考一下
    2022-03-03
  • Springboot-Starter造轮子之自动锁组件lock-starter实现

    Springboot-Starter造轮子之自动锁组件lock-starter实现

    这篇文章主要为大家介绍了Springboot-Starter造轮子之自动锁组件lock-starter实现详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • 如何使用新方式编写Spring MVC接口

    如何使用新方式编写Spring MVC接口

    这篇文章主要介绍了如何使用新方式编写Spring MVC接口,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • SpringBoot中@Conditional注解的使用

    SpringBoot中@Conditional注解的使用

    这篇文章主要介绍了SpringBoot中@Conditional注解的使用,@Conditional注解是一个条件装配注解,主要用于限制@Bean注解在什么时候才生效,以指定的条件形式控制bean的创建,需要的朋友可以参考下
    2024-01-01
  • Java 8对LinkedList元素进行排序的方法详解

    Java 8对LinkedList元素进行排序的方法详解

    在Java中,LinkedList是一种基于链表的数据结构,与ArrayList相比,它在进行插入和删除操作时表现出更好的性能,然而,LinkedList的元素排序也是开发中常见的需求之一,本文介绍了Java8对LinkedList元素进行排序的方法,需要的朋友可以参考下
    2024-11-11
  • 使用Maven搭建SpringMVC项目的步骤(图文教程)

    使用Maven搭建SpringMVC项目的步骤(图文教程)

    本篇文章主要介绍了使用Maven搭建SpringMVC项目的步骤(图文教程),非常具有实用价值,需要的朋友可以参考下
    2017-09-09

最新评论