zoukankan      html  css  js  c++  java
  • SpringBoot图文教程9—SpringBoot 导入导出 Excel 「Apache Poi」

    有天上飞的概念,就要有落地的实现

    • 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例都敲一遍

    • 先赞后看,养成习惯

    SpringBoot 图文教程系列文章目录

    1. SpringBoot图文教程1「概念+案例 思维导图」「基础篇上」
    2. SpringBoot图文教程2—日志的使用「logback」「log4j」
    3. SpringBoot图文教程3—「‘初恋’情结」集成Jsp
    4. SpringBoot图文教程4—SpringBoot 实现文件上传下载
    5. SpringBoot图文教程5—SpringBoot 中使用Aop
    6. SpringBoot图文教程6—SpringBoot中过滤器的使用
    7. SpringBoot图文教程7—SpringBoot拦截器的使用姿势这都有
    8. SpringBoot图文教程8 — SpringBoot集成MBG「代码生成器」

    前言

    Excel文件的导入导出功能,在项目中可以说是一个极其常见的功能了,使用到这技术的业务场景也非常多,例如:客户信息的导入导出,运营数据的导入导出,订单数据的导入导出等等。

    那么在 SpringBoot 中如何使用 Poi 呢?从本文开始将会说三种使用 Poi 的姿势:Apache Poi,EasyPoi,阿里开源的EasyExcel。

    话不多说,马上开始。

    集成 Poi

    什么是 Poi

    Apache Poi 是 Apache 的一个开源项目,用Java代码通过 poi 技术可以实现 读取 和 生成 Excel 文档。

    关于 Poi 的简介非常的少,接下来我们简单说一些和Excel相关的常识

    1. 通过 office Excel软件或者 wps 常用的Excel格式有两种:xls 和 xlsx

    2. 上图中的两个文件都是Excel文件,在一个Excel文件中包含若干张表

    3. 一张表中可以分为很多行 row ,每行又分为很多单元格 cell

    Poi 对 Excel 抽象出来的对象

    刚才简单的说过了Excel文件相关的情况,但是那是在电脑中使用Excel需要用到的东西,如果要通过 SpringBoot 导入导入 Excel 文件,就要通过类和方法来进行。

    于是在 Poi 中对以上提到的所有的名词都做了一定的封装。对应关系如下:

    Excel中的概念 Poi对应的对象
    Excel 文件 HSSFWorkbook (xls)XSSFWorkbook(xlsx)
    Excel 的工作表 HSSFSheet
    Excel 的行 HSSFRow
    Excel 中的单元格 HSSFCell
    Excel 字体 HSSFFont
    Excel 单元格样式 HSSFCellStyle
    Excel 颜色 HSSFColor
    合并单元格 CellRangeAddress

    Poi 的基本使用

    要导出的实体类 如下:
    image.png

    1. 在项目中导入依赖

     <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi</artifactId>
                <version>3.14</version>
            </dependency>
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml</artifactId>
                <version>3.14</version>
            </dependency>
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml-schemas</artifactId>
                <version>3.14</version>
            </dependency>
    

    2. 在测试类中写导出的代码如下:

    
        /**
         * 导出数据
         */
        @Test
        public void test2() throws IOException {
    //        0.准备数据
            User user = new User();
            user.setUserId(1);
            user.setUserName("hhhh");
            user.setUserSex("男");
    
            String[] titles = {"编号","名字","性别"};
    
            /**
             * 先写入 标题栏数据
             */
    //        1.创建文件对象   创建HSSFWorkbook只能够写出为xls格式的Excel
    //        要写出 xlsx 需要创建为 XSSFWorkbook 两种Api基本使用方式一样
            HSSFWorkbook workbook = new HSSFWorkbook();
    
    //        2.创建表对象
            HSSFSheet sheet = workbook.createSheet("users");
    
    //        3.创建标题栏(第一行)  参数为行下标  行下标从0开始
            HSSFRow titleRow = sheet.createRow(0);
    
    //        4.在标题栏中写入数据
            for (int i = 0; i < titles.length; i++) {
    //            创建单元格
                HSSFCell cell = titleRow.createCell(i);
                cell.setCellValue(titles[i]);
            }
            /**
             * 写入用户数据
             */
    //       5 创建行 如果是用户数据的集合 需要遍历
             HSSFRow row = sheet.createRow(1);
    
    //       6 将用户数据写入到行中
            row.createCell(0).setCellValue(user.getUserId());
            row.createCell(1).setCellValue(user.getUserName());
            row.createCell(2).setCellValue(user.getUserSex());
    
    //        文件保存到本地 参数为要写出的位置
            workbook.write(new FileOutputStream("/Users/k/Desktop/hhh.xls"));
    
        }
    
    

    生成的Excel文件如下

    3. Excel导入

      /**
         * 文件导入  实际上就是文件导出反向操作
         */
        @Test
        public void test3() throws Exception {
    //        1.通过流读取Excel文件
            FileInputStream inputStream = new FileInputStream("/Users/k/Desktop/hhh.xls");
    //        2.通过poi解析流 HSSFWorkbook 处理流得到的对象中 就封装了Excel文件所有的数据
            HSSFWorkbook workbook = new HSSFWorkbook(inputStream);
    //        3.从文件中获取表对象  getSheetAt通过下标获取
            HSSFSheet sheet = workbook.getSheetAt(0);
    //        4.从表中获取到行数据  从第二行开始 到 最后一行  getLastRowNum() 获取最后一行的下标
            int lastRowNum = sheet.getLastRowNum();
    
            for (int i = 1; i <= lastRowNum; i++) {
    //            通过下标获取行
                HSSFRow row = sheet.getRow(i);
    //            从行中获取数据
    
                /**
                 * getNumericCellValue() 获取数字
                 * getStringCellValue 获取String
                 */
                double id = row.getCell(0).getNumericCellValue();
                String name = row.getCell(1).getStringCellValue();
                String sex = row.getCell(2).getStringCellValue();
    
    //            封装到对象中
                User user = new User();
                user.setUserId((int) id);
                user.setUserName(name);
                user.setUserSex(sex);
    
    //            将对象添加数据库
                System.out.println(user);
            }
        }
    
    

    总结

    Tips:本文只讲解了 Poi 最基本的使用方式 如果需要其他更加全面的使用方式

    可以关注后续文章 Easypoi 和 EasyExcel 以及 Poi中文 API 文档 「40种操作 Excel文件的姿势」

    恭喜你完成了本章的学习,为你鼓掌!如果本文对你有帮助,请帮忙点赞,评论,转发,这对作者很重要,谢谢。

    让我们再次回顾本文的学习目标

    • 掌握SpringBoot中Poi的使用

    要掌握SpringBoot更多的用法,请持续关注本系列教程。

    求关注,求点赞,求转发

    欢迎关注本人公众号:鹿老师的Java笔记,将在长期更新Java技术图文教程和视频教程,Java学习经验,Java面试经验以及Java实战开发经验。

  • 相关阅读:
    Nacos启动异常:failed to req API:/api//nacos/v1/ns/instance after all servers([127.0.0.1:8848])
    多节点集群思路
    内网dns配置
    MySQL集群配置思路
    pycharm常用快捷键
    2020年11月新版CKA考试心得
    JavaScript的Map、Set、WeakMap和WeakSet
    AJAX传输二进制数据
    linux性能监测与优化的指令
    八千字硬核长文梳理Linux内核概念及学习路线
  • 原文地址:https://www.cnblogs.com/bingyang-py/p/12407675.html
Copyright © 2011-2022 走看看