Java POI (1)—— 数据读写操作快速入门-程序员宅基地

技术标签: excel  spring boot  java  intellij-idea  资源  程序人生  开发语言  

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_49171365/article/details/131337442

智能推荐

(附源码)ssm基于微信小程序的社区老人健康管理服务系统的设计与实现 毕业设计011513_基于微信小程序的社区管理系统设计论文-程序员宅基地

文章浏览阅读2k次,点赞7次,收藏30次。对于本社区老人健康管理服务系统的设计来说,通过科学的管理方式、便捷的服务提高了工作效率,减少了数据存储上的错误和遗漏。社区老人健康管理服务系统使用Java语言,采用基于MVVM模式的SSM技术进行开发,使用 Eclipse 2017 CI 10 编译器编写,数据方面主要采用的是微软的MySQL关系型数据库来作为数据存储媒介,配合前台HTML+CSS 技术完成系统的开发。具体根据社区老人健康管理服务系统的现状来进行开发的,具体根据用户需求实现社区老人健康管理服务系统网络化的管理,各类信息有序地进行存储...._基于微信小程序的社区管理系统设计论文

Java中的Action、Service和DAO层功能区分及示例解释-程序员宅基地

文章浏览阅读555次。Action/Service/DAO简介:Action是管理业务(Service)调度和管理跳转的。Service是管理具体的功能的。Action只负责管理,而Service负责实施。DAO只完成增删改查,虽然可以1-n,n-n,1-1关联,模糊、动态、子查询都可以。但是无论多么复杂的查询,dao只是封装增删改查。至于增删查改如何去实现一个功能,dao是不管的。总结这三者,通过例子来解释:Acti..._java中action

Servlet详解-程序员宅基地

文章浏览阅读321次。Servlet (Server Applet),全称Java Servlet。是用Java编写的服务器端程序,其,生成动态的Web内容。Servlet运行于支持Java的应用服务器中(如Tomcat等)。从实现上讲,Servlet可以响应任何类型的请求,但绝大多数情况下,servlet只用来扩展基于HTTP协议的服务器。

VMware与艾莫讯国产300编程电缆兼容性问题_虚拟机插入mpi电缆卡死-程序员宅基地

文章浏览阅读1.3k次。VMware-15.1.0 -VMware-15.5.5之间所有的版本都与国产艾莫讯0CB20电缆有兼容问题。 具体故障是只要连接到虚拟机并驱动就会造成虚拟机死机。西门子官方的0CB20电缆不会存在这个问题。说明国产电缆和官方电缆的实现方式还是有区别,这次蓝屏死机BUG主要是由VMware引起的,为了验证我还特意去咸鱼上整了一条官方电缆。 我为什么知道这么清楚呢,因为vmware每一次更新我都会去升级,然后去现场干活。接下来的事情你们应该能想到了,去现场都读程序,结果插上电缆就死机。急忙跟客户说.._虚拟机插入mpi电缆卡死

java找不到符号解决办法-程序员宅基地

文章浏览阅读1.6w次,点赞11次,收藏15次。一、java找不到符号如果你的代码里没有报错,明明是存在的。但是java报错找不到符号。像下面这样子。二、解决步骤1.清除编码工具缓存本人用的idea, eclipse清除缓存方式有需要的可以百度一下!2.如果是mavne项目的先clean 再package总结提示:一定要package本人刚开始就是知道clean了,没有package导致问题一直没有解决。在此记录一下!...

【Nginx】配置详解_nginx修改配置文件如何生效-程序员宅基地

文章浏览阅读1.3w次,点赞4次,收藏22次。访问到未定义的扩展名的时候,就默认为下载该文件。#服务器并发处理能力,值越大并发能力越强(受自身配置限制)一个http块可以包含多个server块,而一个server块就等于一个虚拟主机。nginx配置最频繁的部分,比如代理,日志,缓存、第三方模块等等。包括文件引入、MIME-TYPE定义,日志自定义、连接超时等等。需要注意的是http块可以包括http全局块和server块。server块又包含全局server块和location块。二、容器部署的项目,配置nginx。2.2,events块。..._nginx修改配置文件如何生效

随便推点

Buck电路 (PWM实现与闭环反馈) 电力系统仿真_buck电路带反馈控制-程序员宅基地

文章浏览阅读962次,点赞2次,收藏11次。Buck电路 (PWM实现与闭环反馈) 电力系统仿真_buck电路带反馈控制

jQuery实现轮播图代码_jquery轮播图代码-程序员宅基地

文章浏览阅读699次,点赞11次,收藏8次。一个简单的jQuery轮播图代码,首先,定义了一个slideshow-container的div容器,其中包含了所有轮播图幻灯片。每个幻灯片都包含一个mySlides的类名,并且使用CSS将其隐藏。在showSlides()函数中,遍历所有幻灯片并将它们隐藏,然后显示当前索引的幻灯片。最后,我们使用setTimeout()函数来每隔2秒钟调用showSlides()函数,从而实现了轮播效果。它使事情变得更简单,使用jQuery能够以最小的努力在Web上构建复杂的交互性。_jquery轮播图代码

android adb install apk的安装流程_full install must include a base packag-程序员宅基地

文章浏览阅读1.1w次,点赞6次,收藏23次。一、简介 1.Android上应用安装可以分为以下几种方式:通过adb命令安装:adb 命令包括adb push/install 用户下载的Apk,通过系统安装器packageinstaller安装该Apk。packageinstaller是系统内置的应用程序,用于安装和卸载应用程序。 系统开机时安装系统应用。 电脑或者手机上的应用商店自动安装第三种系统安装我们在上个章节P..._full install must include a base packag

漂亮的css透明样式菜单-程序员宅基地

文章浏览阅读74次。下载地址漂亮的css透明样式菜单,可以用作工具栏或者导航条,小图标可以自定义。dd:_漂亮的css透明样式菜单

牛人莫入 Silverlight DataGrid 分组技巧 -程序员宅基地

文章浏览阅读983次。牛人莫入 Silverlight DataGrid 分组技巧 最近在项目中很多的地方都用到了数据的展示---DataGrid控件,在园子里面也有很多的朋友也对这个DataGrid控件也写了很多的教程;我这里也与其它人也没有什么区别,这里只是告诉大家一个小的技巧;但是我相信这一个小的技巧对大家以后在项目中应该有一些帮助;一天,领导走过来看了我用户管理UI,我用了一

U-net网络_sr3 的u-net-程序员宅基地

文章浏览阅读1.8w次,点赞14次,收藏89次。 U-net网络是一个典型的端到端的网络结构。如下图所示: 基本的网络结构并不复杂,但是代码实现过程中需要进行调试,但这会花费很大的时间。本文旨在为初学者介绍代码的快速使用方法,直接将U-net网络作为黑盒使用。如果您觉得对您有用,请点个赞,欢迎交流。一:从github上下载改进的U-net源码:点击打开传送门显示如下:二:点击Clone or download,下载..._sr3 的u-net