使用POI实现JAVA操作Excel文件

news2024/10/5 12:57:08

1、POI工具介绍

1.1、POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能。

1.2、主要是运用其中读取和输出excel的功能。

1.3、POI官网地址:

https://poi.apache.org/components/index.html

2、POI可操作的文件类型

在这里插入图片描述

3、POI所需依赖

		<!--xls(03)-->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.1.2</version>
        </dependency>
        <!--xlsx(07)-->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.1.2</version>
        </dependency>

4、xls和xlsx的区别

xls是excel03版本 xlsx是excel07版本

最大的区别是行列数不同

xls最大支持65536行、256列
xlsx最大支持1048576行、16384列

poi操作

poi 操作xls
poi-ooml操作xlsx

5、POI Excel 写 03(xls)和07(xlsx)版本方式

package poi;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
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.junit.Test;

import java.io.FileOutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @author yw
 * @since 2022/11/20
 */
public class ExcelWrite {

    public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";

    String PATH = "D:\\excel\\";

    /**
     * 写工作簿 03版本
     */
    @Test
    public void Write03() throws Exception {
        //1.创建一个工作簿
        Workbook workbook = new HSSFWorkbook();
        //2.创建 一个工作表
        Sheet sheet = workbook.createSheet("工人表");
        //3.创建一行
        Row row1 = sheet.createRow(0);
        //4.创建一个单元格
        //(1,1)
        Cell cell1 = row1.createCell(0);
        cell1.setCellValue("工号");
        //(1,2)
        Cell cell2 = row1.createCell(1);
        cell2.setCellValue("日期");

        //创建第二行
        Row row2 = sheet.createRow(1);
        //(2,1)
        Cell cell21 = row2.createCell(0);
        cell21.setCellValue(001);
        //(2,2)
        Cell cell22 = row2.createCell(1);
        SimpleDateFormat sdf = new SimpleDateFormat(DEFAULT_DATE_FORMAT);
        String datetime = sdf.format(new Date());
        cell22.setCellValue(datetime);

        //生成一张表(IO流),03版本就是使用xls结尾
        FileOutputStream fos = new FileOutputStream(PATH + "工人表03.xls");
        //输出
        workbook.write(fos);
        //关闭流
        fos.close();
        System.out.println("文件生成完毕");
    }

    /**
     * 写工作簿 07版本
     */
    @Test
    public void Write07() throws Exception {
        //1.创建一个工作簿
        Workbook workbook = new XSSFWorkbook();
        //2.创建 一个工作表
        Sheet sheet = workbook.createSheet("工人表");
        //3.创建一行
        Row row1 = sheet.createRow(0);
        //4.创建一个单元格
        //(1,1)
        Cell cell1 = row1.createCell(0);
        cell1.setCellValue("工号");
        //(1,2)
        Cell cell2 = row1.createCell(1);
        cell2.setCellValue("日期");

        //创建第二行
        Row row2 = sheet.createRow(1);
        //(2,1)
        Cell cell21 = row2.createCell(0);
        cell21.setCellValue(001);
        //(2,2)
        Cell cell22 = row2.createCell(1);
        SimpleDateFormat sdf = new SimpleDateFormat(DEFAULT_DATE_FORMAT);
        String datetime = sdf.format(new Date());
        cell22.setCellValue(datetime);

        //生成一张表(IO流),03版本就是使用xlsx结尾
        FileOutputStream fos = new FileOutputStream(PATH + "工人表07.xlsx");
        //输出
        workbook.write(fos);
        //关闭流
        fos.close();
        System.out.println("文件生成完毕");
    }
}

6、HSSF和XSSF写大文件的区别

6.1、使用HSSF写大文件

@Test
    public void Write03BigData() throws Exception{
        //时间
        long begin = System.currentTimeMillis();
        //1.创建一个工作簿
        Workbook workbook = new HSSFWorkbook();
        //2.创建一个表
        Sheet sheet = workbook.createSheet("sheet1");
        //写入数据
        for (int rowNum = 0;rowNum<65536;rowNum++){
            //3.创建行
            Row row = sheet.createRow(rowNum);
            for (int CellNum = 0;CellNum<10;CellNum++){
                Cell cell = row.createCell(CellNum);
                cell.setCellValue(CellNum);
            }
        }
        System.out.println("over");
        //获取io流
        FileOutputStream fos = new FileOutputStream(PATH+"Write03BigData.xlsx");
        //生成一张表
        workbook.write(fos);
        fos.close();
        long end = System.currentTimeMillis();
        System.out.println("耗时:"+(end-begin));
    }

在这里插入图片描述
优点:过程中写入缓存,不操作磁盘,最后再一次性导入磁盘,速度快+
缺点:但是只能写入65535条数据,超过就会报异常
在这里插入图片描述

6.2、使用XSSF写大文件

@Test
    public void Write07BigData() throws Exception{
        //时间
        long begin = System.currentTimeMillis();
        //1.创建一个工作簿
        Workbook workbook = new XSSFWorkbook();
        //2.创建一个表
        Sheet sheet = workbook.createSheet("sheet1");
        //写入数据
        for (int rowNum = 0;rowNum<1000000;rowNum++){
            //3.创建行
            Row row = sheet.createRow(rowNum);
            for (int CellNum = 0;CellNum<10;CellNum++){
                Cell cell = row.createCell(CellNum);
                cell.setCellValue(CellNum);
            }
        }
        System.out.println("over");
        //获取io流
        FileOutputStream fos = new FileOutputStream(PATH+"Write07BigData.xlsx");
        //生成一张表
        workbook.write(fos);
        fos.close();
        long end = System.currentTimeMillis();
        System.out.println("耗时:"+(end-begin));
    }

在这里插入图片描述

优点:可以写较大数据量(超过655135条),如10万条
缺点:写数据时,速度非常慢,非常消耗内存,也会容易发生内存溢出,如100万条的时候。

6.3、使用SXSS写大文件

@Test
    public void Write07BigDataS() throws Exception{
        //时间
        long begin = System.currentTimeMillis();
        //1.创建一个工作簿
        Workbook workbook = new SXSSFWorkbook(200);
        //2.创建一个表
        Sheet sheet = workbook.createSheet("sheet1");
        //写入数据
        for (int rowNum = 0;rowNum<1000000;rowNum++){
            //3.创建行
            Row row = sheet.createRow(rowNum);
            for (int CellNum = 0;CellNum<10;CellNum++){
                Cell cell = row.createCell(CellNum);
                cell.setCellValue(CellNum);
            }
        }
        System.out.println("over");
        //获取io流
        FileOutputStream fos = new FileOutputStream(PATH+"Write07BigDataS.xlsx");
        //生成一张表
        workbook.write(fos);
        fos.close();
        //清除临时文件
        ((SXSSFWorkbook) workbook).dispose();
        long end = System.currentTimeMillis();
        System.out.println("耗时:"+(end-begin));
    }

在这里插入图片描述
优点:可以写超大数据量的,比如100万条,写数据速度更快,占用更少内存
注意:
1、过程中会产生临时文件,结束时需要注意清理
2、默认100条记录会保存在内存中,如果超过这个数据,则最前面的数据会被写入磁盘中
3、如果想自定义内存中的数量,则可以new SXSSFWorkbook(自定义数量)

SXSSFWorkbook-来至官方的解释︰实现"BigGridDemo"策略的流式XSSFWorkbook版本。这允许写入非常大的文件而不会耗尽内存,因为任何时候只有可配置的行部分被保存在内存中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/639251.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2021 年全国硕士研究生入学统一考试管理类专业学位联考逻辑试题

2021 年全国硕士研究生入学统一考试管理类专业学位联考逻辑试题 一. 逻辑推理&#xff1a;第 26~55 小题&#xff0c;每小题 2 分&#xff0c;共 60 分。下列每题给出的 A、B、C、D、E 五个选项中&#xff0c;只有一项是符合试题要求的。 26.哲学是关于世界观、方法论的学问。哲…

SEC的尴尬,无法找到行踪飘忽不定的“华人首富”

圈内很多有&#xff0c;也许会有这样一幅画面。“哎呀&#xff0c;他到底跑哪儿去了&#xff1f;”美国证券交易委员会SEC主席Gensler气得拍着桌子&#xff0c;旁边还放着长达136页的对币安的起诉文件。这可真是让人头疼啊&#xff01;毕竟赵长鹏最近几年一直神出鬼没&#xff…

Mybatis学习笔记二

目录 一、MyBatis的各种查询功能1.1 查询一个实体类对象1.2 查询一个List集合1.3 查询单个数据1.4 查询一条数据为map集合1.5 查询多条数据为map集合1.5.1 方法一&#xff1a;1.5.2 方法二&#xff1a; 二、特殊SQL的执行2.1 模糊查询2.2 批量删除2.3 动态设置表名2.4 添加功能…

现代图片性能优化: 懒加载及异步图像解码方案

图片的懒加载 懒加载是一种网页性能优化的常见方式&#xff0c;它能极大的提升用户体验。到今天&#xff0c;现在一张图片超过几 M 已经是常见事了。如果每次进入页面都需要请求页面上的所有的图片资源&#xff0c;会较大的影响用户体验&#xff0c;对用户的带宽也是一种极大的…

【id:76】【20分】B. 商旅信用卡(多重继承)

题目描述 某旅游网站&#xff08;假设旅程网&#xff09;和某银行推出旅游综合服务联名卡—旅程信用卡&#xff0c;兼具旅程会员卡和银行信用卡功能。 旅程会员卡&#xff0c;有会员卡号&#xff08;int&#xff09;、旅程积分&#xff08;int&#xff09;&#xff0c;通过会员…

Spring Cloud Kubernetes详解

目录 一、 为什么你需要 Spring Cloud Kubernetes&#xff1f; 二、 Starter 三、 用于 Kubernetes 的 DiscoveryClient 四、Kubernetes 原生服务发现&#xff08;service discovery&#xff09; 五、Kubernetes PropertySource 的实现 1、使用 ConfigMap PropertySource …

ssg标识符

1. 关键字&#xff08;keyword&#xff09; 定义&#xff1a;被Java语言赋予了特殊含义&#xff0c;用做专门用途的字符串&#xff08;或单词&#xff09; HelloWorld案例中&#xff0c;出现的关键字有 class、public 、 static 、 void 等&#xff0c;这些单词已经被Java定义…

【appium】appium自动化入门之API(上)

这个系列预计会讲启动APP—元素定位—初步使用—API命令详解 本系列没提过的知识点也不用急&#xff0c;大家可以点击文末小卡片进群来一起交流 目录 第 2 章 初步使用 2.1 启动 app&#xff08;淘宝&#xff09; 前言 2.1.1 下载 aapt 2.1.2 获取 apk 包名 2.1.3 获取 launch…

Linux之通配符、引号的使用

目录 Linux之通配符、引号的使用 通配符 定义 范围 用法及含义 案例 引号使用 案例 Linux之通配符、引号的使用 通配符 定义 通配符是一种特殊语句&#xff0c;主要有星号(*)、问号(?)等表示&#xff0c;用来模糊搜索文件&#xff0c;当查找目录或文件时&#xff0c;…

Gin微服务框架_golang web框架_完整示例Demo

Gin简介 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站 Gin是一个golang的微框架&#xff0c;封装比较优雅&#xff0c;API友好&#xff0c;源码注释比较明确&#xff0c;具有快速灵活&…

Spark入门

Spark概述 1.1 什么是Spark 回顾&#xff1a;Hadoop主要解决&#xff0c;海量数据的存储和海量数据的分析计算。 Spark是一种基于内存的快速、通用、可扩展的大数据分析计算引擎。 1.2 Hadoop与Spark历史 MR是进程模型&#xff0c;ResourceManager NodeManager都是进程&…

107-Spring的底层原理(上篇)

Spring的底层原理 之前说明的都是Spring的应用&#xff08;64章博客开始&#xff08;包括其后面的相关博客&#xff09;&#xff09;&#xff0c;现在来说明他为什么可以那样做 在说明之前&#xff0c;这里需要对64章博客中的spring的了解需要再次的说明&#xff1a; Spring…

Unity中UI方案。IMGUI、UIElement、UGUI、NGUI

引言 unity中有很多ui方案&#xff0c;各种方案有什么优势劣势&#xff0c;这里一一列举一下&#xff0c;知识扩充一下。 UI方案适用范围IMGUI仅用于Editor扩展&#xff0c;或运行时DebugUIElement可用于发布运行时和EditorUGUIRuntime&#xff0c;两大主流 UI 解决方案之一NG…

python语法-MySQL数据库(综合案例:读取文件,写入MySQL数据库中)

python语法-MySQL数据库 综合案例&#xff1a;读取文件&#xff0c;写入MySQL数据库中 &#xff08;项目数据见文章末参考内容&#xff09; 解析&#xff1a; sql代码如下&#xff1a; create database pysql charset utf8;use pysql;select database();create table orders…

华为OD机试真题 JavaScript 实现【求小球落地5次后所经历的路程和第5次反弹的高度】【牛客练习题 HJ38】

一、题目描述 假设一个球从任意高度自由落下&#xff0c;每次落地后反跳回原高度的一半; 再落下, 求它在第5次落地时&#xff0c;共经历多少米?第5次反弹多高&#xff1f; 数据范围&#xff1a;输入的小球初始高度满足 1 \le n \le 1000 \1≤n≤1000 &#xff0c;且保证是一…

今年十八,期末速刷(操作系统篇1)

马上期末了&#xff0c;想问问各位期末考几科 我家学校网安考7科呜呜呜 只能出点文章一把梭了。。。 争取只挂一科 先来先算法&#xff08;FCFS&#xff09; 算法思想 我今天学FCFS只有一个要求 公平、公平 还是tnd公平 算法规则 按照进程的先后顺序来进行服务。 是否…

Web自动化测试:WebDriverWait元素等待和全局设置

由于现在部分web应用加载方式的选择&#xff0c;页面会需要一定时间逐渐加载完毕&#xff0c;也就是说有的页面元素先加载出来&#xff0c;有的元素后加载出来。如果直接定位所查找的元素的话&#xff0c;可能会由于此元素尚未加载完毕找不到元素从而报错&#xff0c;由于网络不…

leetcode 647.回文子串

题目描述 给你一个字符串 s &#xff0c;请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个序列。 具有不同开始位置或结束位置的子串&#xff0c;即使是由相同的字符组成&#xff0c;也会…

【干货】有效的项目绩效管理评估,能成为组织成长的引擎

是谁已经开始在写年中总结了&#xff1f; 对于这件事&#xff0c;项目经理们肯定不会缺席&#xff0c;毕竟每周、每月、每个季度都少不了项目报告。这两天项目经理小刘&#xff0c;还在办公室吐槽项目绩效的数据实在太差了&#xff0c;询问如何能巧妙美化数据&#xff0c;这是…

算法学习day20

文章目录 513.找树左下角的值递归迭代 112 .路径总和递归迭代 113.路径总和II递归 106.从中序与后序遍历序列构造二叉树递归 105.从前序与中序遍历序列构造二叉树卡尔递归版本递归优化 总结 513.找树左下角的值 给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底…