【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();


    }
相关推荐
Yz98769 分钟前
Hadoop里面MapReduce的序列化与Java序列化比较
java·大数据·jvm·hadoop·分布式·mapreduce·big data
凯哥Java11 分钟前
优化批处理流程:自定义BatchProcessorUtils的设计与应用
java·数据库·mysql
njnu@liyong20 分钟前
AOP-前置原理-怎么判断和拦截?
java·aop·拦截
末央&24 分钟前
【C++】内存管理
java·开发语言·c++
心之语歌37 分钟前
设计模式 享元模式(Flyweight Pattern)
java·设计模式·享元模式
MTingle39 分钟前
【Java EE】文件IO
java·java-ee
coffee_baby41 分钟前
享元模式详解:解锁高效资源管理的终极武器
java·spring boot·mybatis·享元模式
爱学习的真真子1 小时前
菜鸟也能轻松上手的Java环境配置方法
java·开发语言
曳渔1 小时前
Java-数据结构-二叉树-习题(三)  ̄へ ̄
java·开发语言·数据结构·算法·链表
shark-chili1 小时前
数据结构与算法-Trie树添加与搜索
java·数据结构·算法·leetcode