POI高级使用法则

2023-11-08

各位兄台,想必经过昨日好梦,早已精神饱满,请允许小编接听上回,讲解POI进阶功法。

昨日奇闻:POI搞定电子表格

我们经过昨日的学习,懂得了POI基本的读写操作,今日让我们进一步看一下POI的高级使用方法。

我们知道对于Excel是含有03版本和07版本,且对于两种版本其操作的不同,那么两者到底有何不同呢?

HSSF的写入

在写入的行数超过65536行,会报错

java.lang.IllegalArgumentException: Invalid row number (65536) outside allowable range (0…65535)

但是它的速度很快,执行的流程是先写入缓存中,最后一起写入磁盘中去

@Test
   public void test() throws Exception {
       Long start = System.currentTimeMillis(); //默认的返回值为毫秒
       Workbook workbook = new HSSFWorkbook();
       Sheet sheet = workbook.createSheet("我的03EXCELBIg");
       for (int rowNum=0;rowNum<65536;++rowNum){
           Row row = sheet.createRow(rowNum);
           for (int cellNum=0;cellNum<10;++cellNum){
               Cell cell = row.createCell(cellNum);
               cell.setCellValue(rowNum+"-"+cellNum);
          }
      }
       FileOutputStream fileOutputStream = new FileOutputStream(PATH + "03Big.XLS");
       workbook.write(fileOutputStream);
       fileOutputStream.close();
       long end = System.currentTimeMillis();
       System.out.println((end-start)/1000);
  }
//当rowNum超过65536时,报上面的错误,花费的时间根据电脑配置不同,花费的时间也不同 这里我的是3s

XSSF的写入

速度慢,耗内存,但是可以写入的数据为100万条

@Test
   public void test() throws Exception {
       Long start = System.currentTimeMillis();
       Workbook workbook = new XSSFWorkbook();
       Sheet sheet = workbook.createSheet("我的07EXCELBIg");
       for (int rowNum=0;rowNum<65536;++rowNum){
           Row row = sheet.createRow(rowNum);
           for (int cellNum=0;cellNum<10;++cellNum){
               Cell cell = row.createCell(cellNum);
               cell.setCellValue(rowNum+"-"+cellNum);
          }
      }
       FileOutputStream fileOutputStream = new FileOutputStream(PATH + "03Big.XLSX");
       workbook.write(fileOutputStream);
       fileOutputStream.close();
       long end = System.currentTimeMillis();
       System.out.println((end-start)/1000);
  }
//这里的时间为18s 显然hssf更快

那么,当我们的数据很大时,速度不可以提升吗?当然是可以的,我们看一些Workbook的实现类

HSSFWorkbook //处理xls XSSFWorkbook //处理xlsx SXSSFWorkbook
//XSSFWorkbook的进阶版,为了提高处理xlsx的速度,使用方法和XSSFWorkbook是一样的

SXSSFWorkbook

SXSSF(软件包:org.apache.poi.xssf.streaming)是XSSF的API兼容流扩展,可用于必须生成非常大的电子表格且堆空间有限的情况。

XSSFWorkbook的进阶版,为了提高处理xlsx的速度,使用方法和XSSFWorkbook是一样的

SXSSF分配临时文件,您必须始终通过调用dispose方法来明确清理这些文件。

 @Test
    public void test2()throws Exception {
        Long start = System.currentTimeMillis();
        Workbook workbook = new SXSSFWorkbook();
        Sheet sheet = workbook.createSheet("我的07EXCELBIgs");
        for (int rowNum=0;rowNum<65536;++rowNum){
            Row row = sheet.createRow(rowNum);
            for (int cellNum=0;cellNum<10;++cellNum){
                Cell cell = row.createCell(cellNum);
                cell.setCellValue(rowNum+"-"+cellNum);
            }
        }
        FileOutputStream fileOutputStream = new FileOutputStream(PATH + "03Bigs.XLSX");
        workbook.write(fileOutputStream);
        fileOutputStream.close();
        //删除临时文件 注意
        ((SXSSFWorkbook) workbook).dispose();  
        long end = System.currentTimeMillis();
        System.out.println((end-start)/1000);
    }
速度变为4s 从18s到4s提高了

昨天,我们使用POI读取数据时,都是字符串类型,但在Excel中的数据类型,却不仅仅只有字符串一种数据类型呢?

那么其他类型的读取怎么做呢?

我们通过查找源码,发现其中单元格的类型为

那么我们在读取时,先判断类型,然后在输出。代码小编已经写好了,小伙伴们可以直接拿去用,可以作为工具类的简单模型。

public class TestDifferentType {

    private static String PATH = "D:\\Data\\idea数据\\small\\";

    public static void main(String[] args) throws Exception {
        FileInputStream fileInputStream = new FileInputStream(PATH + "不同类型.xls");
        Workbook workbook = new HSSFWorkbook(fileInputStream);
        Sheet sheet = workbook.getSheetAt(0);
        if(sheet!=null){
            Row rowTop = sheet.getRow(0);
            if(rowTop!=null){
                int cells = rowTop.getPhysicalNumberOfCells();
                for (int cellNum = 0; cellNum < cells; cellNum++) {
                    System.out.print(rowTop.getCell(cellNum).getStringCellValue()+" | ");
                }
            }
            System.out.println("");
            int rows = sheet.getPhysicalNumberOfRows();
            for (int rowNum = 1; rowNum <rows ; rowNum++) {
                Row row = sheet.getRow(rowNum);
                int cells = rowTop.getPhysicalNumberOfCells();
                for (int cellNum = 0; cellNum < cells; cellNum++) {
                    String cellValue = "";
                    Cell cell = row.getCell(cellNum);
                    CellType cellType = cell.getCellType();
                    switch (cellType){
                        case _NONE:
                            System.out.println("[异常类型]");
                            break;
                        case BLANK:
                            System.out.println("[空的]");
                            break;
                        case ERROR:
                            System.out.println("[错误的类型]");
                            break;
                        case STRING:
                            System.out.println("[字符串类型]");
                            cellValue = cell.getStringCellValue();
                            break;
                        case BOOLEAN:
                            System.out.println("[布尔型]");
                            cellValue = String.valueOf(cell.getBooleanCellValue());
                            break;
                        case NUMERIC:
                            System.out.println("[数字类型]");
                            if(HSSFDateUtil.isCellDateFormatted(cell)){
                                System.out.println("[日期]");
                                cellValue =new DateTime(cell.getDateCellValue()).toString("yyyy-MM-dd HH:mm:ss");
                                break;
                            }
                            cellValue = String.valueOf(cell.getNumericCellValue());
                            break;
                    }
                    System.out.println(cellValue);
                }
            }
        }
        fileInputStream.close();
    }
}

Excel在实际的工作中,可以做成绩单,工资表,其中关于数字的求和,求差等操作,可以利用公式解决。

那么POI也可以读取公式,从而达到读取数据的作用。

得到公式 String cellFormula = cell.getCellFormula();   
// 下面的类进行执行  
FormulaEvaluator formulaEvaluator = new HSSFFormulaEvaluator((HSSFWorkbook) workbook); CellValue value = formulaEvaluator.evaluate(cell);

后记
poi的使用讲解完毕,希望各位小伙伴们,都有所收获。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

POI高级使用法则 的相关文章

  • 如何测试 Jersey REST Web 服务?

    我已经编写了一个 Restful Web 服务 并且必须使用 JUnit4 对其进行测试 我已经使用 Jersey Client 编写了一个客户端 但想知道我是否只能使用 junit4 测试我的服务 至少有人可以帮我提供样品吗 我的休息服务
  • 视频文件转换/转码 Google App Engine

    我想启动一个云计算项目 其简单任务是 接收上传的视频文件 对它们进行一些转码 转换 允许用户下载 流式传输生成的文件 我刚在想ffmpeg作为集成在的外部命令行工具Java Google App engine Application 由于很
  • 打印数组时出错

    我得到这个代码 import java util import java io public class Oblig3A public static void main String args OrdAnalyse O new OrdAna
  • java.time.LocalDate 到 java.util.Date

    转换的最佳方式是什么java time LocalDate to java util Date Date from dateToReturn atStartOfDay ZoneId systemDefault toInstant 我一直在尝
  • 枚举内的枚举

    这不是我被卡住的问题 而是我正在寻找一种简洁的方式来编写我的代码 本质上 我正在编写一个事件驱动的应用程序 用户触发事件 事件被发送到适当的对象 然后对象处理事件 现在我正在编写偶数处理程序方法 我希望使用 switch 语句来确定如何处理
  • 在 Excel 中打印 MATLAB 图窗并调整其大小

    我在 MATLAB 中有两个带有手柄的图形hFig1 and hFig2 我想将它们打印到 Excel 中的特定单元格 单元格 E3 和 I3 并将它们重新调整为 2 英寸 x 3 英寸 我尝试过使用 AddPictures对象处理程序和使
  • Java 7 中新的 JNLP 缺少项目警告是怎么回事?

    从 Java 6 切换到 Java 7 后 我的 JNLP 仍然工作正常 但它现在抛出一系列如下错误 Missing Application Name manifest attribute for http blah com app jar
  • 在仔细锁定但不受信任的代码上使用 Thread.stop()

    我知道Thread stop 已被弃用 并且有充分的理由 它通常不安全 但这并不意味着它是never安全 据我所知 在我想要使用它的上下文中它是安全的 而且 据我所知 我别无选择 上下文是一个两人策略游戏的第三方插件 以国际象棋为例 第三方
  • SQLite 64位整数在jooq中被识别为int

    我有一个与 jOOQ 一起使用的 SQLite 数据库 当我使用 jOOQ 的代码生成工具时 它会按预期构建所有表和记录类 然而 所有的 SQLiteINTEGER列变成java lang Integer生成的代码中的字段 问题是 SQLi
  • oracle.jdbc.driver.OracleDriver ClassNotFoundException

    这是我收到错误的代码 我的classes12 jar已作为外部 jar 导入 import java io IOException import java io PrintWriter import java sql Connection
  • 如何将 .txt 文件的最后 5 行读入 java

    我有一个包含多个条目的文本文件 例如 hello there my name is JoeBloggs 我如何按降序阅读最后五个条目 即来自 JoeBloggs 那里 我目前有代码只能读取最后一行 public class TestLast
  • 使用mapstruct映射不同类型列表的元素

    我们正在映射一个对象 该对象具有一个对象列表 这些对象都实现了父接口 但可能具有不同的实现 但当我们映射列表时 似乎只有来自 ParentClass 的值被映射 而不是来自子类的值 但直接映射子进程就可以了 public class Par
  • jsch - 发送特殊键(CTRL-C、CTRL-D 等)

    我需要向远程终端发送特殊密钥 如何使用 JSCH 做到这一点 Thanks Walter 尝试发送两个字节 0x03 0x04 Check ASCII 表 http www bbdsoft com ascii html了解更多
  • 如何管理一个 JInternalFrame 调用另一个 JInternalFrame?

    我有一个带有此代码的 JDesktopPane public class Menu extends JFrame implements ActionListener Creates new form Portada public stati
  • 我的代码线程不安全吗?

    我编写了代码来理解 CyclicBarrier 我的应用程序模拟选举 每轮选出得票少的候选人 该候选人从竞争中淘汰以获得胜利 source class ElectoralCommission public volatile boolean
  • 如何在 VSCode 中热重载 Tomcat 服务器

    我正在从 Eclipse IDE VSCode 分别用于编码 Java servlet 和 HTML CSS JS 网页 迁移到仅使用 Visual Studio Code 因为它的轻量级 我为 VSCode 安装了几个 Java 扩展 R
  • 如何为用户的活动设置计时器?

    如果用户在 5 小时内停止工作 我需要执行特定的方法 假设用户已登录 但他在 5 小时内没有向数据库的特定表添加任何记录 任何时候用户将记录添加到指定的表中 该特定用户的计时器都应该重置 否则它将继续运行 如果达到 5 小时 应用程序应显示
  • 带有客户端认证连接的 HTTP 客户端的 SOAP 请求超时异常

    我正在尝试点击具有客户端认证的网址并生成密钥 keytool genkey alias server keyalg RSA keystore example jks validity 10950 和密钥存储 keytool import t
  • 每次修改代码时都必须 mvn clean install

    我不是来自 Java 世界 但我必须为我的一个项目深入研究它 我不明白为什么每次修改或更新代码时 都必须 mvn clean install 来调试代码的最新版本 你知道为什么吗 尝试按Ctrl Shift F9 热插拔 有时会有所帮助
  • 仅当用户开始输入时清除 JavaFX TextField 中的提示文本

    默认行为是当字段获得焦点时 字段中的提示文本将被删除 那是标记在场上的时候 是否可以配置文本字段 以便仅在用户开始输入时删除提示文本 否则 我需要在每个文本字段旁边 上方添加一个标签 以描述其中的值 我知道它有点旧 但我自己也需要它 这仍然

随机推荐

  • 【基于Proteus 8 Professional和Keil uVision5简单共阴极数码管点亮】

    1 前面的一些Keil uVision5环境搭建具体的操作我已经省略 可以参照我前面写的博客 2 Main c代码 include stm32f10x h uint16 t table 0x3f 0x06 0x5b 0x4f 0x66 0x
  • 模拟电路设计(13)--- 振荡器电路原理简介

    概述 所谓振荡器电路就是一种在没有外界输入信号的情况下能自行产生周期性交变信号输出的电子电路 可以作为信号源 定时源 能量变换电路 频谱变换电路等等 普遍应用于通信电子系统 振荡器的种类很多 按原理分 反馈振荡器和负阻振荡器 按输出频率分
  • JavaBean转有序的Json字符串

    前言 随着国密算法普及 接口json加签传输对字段顺序有要求 处理代码 public static void main String args throws IllegalAccessException User user new User
  • chatgpt配合xmind制作思维导图

    原理 xmind支持将markdown文件转化成思维导图的形式 提示词 我将提供以下文章 请帮我使用Xmind工具创建一个 的思维导图 其中包含多个主题和子主题 以及叶子节点 请你提供一些Markdown格式的文本 以便与Xmind兼容 在
  • Oracle监控的关键指标(一)

    先收集一些Oracle的关键指标 最近有空的话再考虑将一些比较有代表性的监控点进行指标化 指标化的数据在通过python脚本对进行性能上监控 最终部署在目前维护的oracle数据库上 0 找使用CPU多的用户session select a
  • WSL安装教程

    wsl安装教程 引言 前期准备工作 安装wsl 第一步 第二步 检测系统版本 第三步 确定虚拟机特性 第四步 下载Linux内核的更新包 第五步 设置WSL 2作为默认版本 第六步 选择Linux发行版本并设置Linux账号 小TIPS 引
  • CocoaPods导入第三方库,提示找不到头文件的解决方法

    最近一直在了解MVVM架构模式 也知道了ReactiveCocoa框架对MVVM实现的便利与优雅 但是CocoaPods导入ReactiveCocoa框架后 却出现一个问题 就是引入头文件的时候说找不到头文件 如下图 解决方法如下 1 找到
  • Fragment详解

    Fragment有自己的生命周期 Fragment依赖于Activity Fragment通过getActivity 可以获取所在的Activity Activity通过FragmentManager的findFragmentById 或f
  • QT5.15以及QT VS TOOL安装教程

    QT5 15以及QT VS TOOL安装教程 1 QT5 15下载安装教程 点击这个链接 https download qt io 在official release online installers目录下选择exe文件下载windows
  • vue重新进页面重新加载mounted或者created中的内容

    vue的项目中 如果再次进入当前页面需要重新加载mounted方法可以使用 activated 这个方法内就可以执行需要进入页面重新加载的方法来替代mounted或者created方法 这样就可以满足不重新加载页面就可以直接将方法重新执行一
  • 打印机错误0x00000bc4的解决办法

    共享打印机在使用过程中难免会出现一些问题 比如连接共享打印机错误 提示代码0x00000bc4 这该如何解决 共享打印机出现问题是件非常麻烦的事 下面就来看看小编整理的解决办法吧 Win11连接共享打印机错误0x00000bc4解决方法 1
  • RabbitMQ:work结构

    gt 只需要在消费者端 添加Qos能力以及更改为手动ack即可让消费者 根据自己的能力去消费指定的消息 而不是默认情况下由RabbitMQ平均分配了 生产者不变 正常发布消息到默认的exchange gt 消费者指定Qoa和手动ack 生产
  • 2023Web前端面试题及答案(一)

    答案仅供参考 每人的理解不一样 文章目录 1 简单说一说事件流原理 事件流 1 事件流是指页面 接收事件的顺序 2 假设页面中的元素都具备相同的事件 并且这些个元素之间是相互嵌套的 关系 3 那么在触发一个元素的事件时候 会触发其他的元素
  • 华为od机考真题-HJ105-记负均正II(较难)

    非负数缓存 data lst 负数个数 count 0 while 1 try data int input if data gt 0 data lst append
  • 卷积核大小不一样的卷积

    这种不是33而是51的 参考这个https blog csdn net qq 37541097 article details 102926037 也就是说把中间写成 3 5 就可以了
  • Open3D:Win10 + VS2017配置Open3D(C++、python)

    累了就要打游戏 2020 08 25 15 13 10 3350 收藏 25 分类专栏 Open3D 文章标签 点云 Open3D C 版权 Open3D 专栏收录该内容 5 篇文章1 订阅 订阅专栏 20200825 今天七夕 呱呱呱 O
  • 苹果开发者账号申请教程

    只有苹果开发者账号才能上架App Store 苹果开发者需要年费 是苹果公司收的 公司 政府和企业账号申请比较复杂 如果不想麻烦 或没有visa银行卡 可以联系他们技术代申请 如果只是安装ios应用到自己手机测试 现在只需要注册一个普通的苹
  • CSDN自带编辑器语法

    这里写自定义目录标题 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题 有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你的列表 创建一个表格 设定内容居中 居左 居右 Sma
  • FlatBuffers使用简介

    tools flatbuffers opensource 概述 Google在今年6月份发布了跨平台序列化工具FlatBuffers 提供了C Java Go C 接口支持 这是一个注重性能和资源使用的序列化类库 相较于Protocol B
  • POI高级使用法则

    各位兄台 想必经过昨日好梦 早已精神饱满 请允许小编接听上回 讲解POI进阶功法 昨日奇闻 POI搞定电子表格 我们经过昨日的学习 懂得了POI基本的读写操作 今日让我们进一步看一下POI的高级使用方法 壹 我们知道对于Excel是含有03