【Apache POI】Apache POI-操作Excel表格-简易版

Catalog

  • [Apache POI-操作Excel表格](#Apache POI-操作Excel表格)
    • [1. 需求](#1. 需求)
    • [2. 优点](#2. 优点)
    • [3. 缺点](#3. 缺点)
    • [4. 应用场景](#4. 应用场景)
    • [5. 使用方法](#5. 使用方法)
    • [6. SpringBoot工程中处理Excel表格](#6. SpringBoot工程中处理Excel表格)
    • [7. Demo示例](#7. Demo示例)

Apache POI-操作Excel表格

1. 需求

大多数项目的在运营过程中,会产生运营数据,如外卖系统中需要统计每日的订单完成数、每种菜品的销量等数据,这些都是商家关心的事情,如果可以将这些数据整理成Excel表格,可以让商家更直观地了解到这些数据。

Apache POI这个开源项目就可以用于处理微软各式各样的文件,如读、写、创建文件等,这里主要介绍的是如何处理Excel文件。

2. 优点

  • 开源免费:不需要侧重关心数据安全等方面的问题。
  • 跨平台:Apache POI是使用Java语法编写的,在任何支持Java语言的平台下面都可以使用。
  • 容易集成:在springboot项目中使用起来非常方便。

3. 缺点

  • 操作繁琐:Apache POI中丰富的api,增加了使用的难度
  • 性能:处理大型Excel文件的时候,会大量占用内存
  • 不支持新功能:无法及时同步Excel这个软件更新的功能

4. 应用场景

  1. 数据导入导出:Apache POI可用于从数据库导出数据到Excel文件,或者从Excel文件中读取数据并导入到数据库中。
  2. 报表生成:可以使用Apache POI创建自定义的Excel报表,包括图表、数据分析和格式化等功能。
  3. 数据处理:可以利用Apache POI对Excel文件中的数据进行处理和分析,如数据清洗、转换和计算等。

5. 使用方法

Apache POI中提供的api处理Excel表格的大多数逻辑都和直接使用Excel(微软)这个软件类似。

在大多数通过Java程序来操作Excel表格的场景中,由于Excel的样式较为复杂,通过Java程序来设计样式会很繁琐,所以大多数的应用场景都是先通过微软的Excel这个软件,先将Excel的样式设计好,如设计表格头的标题、字体大小、合并单元格和颜色等保存为模板文件到项目工程的resource目录下面,再通过反射(输出流)获取到resource目录下的资源文件(Excel模板文件)。

最后,直接在模板文件中填充从数据库中处理好的数据即可。

6. SpringBoot工程中处理Excel表格

  1. 导入Maven坐标

    xml 复制代码
     <!--导入POI坐标-->
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi</artifactId>
                <version>3.16</version>
            </dependency>
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml</artifactId>
                <version>3.16</version>
            </dependency>
            
            <!--用作测试-->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.13.2</version>
                <scope>test</scope>
            </dependency>
  2. 获取输入流(获取Excel文件)

  3. 获取Sheet页(可设置Sheet的名称)

  4. 获取行(可直接获取最后一行有内容的行号, 最后一行的行号从0开始的)

  5. 获取列(可直接获取最后一列有内容的行号,最后一行的列号从1开始的)

  6. 对Excel文件进行读写操作

  7. 获取输出流(将Excel文件保存到磁盘上或者输出到浏览器上面)

7. Demo示例

java 复制代码
/**
     * 基于POI向Excel文件中写入数据
     */
    @Test
    public void writeExcel() throws IOException {
        //在内存中创建Excel文件
        XSSFWorkbook excel = new XSSFWorkbook();

        //创建sheet页
        XSSFSheet sheet = excel.createSheet("user");

        //创建行
        XSSFRow row0 = sheet.createRow(0);
        XSSFRow row1 = sheet.createRow(1);
        XSSFRow row2 = sheet.createRow(2);

        //创建列
        row0.createCell(0).setCellValue("name");
        row0.createCell(1).setCellValue("age");
        row1.createCell(0).setCellValue("aimin");
        row1.createCell(1).setCellValue("22");
        row2.createCell(0).setCellValue("Tony");
        row2.createCell(1).setCellValue("22");


        //存入磁盘

        //创建输出流,文件路径写自己的
        FileOutputStream fileOutputStream = new FileOutputStream(new File("D:\\WORKSPACE-Java\\normal-project\\Apache_POI_test\\files\\info.xlsx"));

        excel.write(fileOutputStream);

        //关闭资源
        fileOutputStream.flush();
        fileOutputStream.close();
        excel.close();

    }


    /**
     * 基于POI读取Excel中的数据
     */
    @Test
    public void readExcel() throws Exception{
        //通过输入流获取Excel文件,文件路径写自己的
        XSSFWorkbook excel = new XSSFWorkbook(new FileInputStream(new File("D:\\WORKSPACE-Java\\normal-project\\Apache_POI_test\\files\\info.xlsx")));

        //获取sheet页
        XSSFSheet sheet = excel.getSheet("user");

        //获取最后一行有内容的行号,用于后期遍历,行号从0开始,列号从1开始
        int lastRowNum = sheet.getLastRowNum();

        //System.out.println("最后一行的行号:" + lastRowNum);

        for (int i = 0; i <= lastRowNum; i++) {
            //获取行
            XSSFRow row = sheet.getRow(i);

            //获取有内容的最后一列的列号
            short lastCellNum = row.getLastCellNum();
            //System.out.println("最后一列的列号:" + lastRowNum);
            for (int j = 0; j < lastCellNum; j++) {
                System.out.print(row.getCell(j) + " ");
            }
            System.out.println();

        }

        //关闭流
        excel.close();


    }
相关推荐
艾迪的技术之路4 分钟前
redisson使用lock导致死锁问题
java·后端·面试
今天背单词了吗98022 分钟前
算法学习笔记:8.Bellman-Ford 算法——从原理到实战,涵盖 LeetCode 与考研 408 例题
java·开发语言·后端·算法·最短路径问题
天天摸鱼的java工程师25 分钟前
使用 Spring Boot 整合高德地图实现路线规划功能
java·后端
东阳马生架构40 分钟前
订单初版—2.生单链路中的技术问题说明文档
java
咖啡啡不加糖1 小时前
暴力破解漏洞与命令执行漏洞
java·后端·web安全
风象南1 小时前
SpringBoot敏感配置项加密与解密实战
java·spring boot·后端
DKPT1 小时前
Java享元模式实现方式与应用场景分析
java·笔记·学习·设计模式·享元模式
Percep_gan1 小时前
idea的使用小技巧,个人向
java·ide·intellij-idea
缘来是庄1 小时前
设计模式之迭代器模式
java·设计模式·迭代器模式