【Apache POI】Java解析Excel文件并处理合并单元格-粘贴即用

同为牛马,点个赞吧!

一、Excel文件样例

image-20240716153916656

二、工具类源码

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFWorkbookFactory;
import org.springframework.web.multipart.MultipartFile;import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** 读取Excel并解析合并单元格,将结果转为Map集合*/
public class ReadMergeCellExcelUtil {/*** 读取Excel数据** @param file 上传的Excel文件* @return 解析后的数据列表*/public static List<Map<String, String>> readExcelToObj(MultipartFile file) {List<Map<String, String>> result = new ArrayList<>();try (InputStream inputStream = file.getInputStream()) {Workbook workbook = XSSFWorkbookFactory.create(inputStream);result = readExcel(workbook, 0, 0, 0);} catch (IOException e) {e.printStackTrace();}return result;}/*** 读取Excel文件** @param workbook      工作簿* @param sheetIndex    sheet页下标:从0开始* @param startReadLine 开始读取的行:从0开始* @param tailLine      去除最后读取的行* @return 解析后的数据列表*/private static List<Map<String, String>> readExcel(Workbook workbook, int sheetIndex, int startReadLine, int tailLine) {Sheet sheet = workbook.getSheetAt(sheetIndex);FormulaEvaluator formulaEvaluator = workbook.getCreationHelper().createFormulaEvaluator();List<Map<String, String>> result = new ArrayList<>();for (int i = startReadLine; i <= sheet.getLastRowNum() - tailLine; i++) {Row row = sheet.getRow(i);Map<String, String> rowData = parseRow(sheet, row, formulaEvaluator);result.add(rowData);}return result;}/*** 解析一行数据** @param sheet           工作表* @param row             行对象* @param formulaEvaluator 公式评估器* @return 解析后的行数据*/private static Map<String, String> parseRow(Sheet sheet, Row row, FormulaEvaluator formulaEvaluator) {Map<String, String> rowData = new HashMap<>();if (row != null) {int cellIndex = 0;for (Cell cell : row) {String cellValue = getCellValue(sheet, cell, formulaEvaluator);rowData.put("field" + cellIndex, cellValue);cellIndex++;}}return rowData;}/*** 获取单元格的值** @param sheet           工作表* @param cell            单元格* @param formulaEvaluator 公式评估器* @return 单元格值*/private static String getCellValue(Sheet sheet, Cell cell, FormulaEvaluator formulaEvaluator) {if (cell == null) return "";return isMergedRegion(sheet, cell.getRowIndex(), cell.getColumnIndex())? getMergedRegionValue(sheet, cell.getRowIndex(), cell.getColumnIndex(), formulaEvaluator): getCellStringValue(cell, formulaEvaluator);}/*** 获取合并单元格的值** @param sheet           工作表* @param row             行号* @param column          列号* @param formulaEvaluator 公式评估器* @return 合并单元格值*/private static String getMergedRegionValue(Sheet sheet, int row, int column, FormulaEvaluator formulaEvaluator) {for (CellRangeAddress range : sheet.getMergedRegions()) {if (range.isInRange(row, column)) {Row firstRow = sheet.getRow(range.getFirstRow());Cell firstCell = firstRow.getCell(range.getFirstColumn());return getCellStringValue(firstCell, formulaEvaluator);}}return "";}/*** 判断单元格是否是合并单元格** @param sheet  工作表* @param row    行下标* @param column 列下标* @return 是否是合并单元格*/private static boolean isMergedRegion(Sheet sheet, int row, int column) {for (CellRangeAddress range : sheet.getMergedRegions()) {if (range.isInRange(row, column)) {return true;}}return false;}/*** 获取单元格的字符串值** @param cell            单元格* @param formulaEvaluator 公式评估器* @return 单元格字符串值*/private static String getCellStringValue(Cell cell, FormulaEvaluator formulaEvaluator) {switch (cell.getCellType()) {case STRING:return cell.getStringCellValue();case BOOLEAN:return String.valueOf(cell.getBooleanCellValue());case FORMULA:return formulaEvaluator.evaluate(cell).formatAsString();case NUMERIC:return String.valueOf(cell.getNumericCellValue());default:return "";}}}

三、解析结果

image-20240716154343627

以下内容基本为废话,大可直接忽略!

四、工具类详解及使用方法

在日常牛马中,处理Excel文件是一项常见且重要的任务。Excel文件通常包含丰富的结构化数据,其中合并单元格的处理尤为复杂。本文将介绍一个名为ReadMergeCellExcelUtil的Java工具,帮助您轻松读取并解析Excel文件,处理合并单元格,并将结果转化为易于操作的Map集合。通过本文,您将学会如何使用该工具,以及理解其背后的实现原理。


准备工作

在开始之前,我们需要确保项目中添加了必要的依赖。这里我们主要使用Apache POI库来处理Excel文件。

Maven依赖:

<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.0.0</version>
</dependency>

工具功能概述

ReadMergeCellExcelUtil工具的核心功能是解析Excel文件并处理合并单元格。它可以读取Excel文件,将每个单元格的内容存储到Map集合中,并正确处理合并单元格的值。典型的应用场景包括从Excel中读取配置数据、解析报表数据等。


代码详细解读
1. 读取Excel数据

方法:readExcelToObj

该方法用于读取上传的Excel文件,并将其内容解析为一个包含多个Map的列表。每个Map表示Excel文件中的一行数据。

public static List<Map<String, String>> readExcelToObj(MultipartFile file) {List<Map<String, String>> result = new ArrayList<>();try (InputStream inputStream = file.getInputStream()) {Workbook workbook = XSSFWorkbookFactory.create(inputStream);result = readExcel(workbook, 0, 0, 0);} catch (IOException e) {e.printStackTrace();}return result;
}

使用try-with-resources确保输入流在使用后正确关闭。

2. 解析Excel文件

方法:readExcel

该方法从工作簿中获取特定工作表,初始化公式评估器,并循环遍历行以解析每一行的数据。

private static List<Map<String, String>> readExcel(Workbook workbook, int sheetIndex, int startReadLine, int tailLine) {Sheet sheet = workbook.getSheetAt(sheetIndex);FormulaEvaluator formulaEvaluator = workbook.getCreationHelper().createFormulaEvaluator();List<Map<String, String>> result = new ArrayList<>();for (int i = startReadLine; i <= sheet.getLastRowNum() - tailLine; i++) {Row row = sheet.getRow(i);Map<String, String> rowData = parseRow(sheet, row, formulaEvaluator);result.add(rowData);}return result;
}
3. 解析一行数据

方法:parseRow

该方法遍历行中的单元格,并将其值存储到Map中。

private static Map<String, String> parseRow(Sheet sheet, Row row, FormulaEvaluator formulaEvaluator) {Map<String, String> rowData = new HashMap<>();if (row != null) {int cellIndex = 0;for (Cell cell : row) {String cellValue = getCellValue(sheet, cell, formulaEvaluator);rowData.put("field" + cellIndex, cellValue);cellIndex++;}}return rowData;
}
4. 获取单元格值

方法:getCellValue

该方法根据单元格类型获取其值,并处理合并单元格。

private static String getCellValue(Sheet sheet, Cell cell, FormulaEvaluator formulaEvaluator) {if (cell == null) return "";return isMergedRegion(sheet, cell.getRowIndex(), cell.getColumnIndex())? getMergedRegionValue(sheet, cell.getRowIndex(), cell.getColumnIndex(), formulaEvaluator): getCellStringValue(cell, formulaEvaluator);
}
5. 获取合并单元格值

方法:getMergedRegionValue

该方法查找并获取合并单元格的值。

private static String getMergedRegionValue(Sheet sheet, int row, int column, FormulaEvaluator formulaEvaluator) {for (CellRangeAddress range : sheet.getMergedRegions()) {if (range.isInRange(row, column)) {Row firstRow = sheet.getRow(range.getFirstRow());Cell firstCell = firstRow.getCell(range.getFirstColumn());return getCellStringValue(firstCell, formulaEvaluator);}}return "";
}
6. 判断单元格是否是合并单元格

方法:isMergedRegion

该方法检查指定单元格是否属于合并区域。

private static boolean isMergedRegion(Sheet sheet, int row, int column) {for (CellRangeAddress range : sheet.getMergedRegions()) {if (range.isInRange(row, column)) {return true;}}return false;
}
7. 获取单元格的字符串值

方法:getCellStringValue

该方法根据单元格类型获取字符串值,并评估公式单元格。

private static String getCellStringValue(Cell cell, FormulaEvaluator formulaEvaluator) {switch (cell.getCellType()) {case STRING:return cell.getStringCellValue();case BOOLEAN:return String.valueOf(cell.getBooleanCellValue());case FORMULA:return formulaEvaluator.evaluate(cell).formatAsString();case NUMERIC:return String.valueOf(cell.getNumericCellValue());default:return "";}
}

示例代码

以下是一个完整的示例,展示如何使用ReadMergeCellExcelUtil工具读取并解析Excel文件:

import org.springframework.web.multipart.MultipartFile;
import java.util.List;
import java.util.Map;public class ExcelParserExample {public static void main(String[] args) {// 假设有一个MultipartFile类型的Excel文件对象fileMultipartFile file = ...;// 使用工具类解析Excel文件List<Map<String, String>> parsedData = ReadMergeCellExcelUtil.readExcelToObj(file);// 打印解析结果for (Map<String, String> rowData : parsedData) {System.out.println(rowData);}}
}

运行结果将是Excel文件的解析数据,每一行数据以Map的形式存储。


常见问题与解决方案
  1. 空单元格处理:确保在解析单元格时处理空单元格,避免空指针异常。
  2. 大型Excel文件处理:对于大型Excel文件,可以考虑使用流式读取方法,以减少内存消耗。

结论

ReadMergeCellExcelUtil工具提供了一种简单而有效的方式来解析Excel文件并处理合并单元格。通过使用Apache POI库,我们可以轻松处理各种复杂的Excel文件格式。未来,可以考虑进一步优化性能,并添加更多功能,如支持多种文件格式和自定义数据解析规则。

Over!

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

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

相关文章

mac M1 创建Mysql8.0容器

MySLQ8.0 拉取m1镜像 docker pull mysql:8.0创建挂载文件夹并且赋予权限 sudo chmod 777 /Users/zhao/software/dockerLocalData/mysql 创建容器并且挂载 docker run --name mysql_8 \-e MYSQL_ROOT_PASSWORDadmin \-v /Users/zhao/software/dockerLocalData/mysql/:/var/l…

利用patch-package补丁,解决H5预览PDF时电子签章不显示问题

利用patch-package补丁&#xff0c;解决H5预览PDF时电子签章不显示问题 一、问题描述 在生产环境中&#xff0c;遇到了一个紧急的技术问题&#xff1a;用户在移动端H5页面上查看电子票时&#xff0c;PDF文件预览功能正常&#xff0c;但其中的电子签章未能正常显示。这一问题直…

C++ AVL树

目录 ​编辑 0.前言 1.AVL树的概念 1.1 平衡因子 1.2 AVL树的性质 2.AVL树节点的定义 3.AVL树的插入 4.AVL树的旋转 4.1 左单旋&#xff08;LL旋转&#xff09; 4.2 右单旋&#xff08;RR旋转&#xff09; 4.3 右左旋&#xff08;RL旋转&#xff09; 4.4 左右旋&…

集群架构-web服务器(接入负载均衡+数据库+会话保持redis)--15454核心配置详解

紧接着前面的集群架构深化—中小型公司&#xff08;拓展到大型公司业务&#xff09;–下面图简单回顾一下之前做的及故障核心知识总结&#xff08;等后期完全整理后&#xff0c;上传资源希望能帮大家&#xff09; web集群架构-接入负载均衡部署web02服务器等 web集群-搭建web0…

介绍 Elasticsearch 中的 Learning to Tank - 学习排名

作者&#xff1a;来自 Elastic Aurlien Foucret 从 Elasticsearch 8.13 开始&#xff0c;我们提供了原生集成到 Elasticsearch 中的学习排名 (learning to rank - LTR) 实现。LTR 使用经过训练的机器学习 (ML) 模型为你的搜索引擎构建排名功能。通常&#xff0c;该模型用作第二…

postman接口测试实战篇

击杀小游戏接口测试 接口测试简单介绍击杀小游戏代码下载单接口测试(postman)接口关联并参数化接口测试简单介绍 首先思考两个问题:1.接口是什么?2.接口测试是什么? 1.我们总是把接口想的很复杂,其实呢,它就是一个有特定输入和输出参数的交互逻辑处理单元,它不需要知…

通过 EMR Serverless Spark 提交 PySpark 流任务

在大数据快速发展的时代&#xff0c;流式处理技术对于实时数据分析至关重要。EMR Serverless Spark提供了一个强大而可扩展的平台&#xff0c;它不仅简化了实时数据处理流程&#xff0c;还免去了服务器管理的烦恼&#xff0c;提升了效率。本文将指导您使用EMR Serverless Spark…

PostgreSQL使用(二)

说明&#xff1a;本文介绍PostgreSQL的DML语言&#xff1b; 插入数据 -- 1.全字段插入&#xff0c;字段名可以省略 insert into tb_student values (1, 张三, 1990-01-01, 88.88);-- 2.部分字段插入&#xff0c;字段名必须写全 insert into tb_student (id, name) values (2,…

[数据集][目标检测]导盲犬拐杖检测数据集VOC+YOLO格式4635张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;4635 标注数量(xml文件个数)&#xff1a;4635 标注数量(txt文件个数)&#xff1a;4635 标注…

graham 算法计算平面投影点集的凸包

文章目录 向量的内积&#xff08;点乘&#xff09;、外积&#xff08;叉乘&#xff09;确定旋转方向numpy 的 cross 和 outernp.inner 向量与矩阵计算示例np.outer 向量与矩阵计算示例 python 示例生成样例散点数据图显示按极角排序的结果根据排序点计算向量转向并连成凸包 基本…

Linux云计算 |【第一阶段】ENGINEER-DAY3

主要内容&#xff1a; LVM逻辑卷管理、VDO、RAID磁盘阵列、进程管理 一、新建逻辑卷 1、什么是逻辑卷 逻辑卷&#xff08;Logical Volume&#xff09;是逻辑卷管理&#xff08;Logical Volume Management&#xff0c;LVM&#xff09;系统中的一个概念。LVM是一种用于磁盘管理…

C++ :友元类

友元类的概念和使用 (1)将类A声明为B中的friend class后&#xff0c;则A中所有成员函数都成为类B的友元函数了 (2)代码实战&#xff1a;友元类的定义和使用友元类是单向的 (3)友元类是单向的&#xff0c;代码实战验证 互为友元类 (1)2个类可以互为友元类&#xff0c;代码实战…

Intel和AMD用户再等等!微软确认Win11 24H2年底前登陆

微软近日确认&#xff0c;Windows 11 24H2版本将于2024年底前正式登陆使用英特尔和AMD处理器的PC。 根据微软介绍&#xff0c;Windows 11 24H2将作为传统功能更新&#xff0c;将在今年晚些时候提供给所有设备。 此前&#xff0c;微软已向搭载骁龙X Plus和X Elite系列处理器的Co…

VS2019安装MFC组件

VS2019支持的MFC版本是mfc140 ~ mfc142版本&#xff0c;它兼容VS2015、VS2017之前的老版本程序。 一、MFC的历史版本 MFC的历史版本如下&#xff1a; IDE发布时间工具集版本MSC_VERMSVCMFC版本dllVisual C6.01998V601200MSVC6.06.0mfc42.dll、mfcce400.dllVisual Studio 2002…

Linux的热插拔UDEV机制和守护进程

目录 一、Linux的热插拔UDEV机制 二、守护进程 2.1 守护进程概念和基本特点&#xff1a; 2.2 显示进程信息&#xff1a; 2.3 守护进程和后台进程的区别&#xff1a; 2.4 创建守护进程的步骤和守护进程的特征&#xff1a; 2.4.1 创建守护进程的步骤&#xff1a; 2.4.2 守…

前端不懂 Docker ?先用它换掉常规的 Vue 项目部署方式

本项目代码已开源&#xff0c;具体见&#xff1a; 前端工程&#xff1a;vue3-ts-blog-frontend 后端工程&#xff1a;express-blog-backend 数据库初始化脚本&#xff1a;关注公众号程序员白彬&#xff0c;回复关键字“博客数据库脚本”&#xff0c;即可获取。 为什么需要容器化…

如何在 Mac 上下载安装植物大战僵尸杂交版? 最新版本 2.2 详细安装运行教程问题详解

植物大战僵尸杂交版已经更新至2.2了&#xff0c;但作者只支持 Windows、手机等版本并没有支持 MAC 版本&#xff0c;最近搞到了一个最新的杂交 2.2 版本的可以在 Macbook 上安装运行的移植安装包&#xff0c;试了一下非常完美能够正常在 MAC 上安装运行&#xff0c;看图&#x…

Linux云计算 |【第一阶段】ENGINEER-DAY5

主要内容&#xff1a; SELinux、系统故障修复、HTTPD/FTP服务搭建、防火墙策略管理、服务管理 一、SELinux安全制度 SELinux&#xff08;Security-Enhanced Linux&#xff09;&#xff0c;美国NSA国家安全局主导开发&#xff0c;一套增强Linux系统安全的强制访问控制体系&…

大模型只是轮子,与其闭门重复造轮子,不如深耕场景应用

如何理解李彦宏说的“不要卷模型&#xff0c;要卷应用” 7月4日&#xff0c;2024世界人工智能大会暨人工智能全球治理高级别会议全体会议在上海世博中心举办。在产业发展主论坛上&#xff0c;百度创始人、董事长兼首席执行官李彦宏呼吁&#xff1a;“大家不要卷模型&#xff0…

JavaWeb JavaScript ① JS简介

目录 一、HTML&CSS&JavaScript的作用 二、前后端关联标签——表单标签 1.form标签 2.input标签 3.get/post提交的差异 4.表单项标签 5.布局相关标签 块元素——div 行内元素——span 三、CSS 1.CSS引入方式 方式1 行内式 方式2 内嵌式 方式3 外部样式表 2.CSS选择器 元…