首页 > 其他分享 >POI解析dos

POI解析dos

时间:2024-10-25 11:13:02浏览次数:1  
标签:wb Excel SXSSFWorkbook 内存 POI dos 解析 数据

POI解析Excel

先来大致看一下传统poi技术的版本以及优缺点对比吧!

首先我们知道POI中我们最熟悉的莫过于WorkBook这样一个接口,我们的POI版本也在更新的同时对这个几口的实现类做了更新:

  • HSSFWorkbook :

这个实现类是我们早期使用最多的对象,它可以操作Excel2003以前(包含2003)的所有Excel版本。在2003以前Excel的版本后缀还是.xls

  • XSSFWorkbook :

这个实现类现在在很多公司都可以发现还在使用,它是操作的Excel2003--Excel2007之间的版本,Excel的扩展名是.xlsx

  • SXSSFWorkbook :

这个实现类是POI3.8之后的版本才有的,它可以操作Excel2007以后的所有版本Excel,扩展名是.xlsx

HSSFWorkbook

它是POI版本中最常用的方式,不过:

  • 它的缺点是 最多只能导出 65535行,也就是导出的数据函数超过这个数据就会报错;
  • 它的优点是 不会报内存溢出。(因为数据量还不到7w所以内存一般都够用,首先你得明确知道这种方式是将数据先读取到内存中,然后再操作)

XSSFWorkbook

  • 优点:这种形式的出现是为了突破HSSFWorkbook的65535行局限,是为了针对Excel2007版本的1048576行,16384列,最多可以导出104w条数据;
  • 缺点:伴随的问题来了,虽然导出数据行数增加了好多倍,但是随之而来的内存溢出问题也成了噩梦。因为你所创建的book,Sheet,row,cell等在写入到Excel之前,都是存放在内存中的(这还没有算Excel的一些样式格式等等),可想而知,内存不溢出就有点不科学了!!!

SXSSFWorkbook

从POI 3.8版本开始,提供了一种基于XSSF的低内存占用的SXSSF方式:

优点:

  • 这种方式不会一般不会出现内存溢出(它使用了硬盘来换取内存空间,
  • 也就是当内存中数据达到一定程度这些数据会被持久化到硬盘中存储起来,而内存中存的都是最新的数据),
  • 并且支持大型Excel文件的创建(存储百万条数据绰绰有余)。

缺点:

  • 既然一部分数据持久化到了硬盘中,且不能被查看和访问那么就会导致,
  • 在同一时间点我们只能访问一定数量的数据,也就是内存中存储的数据;
  • sheet.clone()方法将不再支持,还是因为持久化的原因;
  • 不再支持对公式的求值,还是因为持久化的原因,在硬盘中的数据没法读取到内存中进行计算;
  • 在使用模板方式下载数据的时候,不能改动表头,还是因为持久化的问题,写到了硬盘里就不能改变了;

 

总结:使用XSSFWorkbook 如果没有单独限制大小是很容易受到dos攻击的,使用SXSSFWorkbook不合理也存在dos的风险

 

SXSSFWorkbook DOS场景描述

使用poi、poi-ooxml第三方开源组件来处理excel文件,实现工作表数量、数据行、数据列等数据读取、写入等操作。提供了HSSF、XSSF以及SXSSF三种方式,使用XSSFWorkbook、SXSSFWorkbook对象进行文件解析处理时:

当调用wb.createSheet()实现新建sheet页签时会创建poi-sxssf-sheet.xml临时文件;

调用wb.write(out)向本地磁盘写excel文件时会创建poi-sxssf-template.xlsx临时文件,在该方法仅会删除临时poi-sxssf-template.xlsx文件;

若未调用wb.dispose()方法,过程中产生的临时xml文件未自动清理,高频率请求可导致磁盘Dos攻击; 

SXSSFWorkbook wb = new SXSSFWorkbook(100);
Sheet sh = wb.createSheet();
....
// 从临时文件写入Excel 文件
FileOutputStream out = new FileOutputStream("d:\\sxssf.xlsx");
wb.write(out);
out.close();   
wb.close();    //关闭Stream closedexcle文档执行操作、更新或读取
//从磁盘删除临时xml文件
wb.dispose();

 

标签:wb,Excel,SXSSFWorkbook,内存,POI,dos,解析,数据
From: https://www.cnblogs.com/snad/p/18293399

相关文章

  • 电商 API 接口:提升用户体验的关键路径深度解析
    一、快速响应与高效性能低延迟响应:电商平台的用户期望快速获取商品信息、订单状态等数据。通过优化API接口的响应时间,确保用户在发起请求后能够迅速得到结果。例如,当用户在搜索商品时,API接口应在几百毫秒内返回搜索结果,避免用户长时间等待而失去耐心。采用缓存技术可以显......
  • HCI_LE_Read_Advertising_Channel_Tx_Power(0x0007)命令全面解析
    目录一、命令概述二、命令格式2.1.HCI_LE_Read_Advertising_Channel_Tx_Power命令一般格式2.2.示例格式2.2.1.命令示例2.2.2.响应示例 三、返回参数说明3.1.状态码(Status)3.2.传输功率等级(Advertising_Channel_Tx_Power_Level)四、命令执行流程4.1.命令准备......
  • 【源码】Sharding-JDBC源码分析之Sql解析的原理
     Sharding-JDBC系列1、Sharding-JDBC分库分表的基本使用2、Sharding-JDBC分库分表之SpringBoot分片策略3、Sharding-JDBC分库分表之SpringBoot主从配置4、SpringBoot集成Sharding-JDBC-5.3.0分库分表5、SpringBoot集成Sharding-JDBC-5.3.0实现按月动态建表分表6、【源码......
  • 《深度学习》YOLO系列v2 网路构架解析
    目录一、YOLO系列v21、YOLOv1与v2对比2、BatchNorm批次归一化3、YOLOv2更大的分辨率4、YOLOv2网络结构1)YOLOv2网络结构2)传统的卷积神经网络系统3)YOLOv2结构局限性5、YOLOv2聚类提取先验框1)k-means聚类2)YOLOv2聚类流程3)YOLOv2聚类框个数由来6、YOLOv2An......
  • Lab2 中间代码生成,在Cminusf 解析器基础上,完成从语法树向中间代码的自动化翻译过程。
    本次实验需要同学们在Lab1实现的Cminusf解析器基础上,完成从语法树向中间代码的自动化翻译过程。contactmehelp-assignment实验要求¶根据 Lab1的要求,学生有两个远程仓库:upstream:课程发布实验代码的公开仓库origin:学生fork得到的私有仓库两个仓库各有3条分支(红......
  • RSA算法详解及相关数学原理解析
    RSA算法详解及相关数学原理解析前言‍为了记录自己学习密码学的过程,也是为了便于个人应付相关课程的考核,故写此博客。本博客总结了怎么用C++手搓一个RSA算法,以及补补欠缺的一些数学知识和可能欠缺的一些其他算法的实现。参考了其他人的相关博客,用便于我自己理解的话和方式和......
  • 文字识别接口应用场景解析-身份证识别、发票识别API、车牌识别
    在快节奏的工作与生活环境中,如何提高企业工作效率、提升用户体验成为了人们追求的共同目标。针对市场发展需求,一种将任意场景图片中的文字转换为可编辑文本的文字识别技术出现在大众视野。翔云人工智能开放平台通过不断的技术创新,基于深度学习算法与自主ocr核心技术,提供了......
  • 战略解码全过程解析
    战略解码是指将企业的战略目标转化为具体的行动方案的过程。这一过程确保了组织中的每一个层级都能明确理解战略意图,并将其转化为可操作的任务,以实现组织的战略目标。以下是战略解码的一般步骤:1.明确战略目标高层管理团队需要清晰定义公司的长期愿景、使命和战略目标。目......
  • 【人工智能】解锁Transformer的秘密:输入与输出的高效实现与深度解析
    Transformer架构自2017年提出以来,迅速成为自然语言处理和其他领域的核心模型。它通过自注意力机制和并行化处理取代了传统的递归神经网络(RNN),为大型数据处理任务提供了更好的性能和效率。本文将深入解析Transformer架构中的输入与输出部分,详细讲解如何将序列数据处理为适合......
  • 绞杀者模式:逐步迁移与替代遗留系统的策略解析
    如果你觉得这篇文章对你有帮助,请不要吝惜你的“关注”、“点赞”、“评价”、“收藏”,你的支持永远是我前进的动力~~~  个人收藏的技术大会分享PDF文档,欢迎点击下载查看!!!在软件工程领域,遗留系统的现代化改造一直是企业面临的挑战之一。本文将介绍一种渐进式的系统迁移策略......