java POI解析Excel大文件,获取表头

目录

  • 前言
  • 依赖
  • 代码
  • StreamingReader的open
  • WorkbookFactory的create
  • CSV解析首行

前言

poi解析大文件可能出现oom,通样大小文件,xlsx会oom,xls不会,所以使用流式的方式改造解析xlsx文件的代码。
我的需求是提取每一页的表头,所以值提取第一行,如果需要全部内容,把行数循环地方的if改成while就行。
产生Workbook给的入参都是给的File,没用Inputstream,原因见后两章

依赖

可能不全,按需引入更多poi相关依赖

		<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency><dependency><groupId>com.monitorjbl</groupId><artifactId>xlsx-streamer</artifactId><version>2.2.0</version></dependency>

代码

//newExcel true表示xlsx,false表示xls
private static String excel(File file, boolean newExcel) throws Exception {StringBuilder sb = new StringBuilder();Workbook workbook = null;try {if (newExcel) {//我只取第一行,你们按需调大workbook = StreamingReader.builder().rowCacheSize(1).bufferSize(10240).open(file);} else {//xls的还是普通方式workbook = WorkbookFactory.create(file);}getSheet(sb, workbook);} finally {if (workbook != null) {workbook.close();}}return sb.toString();}private static void getSheet(StringBuilder sb, Workbook workbook) throws IOException {try {sb.append(LEFT_MIDDLE_BRACKET);Iterator<Sheet> sheetIterator = workbook.iterator();while (sheetIterator.hasNext()) {Sheet sheet = sheetIterator.next();String sheetName = sheet.getSheetName();if (sheetName.startsWith(BTXA_MASK)) {continue;}sb.append(sheetName).append(C_COLON);Iterator<Row> rowIterator = sheet.iterator();//想取所有行的人把if改成whileif (rowIterator.hasNext()) {Row row = rowIterator.next();firstLine(sb, row);if (sheetIterator.hasNext()) {sb.append(C_SEMICOLON);}}}sb.append(RIGHT_MIDDLE_BRACKET);} finally {workbook.close();}}private static void firstLine(StringBuilder sb, Row row) {try {int numOfColumns = row.getLastCellNum();for (int j = 0; j < numOfColumns; j++) {Cell cell = row.getCell(j, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);sb.append(getCell(cell));if (j != numOfColumns - 1) {sb.append(C_COMMA);}}} catch (Exception e) {log.error("异常列", e);sb.append("异常列");}}private static String getCell(Cell cell) {// 获取单元格类型CellType cellType = cell.getCellType();// 根据单元格类型处理值String cellValue;switch (cellType) {case STRING:cellValue = cell.getStringCellValue();break;case NUMERIC:cellValue = String.valueOf(cell.getNumericCellValue());break;case BOOLEAN:cellValue = String.valueOf(cell.getBooleanCellValue());break;case FORMULA:try {DataFormatter formatter = new DataFormatter();cellValue = formatter.formatCellValue(cell);} catch (IllegalStateException | NumberFormatException e) {cellValue = cell.getCellFormula();}break;case BLANK:// 空单元格cellValue = "";break;case ERROR:// 错误值cellValue = "ERROR (" + ErrorEval.getText(cell.getErrorCellValue()) + ")";break;default:cellValue = "特殊类型";}return cellValue;}

StreamingReader的open

open方法使用InputStream还需要创建临时文件,如果有本地文件,直接给file

    /*** Reads a given {@code InputStream} and returns a new* instance of {@code Workbook}. Due to Apache POI* limitations, a temporary file must be written in order* to create a streaming iterator. This process will use* the same buffer size as specified in {@link #bufferSize(int)}.** @param is input stream to read in* @return A {@link Workbook} that can be read from* @throws com.monitorjbl.xlsx.exceptions.ReadException if there is an issue reading the stream*/public Workbook open(InputStream is) {StreamingWorkbookReader workbook = new StreamingWorkbookReader(this);workbook.init(is);return new StreamingWorkbook(workbook);}/*** Reads a given {@code File} and returns a new instance* of {@code Workbook}.** @param file file to read in* @return built streaming reader instance* @throws com.monitorjbl.xlsx.exceptions.OpenException if there is an issue opening the file* @throws com.monitorjbl.xlsx.exceptions.ReadException if there is an issue reading the file*/public Workbook open(File file) {StreamingWorkbookReader workbook = new StreamingWorkbookReader(this);workbook.init(file);return new StreamingWorkbook(workbook);}

WorkbookFactory的create

create方法说明InputStream比file更占内存

    /*** Creates the appropriate HSSFWorkbook / XSSFWorkbook from*  the given InputStream.** <p>Your input stream MUST either support mark/reset, or*  be wrapped as a {@link BufferedInputStream}!*  Note that using an {@link InputStream} has a higher memory footprint*  than using a {@link File}.</p>** <p>Note that in order to properly release resources the*  Workbook should be closed after use. Note also that loading*  from an InputStream requires more memory than loading*  from a File, so prefer {@link #create(File)} where possible.**  @param inp The {@link InputStream} to read data from.**  @return The created Workbook**  @throws IOException if an error occurs while reading the data*  @throws EncryptedDocumentException If the Workbook given is password protected*/public static Workbook create(InputStream inp) throws IOException, EncryptedDocumentException {return create(inp, null);}/*** Creates the appropriate HSSFWorkbook / XSSFWorkbook from*  the given File, which must exist and be readable.* <p>Note that in order to properly release resources the*  Workbook should be closed after use.**  @param file The file to read data from.**  @return The created Workbook**  @throws IOException if an error occurs while reading the data*  @throws EncryptedDocumentException If the Workbook given is password protected*/public static Workbook create(File file) throws IOException, EncryptedDocumentException {return create(file, null);}

CSV解析首行

赠送一个csv方法

    private static String csv(File file) throws Exception {String encode = KkFileUtils.getFileEncode(file);log.info("编码检测:{}", encode);if ("Big5".equalsIgnoreCase(encode)) {encode = "GB2312";}String res = "";try (FileInputStream fo = new FileInputStream(file);InputStreamReader isr = new InputStreamReader(fo, encode);BufferedReader br = new BufferedReader(isr)) {String line = br.readLine();if (StringUtils.isNotBlank(line)) {res = line;}}return res;}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

创建Maven项目的时候让选择maven模板

创建Maven项目的时候让选择maven模板 心得 工欲利其事 必先利其器。如果你想要干成一件事 那么必须先要精通对应的工具使用。之前我不太注重工具 我觉得只要代码写的好就可以了 但是当我们了解了产品经理的一些思想之后&#xff0c;我才明白一个好的产品是可以给用户提供多大…

wasm 系列之 WebAssembly 和 emscripten 暴力上手

wasm 是什么&#xff1f; wasm 是 WebAssembly 的缩写。wasm 不是传统意义上的汇编语言&#xff0c;而是一种编译的中间字节码&#xff0c;可以在浏览器和其他 wasm runtime 上运行非 JavaScript 类型的语言&#xff0c;只要能被编译成 wasm&#xff0c;譬如 kotlin/wasm、Rus…

IOS恢复

1、实验目的 通过本实验可以掌握&#xff1a; copy方式恢复IOS的步骤。TFTPDNLD方式恢复IOS的步骤。Xmodem方式恢复IOS的步骤。 2、实验拓扑 路由器IOS恢复的实验拓扑如下图所示。 3、实验步骤 如果工作中不慎误删除路由器IOS&#xff0c;或者升级了错误版本的IOS&#xff…

Https协议原理剖析【计算机网络】【三种加密方法 | CA证书 】

目录 一&#xff0c;fidler工具 前提知识 二&#xff0c;Https原理解析 1. 中间人攻击 2. 常见的加密方式 1&#xff09;. 对称加密 2&#xff09;. 非对称加密 对称加密 4&#xff09;. CA证书 1. 数据摘要 3. 数字签名 CA证书 理解数据签名 存在的安全疑问&am…

js基础知识(2)

一、事件的含义 JavaScript事件是指在文档或者浏览器中发生的一些特定交互瞬间&#xff0c;比如打开某一个网页&#xff0c;浏览器加载完成后会触发load事件&#xff0c;当鼠标悬浮于某一个元素上时会触发hover事件&#xff0c;当鼠标点击某一个元素时会触发click事件等等。 三…

力扣练习4.25

92. 反转链表 II 要求在指定的区间内反转。 解题思路&#xff1a; 将整个链表拆成三部分&#xff0c;第一部分是头节点到left的前一个节点&#xff0c;第二部分是left到right的待反转区间&#xff0c;第三部分是right的下一个节点为头结点到尾部。 首先根据反转链表的方法遍历…

在PostgreSQL中如何处理跨表的级联删除和更新?

文章目录 解决方案1. 使用外键约束和级联操作创建外键约束并指定级联删除创建外键约束并指定级联更新 2. 使用触发器&#xff08;Triggers&#xff09;创建触发器实现级联删除 示例代码示例1&#xff1a;使用外键约束和级联删除示例2&#xff1a;使用触发器实现级联删除 在Post…

Golang | Leetcode Golang题解之第44题通配符匹配

题目&#xff1a; 题解&#xff1a; func isMatch(s string, p string) bool {for len(s) > 0 && len(p) > 0 && p[len(p)-1] ! * {if charMatch(s[len(s)-1], p[len(p)-1]) {s s[:len(s)-1]p p[:len(p)-1]} else {return false}}if len(p) 0 {retur…

Python基础:【习题系列】面向对象

在Python中,用于定义类的关键字是什么?( B ) A.classs B.class C.Class D.type 答案:B 难易程度:易 答案解析:在Python中,定义类需要使用关键字class。 知识点:类定义;Python关键字 在Python中,以下哪个关键字用于在类中引用同一类的其他方法或属性?( C ) A.…

C#使用ftp进行文件上传和下载功能(二)

上一篇主要讲解FTP服务器的搭建&#xff0c;本节话不多说直接撸码&#xff1a; 1.首先ftp需要有ip和port&#xff0c;以及登录用户等信息&#xff0c;因此创建三个属性&#xff1b; /// <summary> /// FTP的服务器地址&#xff0c;格式为ftp://192.168.1.234:80…

输入influx但是无法进入influxdb

问题描述&#xff1a; 博主想通过DockerJmeterInfluxDBGrafana搭建性能测试可视化平台&#xff0c;但是按照别的教程输入influx却无法进入inluxdb&#xff0c;输入输出如下&#xff1a; NAME:influx - Influx ClientUSAGE:influx [command]HINT: If you are looking for the I…

Linux下的进程管理:创建、终止、切换与等待

文章目录 一、引言二、进程创建1、进程创建的概念与场景2、进程创建的方式a、fork() 系统调用b、fork() 后的执行流程 3、进程创建的过程a、进程创建过程b、子进程创建过程 4、父子进程关系与属性继承 三、进程终止1、进程终止的原因2、进程的错误码和退出码a、错误码b、退出码…

LeetCode:51. N 皇后

leetCode51.N皇后 题解分析 代码 class Solution { public:int n;vector<vector<string>> ans;vector<string> path;vector<bool> col, dg,udg;vector<vector<string>> solveNQueens(int _n) {n _n;col vector<bool> (n);dg …

《QT实用小工具·四十二》圆形发光图像

1、概述 源码放在文章末尾 该项目实现了图像的发光效果&#xff0c;特别适合做头像&#xff0c;项目demo演示如下所示&#xff1a; 项目部分代码如下所示&#xff1a; import QtQuick 2.7 import QtGraphicalEffects 1.12Item {id: rootwidth: 80height: 80property int ra…

浓眉大眼的Apple开源OpenELM模型;IDM-VTON试衣抱抱脸免费使用;先进的语音技术,能够轻松克隆任何人的声音

✨ 1: openelm OpenELM是苹果机器学习研究团队发布的高效开源语言模型家族 OpenELM是苹果机器学习研究团队开发的一种高效的语言模型&#xff0c;旨在推动开放研究、确保结果的可信赖性、允许对数据和模型偏见以及潜在风险进行调查。其特色在于采用了一种分层缩放策略&#x…

spring基本使用

文章目录 1. ioc(Inversion of Control) | DI(Dependency Injection)(1) maven坐标导包(2) 编写配置文件bean.xml(3) 配置bean(4) 配置文件注入属性 2. DI(dependency injection) 依赖注入(setter)其他属性(1) 对象属性注入(2) 数组属性输入(3) 集合属性注入(4) map集合注入(5)…

python将灰度图像转换为RGB图像

将灰度图像转换为RGB图像意味着你需要为每个像素创建三个颜色通道&#xff08;红、绿、蓝&#xff09;&#xff0c;通常是以某种方式复制或扩展灰度值到这三个通道。在深度学习中&#xff0c;这种转换并不常见&#xff0c;因为这样做不会引入任何新的信息到模型中。但是&#x…

如何提交已暂存的更改到本地仓库?

文章目录 如何提交已暂存的更改到本地Git仓库&#xff1f;步骤1&#xff1a;确认并暂存更改步骤2&#xff1a;提交暂存的更改到本地仓库 如何提交已暂存的更改到本地Git仓库&#xff1f; 在Git版本控制系统中&#xff0c;当你对项目文件进行修改后&#xff0c;首先需要将这些更…

使用项目管理软件有效控制项目质量

项目管理中的质量控制&#xff0c;是指团队实施策略以确保可交付成果或产品满足最终用户要求。质量控制是项目管理计划的一个要素&#xff0c;这是一个迭代过程&#xff0c;可以节省时间和资源&#xff0c;同时产生高质量的产品和服务。 质量控制的四种类型 这四种类型的质量…

TCP协议数据传输过程及报文分析

目录 TCP数据的传输过程 建立连接&#xff08;三次握手&#xff09; 第一次握手 第二次握手 第三次握手 总结 数据传输 断开连接&#xff08;四次挥手&#xff09; 第一次挥手 第二次挥手 第三次挥手 第四次挥手 总结 最后 TCP数据的传输过程 TCP&#xff08;Tra…