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

一、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文件关闭。

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Spring 】项目创建和使用

哈喽&#xff0c;哈喽&#xff0c;大家好~ 我是你们的老朋友&#xff1a;保护小周ღ 谈起Java 圈子里的框架&#xff0c;最年长最耀眼的莫过于 Spring 框架啦&#xff0c;如今已成为最流行、最广泛使用的Java开发框架之一。不知道大家有没有在使用 Spring 框架的时候思考过这…

VulnHub靶机渗透:SKYTOWER: 1

SKYTOWER: 1 靶机环境介绍nmap扫描端口扫描服务扫描漏洞扫描总结 80端口目录爆破 3128端口获取立足点获取立足点2提权总结 靶机环境介绍 https://www.vulnhub.com/entry/skytower-1,96/ 靶机IP&#xff1a;192.168.56.101 kali IP&#xff1a;192.168.56.102 nmap扫描 端口扫…

使用mpi并行技术实现wordcount算法

【问题描述】 编写程序统计一个英文文本文件中每个单词的出现次数&#xff08;词频统计&#xff09;&#xff0c;并将统计结果按单词字典序输出到屏幕上。 注&#xff1a;在此单词为仅由字母组成的字符序列。包含大写字母的单词应将大写字母转换为小写字母后统计。 【输入形…

ChatGPT使用的SSE技术是什么?

在现代web应用程序中&#xff0c;实时通信变得越来越重要。HTTP协议的传统请求/响应模式总是需要定期进行轮询以获得最新的数据&#xff0c;这种方式效率低下并且浪费资源。因此&#xff0c;出现了一些新的通信技术&#xff0c;如WebSocket和SSE。但是&#xff0c;GPT为什么选择…

分布式数据库架构

分布式数据库架构 1、MySQL常见架构设计 对于mysql架构&#xff0c;一定会使用到读写分离&#xff0c;在此基础上有五种常见架构设计&#xff1a;一主一从或多从、主主复制、级联复制、主主与级联复制结合。 1.1、主从复制 这种架构设计是使用的最多的。在读写分离的基础上…

JS 介绍 Babel 的使用及 presets plugins 的概念

一、Babel 是什么 Bebal 可以帮助我们将新 JS 语法编译为可执行且兼容旧浏览器版本的一款编译工具。 举个例子&#xff0c;ES6&#xff08;编译前&#xff09;&#xff1a; const fn () > {};ES5&#xff08;编译后&#xff09;&#xff1a; var fn function() {}二、B…

设计模式-抽象工厂模式

抽象工厂模式 1、抽象工厂模式简介2、具体实现 1、抽象工厂模式简介 抽象工厂模式(Abstract Factory Pattern)在工厂模式尚添加了一个创建不同工厂的抽象接口(抽象类或接口实现)&#xff0c;该接口可叫做超级工厂。在使用过程中&#xff0c;我们首先通过抽象接口创建不同的工厂…

【HTML界面设计(二)】说说模块、登录界面

记录很早之前写的前端界面&#xff08;具体时间有点久远&#xff09; 一、说说模板 采用 适配器&#xff08;Adapter&#xff09;原理 来设计这款说说模板&#xff0c;首先看一下完整效果 这是demo样图&#xff0c;需要通过业务需求进行修改的部分 这一部分&#xff0c;就是dem…

Redis系列--布隆过滤器(Bloom Filter)

一、前言 在实际开发中&#xff0c;会遇到很多要判断一个元素是否在某个集合中的业务场景&#xff0c;类似于垃圾邮件的识别&#xff0c;恶意ip地址的访问&#xff0c;缓存穿透等情况。类似于缓存穿透这种情况&#xff0c;有许多的解决方法&#xff0c;如&#xff1a;redis存储…

宏景eHR SQL注入漏洞复现(CNVD-2023-08743)

0x01 产品简介 宏景eHR人力资源管理软件是一款人力资源管理与数字化应用相融合&#xff0c;满足动态化、协同化、流程化、战略化需求的软件。 0x02 漏洞概述 宏景eHR 存在SQL注入漏洞&#xff0c;未经过身份认证的远程攻击者可利用此漏洞执行任意SQL指令&#xff0c;从而窃取数…

如何在大规模服务中迁移缓存

当您启动初始服务时&#xff0c;通常会过度设计以考虑大量流量。但是&#xff0c;当您的服务达到爆炸式增长阶段&#xff0c;或者如果您的服务请求和处理大量流量时&#xff0c;您将需要重新考虑您的架构以适应它。糟糕的系统设计导致难以扩展或无法满足处理大量流量的需求&…

docker基础

文章目录 通过Vagrant安装虚拟机修改虚拟机网络配置 docker CE安装(在linux上)docker desktop安装(在MacOS上)Docker架构关于-阿里云镜像加速服务配置centos卸载docker 官网: http://www.docker.com 仓库: https://hub.docker.com Docker安装在虚拟机上&#xff0c;可以通过V…

Go语言的TCP和HTTP网络服务基础

目录 【TCP Socket 编程模型】 Socket读操作 【HTTP网络服务】 HTTP客户端 HTTP服务端 TCP/IP 网络模型实现了两种传输层协议&#xff1a;TCP 和 UDP&#xff0c;其中TCP 是面向连接的流协议&#xff0c;为通信的两端提供稳定可靠的数据传输服务&#xff1b;UDP 提供了一种…

[MySQL]不就是SQL语句

前言 本期主要的学习目标是SQl语句中的DDL和DML实现对数据库的操作和增删改功能&#xff0c;学习完本章节之后需要对SQL语句手到擒来。 1.SQL语句基本介绍 SQL&#xff08;Structured Query Language&#xff09;是一种用于管理关系型数据库的编程语言。它允许用户在数据库中存…

双因素身份验证在远程访问中的重要性

在快速发展的数字环境中&#xff0c;远程访问计算机和其他设备已成为企业运营的必要条件。无论是在家庭办公室运营的小型初创公司&#xff0c;还是团队分散在全球各地的跨国公司&#xff0c;远程访问解决方案都能保证工作效率和连接性&#xff0c;能够跨越距离和时间的阻碍。 …

7Z045 引脚功能详解

本文针对7Z045芯片&#xff0c;详细讲解硬件设计需要注意的技术点&#xff0c;可以作为设计和检查时候的参考文件。问了方便实用&#xff0c;按照Bank顺序排列&#xff0c;包含配置Bank、HR Bank、HP Bank、GTX Bank、供电引脚等。 参考文档包括&#xff1a; ds191-XC7Z030-X…

怎么计算 flex-shrink 的缩放尺寸

计算公式: 子元素的宽度 - (子元素的宽度的总和 - 父盒子的宽度) * (某个元素的flex-shrink / flex-shrink总和) 面试问题是这样的下面 left 和 right 的宽度分别是多少 * {padding: 0;margin: 0;}.container {width: 500px;height: 300px;display: flex;}.left {width: 500px…

红日靶场(一)外网到内网速通

红日靶场&#xff08;一&#xff09; 下载地址&#xff1a;http://vulnstack.qiyuanxuetang.net/vuln/detail/2/ win7:双网卡机器 win2003:域内机器 win2008域控 web阶段 访问目标机器 先进行一波信息收集&#xff0c;扫一下端口和目录 扫到phpmyadmin&#xff0c;还有一堆…

【资料分享】Xilinx Zynq-7010/7020工业核心板规格书(双核ARM Cortex-A9 + FPGA,主频766MHz)

1 核心板简介 创龙科技SOM-TLZ7x是一款基于Xilinx Zynq-7000系列XC7Z010/XC7Z020高性能低功耗处理器设计的异构多核SoC工业核心板&#xff0c;处理器集成PS端双核ARM Cortex-A9 PL端Artix-7架构28nm可编程逻辑资源&#xff0c;通过工业级B2B连接器引出千兆网口、USB、CAN、UA…

Triton教程 --- 动态批处理

Triton教程 — 动态批处理 Triton系列教程: 快速开始利用Triton部署你自己的模型Triton架构模型仓库存储代理模型设置优化动态批处理 Triton 提供了动态批处理功能&#xff0c;将多个请求组合在一起执行同一模型以提供更大的吞吐量。 默认情况下&#xff0c;只有当每个输入在…