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

news/2024/7/21 7:07:33 标签: java, spring boot, intellij-idea, excel, 开发语言

一、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版本

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

java">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("文件生成完毕!");
    }
}

生成成功! 

②、读取数据

 

java">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版本

①、写入数据

java">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版本

java">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的内容则会被覆盖))

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

 

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

java">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+"秒");
    }
}

java">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.niftyadmin.cn/n/464319.html

相关文章

【Docker】容器化和虚拟化基础

Docker发展史 Jail(监狱)时代 1979 年 贝尔实验室发明 chroot chroot的设计原理是&#xff1a;把一个进程的文件系统隔离起来。 ​ chroot 系统调用可以将进程及其子进程的根目录更改为文件系统中的新位置。隔离以后&#xff0c;该进程无法访问到外面的文件&#xff0c;因此这…

在AI到来的时代,作为技术人,持续学习是我们的秘密武器哦!

✨求关注~ &#x1f600;博客&#xff1a;www.protaos.com 在AI到来的时代&#xff0c;作为技术人&#xff0c;持续学习是我们的秘密武器哦&#xff01;&#x1f60e;&#x1f4da; 首先&#xff0c;让我们和最酷的技术圈子保持紧密的联系。订阅那些超级棒的技术博客和新闻网站…

vue3 + vite 性能优化,详细代码说明

对于Vue 3和Vite应用的性能优化&#xff0c;以下是一些常见的技巧和建议&#xff1a; 使用Tree-shaking&#xff1a;Vue 3和Vite支持ES模块的静态分析&#xff0c;因此可以利用Tree-shaking特性&#xff0c;只引入项目中实际使用的模块&#xff0c;减少打包体积。 懒加载路由&…

ICLR 23 | 工业视觉小样本异常检测最新网络:Graphcore

来源&#xff1a;投稿 作者&#xff1a;橡皮 编辑&#xff1a;学姐 论文链接&#xff1a;https://openreview.net/pdf?idxzmqxHdZAwO 论文代码&#xff1a;尚未开源 1.背景 随着人工智能中深度视觉检测技术的快速发展&#xff0c;检测工业产品表面的异常/缺陷受到了前所未有…

MySQL字段类型

整数类型 类型名称大小范围&#xff08;有符号&#xff09;范围&#xff08;无符号&#xff09;tinyint极小整数值1字节-128~1270~256smallint小整数值2字节-32768~327670~65535mediumint中等整数值3字节-8388608~83886070~16777215int整数值&#xff08;基本数据类型&#xf…

软件开发实习个人总结

软件开发实习个人总结篇1 一、实习目的 随着时代发展和社会进步&#xff0c;用人单位对游戏软件专业大学生的要求越来越高&#xff0c;对于即将毕业的游戏软件专业在校生而言&#xff0c;为了能更好的适应游戏软件专业严峻的就业形势&#xff0c;毕业后能够尽快的融入到社会&am…

6.23作业

作业1-->>用户、磁盘相关指令 结果-->>不记得 查漏-->>相关指令分类、用户指令、磁盘指令 补缺-->> 相关指令分类&#xff1a; 文件管理文件权限管理磁盘管理用户管理用户指令&#xff1a; 新增使用者帐号&#xff08;创建用户 &#xff09; adduse…

【面试题08】__construct 与 __destruct 区别

文章目录 一、概览二、介绍2.1 __construct方法2.2 __destruct方法2.3 区别 总结 一、概览 本文已收录于PHP全栈系列专栏&#xff1a;PHP面试专区。 计划将全覆盖PHP开发领域所有的面试题&#xff0c;对标资深工程师/架构师序列&#xff0c;欢迎大家提前关注锁定。 这也是一个非…