Java POI (1)—— 数据读写操作快速入门

news2024/12/23 14:33:38

一、Excel的版本区别(03版和07版)

        所谓“03版” 和 “07版”,指的是 Microsoft Excel 版本号。这些版本号代表着不同的Excel 文件格式。2003版 Excel 使用的文件格式为 .xls,而2007版开始使用新的文件格式 .xlsx。

        . xlsx 文件格式使用了一种基于 XML 的压缩方式来存储 Excel 数据,这种方式可以减小文件大小,并提高文件的可读性和可编辑性。相比之下,.xls 文件格式是一种二进制格式,常常导致文件体积较大以及许多兼容性问题。

        除了文件格式之外,Microsoft Excel 2007和Microsoft Excel 2003之间还存在一些其他差异:

  1. 兼容性差异。由于文件格式的不同,Microsoft Excel 2003不能直接打开Microsoft Excel 2007的 .xlsx 文件,除非安装了文件格式转换器。

  2. 新功能差异。Microsoft Excel 2007引入了许多新功能,如数据透视表和高级图表,而这些功能在Microsoft Excel 2003中并不存在。

  3. 最大行数差异。Microsoft Excel 2007支持最多 1048576 行数据,而Microsoft Excel 2003仅支持最多 65536 行数据。

        总的来说,Microsoft Excel 2007相对于2003具有更好的用户体验、更高的数据处理能力、更好的可视化效果、更好的稳定性和兼容性。但是,当需要与使用 Microsoft Excel 2003 的用户共享文件时,则需要注意版本兼容性问题。

二、Apache  POI 存在的问题和POI 操作Execl

存在的问题:

        Java解析、生成Excel比较有名的框架有POI、JXL。但是它们都存在一个严重的问题,就是非常损耗内存,也就是数据量比较大的时候有可能会出现OOM(内存溢出)的问题,但是POI有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但是依旧没有完全的解决内存消耗过大的问题。

Apache  POI操作Execl

03版本

①、写入数据(跟导入导出的逻辑很类似)

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import java.io.FileOutputStream;
import java.io.IOException;

public class Demo {
    public static void main(String[] args) throws IOException {

        new Demo().writedemo();
    }

    public void writedemo() throws IOException {

        //创建工作薄 (03 版本)
        HSSFWorkbook workbookb = new HSSFWorkbook();
        //创建工作表
        HSSFSheet sheet = workbookb.createSheet("sheet1");
        //创建行
        HSSFRow cells = sheet.createRow(1);
        //创建单元格
        HSSFCell cell = cells.createCell(1);
        //写入数据
        cell.setCellValue("商品ID");
        //生成一张表(IO流)
        FileOutputStream fileOutputStream = new FileOutputStream("./测试数据.xls");
        workbookb.write(fileOutputStream);
        //关闭输出流
        fileOutputStream.close();
        System.out.println("文件生成完毕!");
    }
}

生成成功! 

②、读取数据

 

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 java.io.FileInputStream;


public class TestDemo {
    public static void main(String[] args) throws Exception {
        //读文件操作
       readexcel030();
    }

    public static void readexcel030() throws Exception {
        //1.通过文件流读取Excel工作簿
        FileInputStream inPutStream = new FileInputStream("./03TestBatchData.xls");

        //2.获取工作簿
        Workbook workbook=new HSSFWorkbook(inPutStream);

        //3.获取表(通过下标的方式来进行读取或者 可以采用表名来进行读取)
        Sheet sheet = workbook.getSheetAt( 0);

        //4.获取行(采用下标的方式来进行获取)
        Row row=sheet.getRow( 0);

        //5.获取单元格(采用下标的方式)
        Cell cell = row.getCell( 0);

        //6.读取数据
        //String data =cell.getStringCellValue();
        Integer data = (int) cell.getNumericCellValue();
        System.out.println(data);
        //7.关闭流
        inPutStream.close();}
}
07版本

①、写入数据

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileOutputStream;
import java.io.IOException;

public class Demo {
    public static void main(String[] args) throws IOException {

        new Demo().writedemo();
    }

    public void writedemo() throws IOException {

        //创建工作薄 (03 版本)
        XSSFWorkbook workbookb = new XSSFWorkbook();
        //创建工作表
        XSSFSheet sheet = workbookb.createSheet("sheet1");
        //创建行
        XSSFRow cells = sheet.createRow(1);
        //创建单元格
        XSSFCell cell = cells.createCell(1);
        //写入数据
        cell.setCellValue("产品ID");
        //生成一张表(IO流)
        FileOutputStream fileOutputStream = new FileOutputStream("./测试数据.xlsx");
        workbookb.write(fileOutputStream);
        //关闭输出流
        fileOutputStream.close();
        System.out.println("文件生成完毕!");
    }
}

②、读取数据(与03类似)

三、批量数据和大量数据的写入

03版本

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import java.io.FileOutputStream;
import java.io.IOException;

public class TestDemo {
    public static void main(String[] args) throws IOException {
       // 03 版本
       writeBatchData03();
    }

    public static void writeBatchData03() throws IOException {
        //开始时间
        long start = System.currentTimeMillis();
        //创建工作簿
        HSSFWorkbook workbook = new HSSFWorkbook();
        //创建表
        HSSFSheet sheet = workbook.createSheet();
        //03 版本最多只能写入65536行数据,超出这个行数就会报出异常
        for (int rowNum = 0; rowNum < 65536; rowNum++) {
            HSSFRow row = sheet.createRow(rowNum);
            for (int cellNum = 0; cellNum < 20; cellNum++) {
                HSSFCell cell = row.createCell(cellNum);
                cell.setCellValue(cellNum+1);
            }
        }
        //生成表
        FileOutputStream fileOutputStream = new FileOutputStream("./03TestBatchData.xls");
        workbook.write(fileOutputStream);
        fileOutputStream.close();
        System.out.println("03版本表格生成完毕!");
        //结束时间
        long end = System.currentTimeMillis();
        System.out.println("耗时:"+(end - start)/1000+"秒");
    }
}

 ( 即使没有创建好 03TestBatchData.xls 也会自动生成,当然此处也没有指定生成的sheet页面,默认会在sheet 0 内创建好,如果指定了,则会在指定的sheet页内进行创建。(如果没有新建一个对象,仅在原有的对象的workbook.createSheet 语句上进行修改,那么原来Excel文件创建好的sheet的内容则会被覆盖))

HSSFSheet sheet = workbook.createSheet("03");

 

 07版本(这个时间明显要比03版本的慢很多)

import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileOutputStream;
import java.io.IOException;

public class TestDemo {
    public static void main(String[] args) throws IOException {
       // 07 版本
       writeBatchData07();
    }

    public static void writeBatchData07() throws IOException {
        //开始时间
        long start = System.currentTimeMillis();
        //创建工作簿
        XSSFWorkbook workbook = new XSSFWorkbook();
        //创建表
        XSSFSheet sheet = workbook.createSheet("03");
        //03 版本最多只能写入65536行数据,超出这个行数就会报出异常
        for (int rowNum = 0; rowNum < 65536; rowNum++) {
            XSSFRow row = sheet.createRow(rowNum);
            for (int cellNum = 0; cellNum < 20; cellNum++) {
                XSSFCell cell = row.createCell(cellNum);
                cell.setCellValue(cellNum+1);
            }
        }
        //生成表
        FileOutputStream fileOutputStream = new FileOutputStream("./07TestBatchData.xlsx");
        workbook.write(fileOutputStream);
        fileOutputStream.close();
        System.out.println("07版本表格生成完毕!");
        //结束时间
        long end = System.currentTimeMillis();
        System.out.println("耗时:"+(end - start)/1000+"秒");
    }
}

import org.apache.poi.xssf.streaming.SXSSFCell;
import org.apache.poi.xssf.streaming.SXSSFRow;
import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import java.io.FileOutputStream;
import java.io.IOException;

public class TestDemo {
    public static void main(String[] args) throws IOException {
       // 07 版本大表模式
       writeBigData07();
    }

    public static void writeBigData07() throws IOException {
        //开始时间
        long start = System.currentTimeMillis();
        //创建工作簿(可以自定义窗口大小,不填就是使用默认值100的窗口)
        SXSSFWorkbook workbook = new SXSSFWorkbook();
        //创建表
        SXSSFSheet sheet = workbook.createSheet("07");
        //03 版本最多只能写入65536行数据,超出这个行数就会报出异常
        for (int rowNum = 0; rowNum < 65536; rowNum++) {
            SXSSFRow row = sheet.createRow(rowNum);
            for (int cellNum = 0; cellNum < 20; cellNum++) {
                SXSSFCell cell = row.createCell(cellNum);
                cell.setCellValue(cellNum+1);
            }
        }
        //生成表
        FileOutputStream fileOutputStream = new FileOutputStream("./07TestBigData.xlsx");
        workbook.write(fileOutputStream);
        fileOutputStream.close();
        System.out.println("07版本大表格生成完毕!");
        //结束时间
        long end = System.currentTimeMillis();
        System.out.println("耗时:"+(end - start)/1000+"秒");
    }
}

 可以看到时间快了非常多(相比之前的07版本来说)

 

四、注意事项

程序进行操作的时候记得一定要把excel文件关闭。

 

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

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

相关文章

Unreal 5 蓝图常用的一些节点和规范

命名规范 蓝图类以 BP_作为前缀 对应Blue Print 混合空间以 BS_作为前缀 Blend Space 静态网格体以 SM_作为前缀 StaticMesh 骨骼网格体以 SK_作为前缀 Skeletal Mesh 纹理以 T_作为前缀 Texture 粒子系统 以 PS_作为前缀 Particle System 主材质以 M_作为前缀 Material 材质子…

手术机器人常见骨科手术 TKA UKA HTO

TKA UKA HTO 首先这几种手术都是常见的手术&#xff0c;下面先进行常见的但要介绍&#xff1a; 近年来有大量的研究聚焦于手术方式的对比&#xff0c;这里先就现有证据对「HTO」、单髁置换「UKA」和全膝置换「TKA」做一个简要的总结&#xff0c;以便于速查&#xff1a; TKA 不…

熵权法步骤及例题讲解

一、基本原理 在信息论中&#xff0c;熵是对不确定性的一种度量。不确定性越大&#xff0c;熵就越大&#xff0c;包含的信息量越大&#xff1b;不确定性越小&#xff0c;熵就越小&#xff0c;包含的信息量就越小。 根据熵的特性&#xff0c;可以通过计算熵值来判断一个事件的随…

【玩转Linux操作】详细讲解shell的注释,变量,字符串,数组等操作

&#x1f38a;专栏【玩转Linux操作】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【Counting Stars 】 欢迎并且感谢大家指出小吉的问题&#x1f970; 文章目录 &#x1f354;概述⭐注意⭐示例&#x1f3f3;️‍&#x1f308;然…

scala的基本语法

注释 对于scala的注释&#xff0c;简而言之就是一句话&#xff0c;和java的注释一模一样 基本语法 &#xff08;1&#xff09;单行注释&#xff1a;// &#xff08;2&#xff09;多行注释&#xff1a;/* */ &#xff08;3&#xff09;文档注释&#xff1a;/****/代码示例&…

samaphore、countdownlatch、cyclinarrier

目录 一、samaphore 1、介绍 2、应用 3、原理 二、countdownlatch 三、cyclicbarrier 一、samaphore 1、介绍 信号量&#xff0c;用来限制同时访问共享资源的线程上限。可以理解为停车场入口的提示排&#xff0c;标识有多少车位&#xff0c;有车位才能进去停车&#xf…

ElasticSearch-使用IK分词器进行分词

使用KIbana测试IK分词器 打开开发工具台 ik_smart 最少分词器 分词结果比较少 GET _analyze{"analyzer": "ik_smart","text": "中国共产党"}ik_max_word 颗粒度最细分词器 分词结果比较多,组成各种结果,穷尽词库的可能&#xff01…

easypan前端学习

文章目录 前端项目node 版本node镜像构建项目创建项目安装项目所有依赖 图片资源网站encodeURI & decodeURIapp.config.globalProperties与getCurrentInstanceObject.assignvue-cookies安装vue-cookies 使用vue-cookiesrouter.currentRoutepreserve logimport.meta.envRequ…

QPaint绘制图形

流程 继承QWidget类&#xff0c;重写paintEvent方法&#xff0c;在其中使用QPainter进行绘图。 举例 创建项目&#xff0c;项目结构如下&#xff1a; // widget.h#ifndef WIDGET_H #define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE namespace Ui { class Widget…

TypeScript ~ TS 掌握编译文件配置项 ⑥

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; TypeScript ~ TS &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &…

git 上传下载

文章目录 gitee/GitHub 是用来做什么的&#xff1f;什么时候需要学习上传项目到 gitee&#xff1f;为什么要将本地项目上传到 gitee&#xff1f;创建 gitee 仓库&#xff1a;在本地新建一个项目将仓库拉取到本地使用 idea 实现项目的上传下载gitee 仓库查看 下面我就来为大家介…

第六章 习题(6789B)【计算机系统结构】

第六章 习题【计算机系统结构】 前言推荐第六章 习题678911 最后 前言 2023-6-24 10:43:46 以下内容源自《【计算机系统结构】》 仅供学习交流使用 推荐 第五章 作业&#xff08;149A&#xff09;【计算机系统结构】 答案参考&#xff1a; https://www.docin.com/p-28456…

LVDS (Low Voltage Differential Signaling)基础知识

LVDS(Low Voltage Differential Signaling&#xff09;: 是一种小振幅差分信号技术&#xff0c;它使用非常低的幅度信号 (250mV~450mv&#xff09;通过一对平行的 PCB 走线或平衡电缆传输数据。 在两条平行的差分信号线上流经的电流及电压振幅相反&#xff0c;噪声信号同时耦…

小鱼C python - 集合的练习

题一&#xff1a;用字典实现集合的去重特性 1. 生成100个1&#xff5e;100的随机值 思路&#xff1a; 1. range 范围 2. random.randint(a,b) import random x [] for I in range(100):x.append(random.randint(1,100)) print(x) 2. x和y的交集 思路&#xff1a;1.遍历x,…

通过 pGina 对 Windows 设备进行管理

文章目录 前言1、环境信息1.1、服务器端1.2、客户端 2、pGina 安装及配置2.1、下载并安装2.2、配置2.3、模拟测试2.4、Windows 远程登录测试 总结 前言 对 Windows 设备进行管理&#xff0c;一般是通过 AD 进行的&#xff0c;但是这玩意儿是收费的&#xff0c;而且还挺贵。有没…

SpringSecurity(二):自定义认证(源码+落地实现)。

自定义认证 自定义资源权限规则资源分类自定义资源权限规则为什么我们要自定义呢&#xff1f;如何去覆盖呢&#xff1f;WebSecurityConfigurerAdapter它是干什么用的实例 自定义登录界面步骤源码解析 自定义登录成功处理&#xff08;前后端分离的情况&#xff09;项目环境succe…

Axure中使用echarts图标

第一步&#xff1a;axure中防一个矩形框 第二步&#xff1a;将矩形框命名为Demo 这步很重要&#xff0c;后续会引用这个名字 第三步&#xff1a;打开Echarts示例&#xff0c;选择需要的样式&#xff0c;并调整数值 Examples - Apache ECharts 第四步&#xff1a;代码准备 需…

Windows10host文件修改方法

1、首先打开“此电脑”&#xff0c;定位到&#xff1a; C:\Windows\System32\drivers\etc 2、使用鼠标右键单击“hosts”&#xff0c;弹出来的菜单中选择“属性” 3、弹出“文件属性”窗口后单击“上方的”安全“栏”。 选中“ALL APPLICATON PACKAGES”后单击“编辑” 4、同…

Jmeter核心结构和运行原理(1)

Jmeter核心结构和运行原理 一、Jmeter核心结构和运行原理1、JMeter核心结构2、JMeter的体系结构3、JMeter运行原理a、GUI模式&#xff1a;b、非GUI模式&#xff1a;c、单机模式&#xff1a;d、分布式模式 一、Jmeter核心结构和运行原理 1、JMeter核心结构 测试计划 线程组 配…

MongoDB基本使用(一)

MongoDB基本使用 Nosql简介 NoSQL(NoSQL Not Only SQL )&#xff0c;意即”不仅仅是SQL”。 在现代的计算系统上每天网络上都会产生庞大的数据量&#xff0c; 这些数据有很大一部分是由关系数据库管理系统&#xff08;RDBMS&#xff09;来处理。 1970年 E.F.Codd’s提出的关系…