基于Java的Excel列数据提取工具实现

摘要:本文介绍了一个使用Java语言开发的Excel列数据提取工具,该工具借助Apache POI库实现对Excel文件的读取与特定列数据提取功能。通过用户输入文件路径与列名,程序可从指定Excel文件中提取相应列的数据并展示,同时详细阐述了关键代码逻辑与实现步骤。

关键词:Java;Excel数据提取;Apache POI

代码和数据测试:我用夸克网盘分享了「基于Java的Excel列数据提取工具实现」。链接:https://pan.quark.cn/s/1a7cb199e0c5

一、引言

在数据处理任务中,常常需要从Excel文件中提取特定列的数据。本程序利用Java语言和Apache POI库,实现根据用户输入的列名,从Excel文件中提取对应列数据的功能。

支持处理.xls 和.xlsx 两种 Excel 格式文件
通过命令行交互获取文件路径和要提取的列名
可以同时提取多个列的数据
对列名进行了大小写不敏感的匹配
包含了基本的错误处理机制

二、核心代码实现

使用的依赖

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

2.1 主函数逻辑

主函数main负责与用户交互并协调整个数据提取流程。

  1. 用户输入获取
    使用Scanner类获取用户输入的Excel文件路径和要提取的列名。用户输入的列名以逗号分隔,程序将其分割并处理为目标列名列表。
Scanner scanner = new Scanner(System.in);
System.out.print("请输入Excel文件路径: ");
String filePath = scanner.nextLine();System.out.print("请输入要提取的列名(多个列名用逗号分隔): ");
String columnNamesInput = scanner.nextLine();
String[] columnNames = columnNamesInput.split(",");List<String> targetColumnNames = new ArrayList<>();
for (String name : columnNames) {targetColumnNames.add(name.trim());
}
  1. Excel文件处理
    尝试打开用户指定路径的Excel文件,并根据文件扩展名确定使用XSSFWorkbook(.xlsx文件)或HSSFWorkbook(.xls文件)创建Workbook对象。
try {FileInputStream file = new FileInputStream(new File(filePath));Workbook workbook = getWorkbook(file, filePath);
  1. 工作表与表头处理
    获取Excel文件的第一个工作表和表头行,用于后续查找目标列的索引。
Sheet sheet = workbook.getSheetAt(0); // 获取第一个工作表
Row headerRow = sheet.getRow(0); // 获取表头行,0是第一行
  1. 目标列索引查找
    遍历目标列名列表,通过findColumnIndex方法查找每个列名在表头中的索引位置,并记录找到的索引。
// 查找目标列的索引
List<Integer> targetColumnIndices = new ArrayList<>();
for (String targetName : targetColumnNames) {int columnIndex = findColumnIndex(headerRow, targetName);if (columnIndex != -1) {targetColumnIndices.add(columnIndex);System.out.println("找到列: " + targetName + ", 索引: " + columnIndex);} else {System.out.println("未找到列: " + targetName);}
}
  1. 目标列数据提取与展示
    如果找到至少一个目标列,则从工作表的第二行开始遍历每一行,提取目标列的数据并打印。
// 提取并打印目标列的数据
if (!targetColumnIndices.isEmpty()) {System.out.println("\n提取的数据:");for (int i = 1; i <= sheet.getLastRowNum(); i++) {Row row = sheet.getRow(i);if (row == null) continue;StringBuilder rowData = new StringBuilder();for (int colIndex : targetColumnIndices) {Cell cell = row.getCell(colIndex);if (cell != null) {rowData.append(getCellValueAsString(cell)).append("\t");} else {rowData.append("null\t");}}System.out.println(rowData.toString().trim());}
}
  1. 资源关闭
    完成数据提取后,关闭WorkbookFileInputStream资源。
workbook.close();
file.close();
  1. 异常处理
    如果在处理Excel文件过程中发生IOException,捕获异常并打印错误信息。
} catch (IOException e) {System.err.println("处理Excel文件时出错: " + e.getMessage());e.printStackTrace();
}

2.2 获取Workbook对象

getWorkbook方法根据文件路径的扩展名,返回对应的Workbook对象。如果文件扩展名不是.xlsx.xls,则抛出IllegalArgumentException异常。

private static Workbook getWorkbook(FileInputStream file, String filePath) throws IOException {if (filePath.endsWith(".xlsx")) {return new XSSFWorkbook(file);} else if (filePath.endsWith(".xls")) {return new HSSFWorkbook(file);} else {throw new IllegalArgumentException("不支持的文件格式: " + filePath);}
}

2.3 查找列索引

findColumnIndex方法在给定的表头行中查找指定列名的索引。它遍历表头行的每个单元格,比较单元格的字符串值(忽略大小写)与目标列名,若匹配则返回该单元格的索引,否则返回 -1。

private static int findColumnIndex(Row headerRow, String columnName) {if (headerRow == null) return -1;for (int i = 0; i <= headerRow.getLastCellNum(); i++) {Cell cell = headerRow.getCell(i);if (cell != null && cell.getCellType() == CellType.STRING) {String cellValue = cell.getStringCellValue().trim();if (cellValue.equalsIgnoreCase(columnName)) {return i;}}}return -1;
}

2.4 获取单元格值字符串

getCellValueAsString方法根据单元格的类型,将单元格的值转换为字符串形式返回。它支持处理字符串、数字、日期、布尔值、公式和空白等不同类型的单元格。

private static String getCellValueAsString(Cell cell) {CellType cellType = cell.getCellType();switch (cellType) {case STRING:return cell.getStringCellValue();case NUMERIC:if (DateUtil.isCellDateFormatted(cell)) {return cell.getDateCellValue().toString();} else {return String.valueOf(cell.getNumericCellValue());}case BOOLEAN:return String.valueOf(cell.getBooleanCellValue());case FORMULA:return cell.getCellFormula();case BLANK:return "";default:return cell.toString();}
}

结果输出:

请输入Excel文件路径: D:\pyprogect\excellianxi\all.xlsx
请输入要提取的列名(多个列名用逗号分隔): id,age,income
找到列: id, 索引: 0
找到列: age, 索引: 1
找到列: income, 索引: 4提取的数据:
ID12101	48.0	17546.0
ID12102	40.0	30085.1
ID12103	51.0	16575.4
ID12104	23.0	20375.4
ID12105	57.0	50576.3
ID12106	57.0	37869.6
ID12107	22.0	8877.07
ID12678	34.0	17546.0
ID12679	35.0	30085.1
ID12680	36.0	16575.4
ID12681	37.0	20375.4
ID12682	38.0	50576.3
ID12683	39.0	37869.6
ID12684	40.0	8877.07Process finished with exit code 0

完整代码:

package org.example;import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;public class ExcelColumnSelector {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.print("请输入Excel文件路径: ");String filePath = scanner.nextLine();System.out.print("请输入要提取的列名(多个列名用逗号分隔): ");String columnNamesInput = scanner.nextLine();String[] columnNames = columnNamesInput.split(",");List<String> targetColumnNames = new ArrayList<>();for (String name : columnNames) {targetColumnNames.add(name.trim());}try {FileInputStream file = new FileInputStream(new File(filePath));Workbook workbook = getWorkbook(file, filePath);Sheet sheet = workbook.getSheetAt(0); // 获取第一个工作表Row headerRow = sheet.getRow(0); // 获取表头行// 查找目标列的索引List<Integer> targetColumnIndices = new ArrayList<>();for (String targetName : targetColumnNames) {int columnIndex = findColumnIndex(headerRow, targetName);if (columnIndex != -1) {targetColumnIndices.add(columnIndex);System.out.println("找到列: " + targetName + ", 索引: " + columnIndex);} else {System.out.println("未找到列: " + targetName);}}// 提取并打印目标列的数据if (!targetColumnIndices.isEmpty()) {System.out.println("\n提取的数据:");for (int i = 1; i <= sheet.getLastRowNum(); i++) {Row row = sheet.getRow(i);if (row == null) continue;StringBuilder rowData = new StringBuilder();for (int colIndex : targetColumnIndices) {Cell cell = row.getCell(colIndex);if (cell != null) {rowData.append(getCellValueAsString(cell)).append("\t");} else {rowData.append("null\t");}}System.out.println(rowData.toString().trim());}}workbook.close();file.close();} catch (IOException e) {System.err.println("处理Excel文件时出错: " + e.getMessage());e.printStackTrace();}}private static Workbook getWorkbook(FileInputStream file, String filePath) throws IOException {if (filePath.endsWith(".xlsx")) {return new XSSFWorkbook(file);} else if (filePath.endsWith(".xls")) {return new HSSFWorkbook(file);} else {throw new IllegalArgumentException("不支持的文件格式: " + filePath);}}private static int findColumnIndex(Row headerRow, String columnName) {if (headerRow == null) return -1;for (int i = 0; i <= headerRow.getLastCellNum(); i++) {Cell cell = headerRow.getCell(i);if (cell != null && cell.getCellType() == CellType.STRING) {String cellValue = cell.getStringCellValue().trim();if (cellValue.equalsIgnoreCase(columnName)) {return i;}}}return -1;}private static String getCellValueAsString(Cell cell) {CellType cellType = cell.getCellType();switch (cellType) {case STRING:return cell.getStringCellValue();case NUMERIC:if (DateUtil.isCellDateFormatted(cell)) {return cell.getDateCellValue().toString();} else {return String.valueOf(cell.getNumericCellValue());}case BOOLEAN:return String.valueOf(cell.getBooleanCellValue());case FORMULA:return cell.getCellFormula();case BLANK:return "";default:return cell.toString();}}
}    

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

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

相关文章

关于人工智能未来的趋势

学而不思则罔 翻译&#xff1a;使用深度学习、强化学习却不用专家系统&#xff0c;就会产生幻觉。 思而不学则殆 翻译&#xff1a;只有专家系统逻辑推理&#xff0c;但是不用大模型更新知识&#xff0c;就无法发展下去了。 因此&#xff0c;未来智能的范式应该是&#xff1a; …

Java八股文——MySQL「性能调优篇」

MySQL的EXPLAIN有什么作用&#xff1f; 面试官您好&#xff0c;EXPLAIN命令是我在进行SQL性能优化时&#xff0c;使用最频繁、也最重要的一个工具。 它的核心作用可以一句话概括&#xff1a;模拟MySQL的查询优化器来执行一条SQL语句&#xff0c;并向我们展示出它最终决定采用…

win打印机共享处理

win打印机共享处理 软件链接 无法启动Print Spooler服务错误193:0xc1的解决方案主要涉及修复服务依赖关系、清理打印缓存及修复系统文件‌。该错误通常由系统文件损坏、注册表配置异常或依赖服务未启动导致&#xff0c;可通过以下步骤系统化解决。‌‌ 解决方法&#xff1a;替换…

C++ map代码练习 1、2、priority_queue基础概念、对象创建、数据插入、获取堆顶、出队操作、大小操作,自定义结构、代码练习 1 2

map代码练习1&#xff0c;对应力扣 两个数据的交集&#xff0c;代码见下 class Solution { public:vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {map<int, int> cnt;vector<int> ans;for(int i0; i<nums1.size(…

三天冲刺《编译原理》——笔记(一)

点关注不迷路哟。你的点赞、收藏&#xff0c;一键三连&#xff0c;是我持续更新的动力哟&#xff01;&#xff01;&#xff01; 持续关注我~~~主页&#xff0c;查看更多内容哟&#xff08;希望你能在这里有所收获&#x1f92d;&#xff09;。点关注&#xff0c;不迷路&#xf…

代理模式Proxy Pattern

模式定义 给某一个对象提供一个代理&#xff0c;并由代理对象控制对原对象的引用 对象结构型模式 模式结构 Subject&#xff1a;抽象主题角色Proxy&#xff1a;代理主题角色RealSubject&#xff1a;真实主题角色 代理类实现代码 public class Proxy implements Subject {p…

基于YOLOv11与单目测距的实战教程:从目标检测到距离估算

引言 在计算机视觉领域&#xff0c;目标检测与距离估算的结合是自动驾驶、机器人导航等场景的关键技术。本文将以YOLOv8模型为核心&#xff0c;结合单目相机的几何模型&#xff0c;实现对视频中目标的实时检测与距离估算。代码参考自单目测距原理博客&#xff0c;并通过实践验…

代码生成器使用原理以及使用方法

代码生成器使用原理以及使用方法 版本号&#xff1a;1.0 二Ο二五年二月 目录 文档介绍 1.1编写目的 1.2文档范围 1.3读者对象 系统设计 2.1设计目标 2.2设计思路 2.3代码实现原理 使用方法 3.1如何使用 3.2如何修改&#xff1f; 对原程序的bug修改及简…

STM32标准库-I2C通信

文章目录 一、I2C通信1.1 I2C1.2硬件电路1.3I2C时序基本单元1.4I2C时序 二、MPU60502.1简介2.2MPU6050参数2.3硬件电路2.4MPU6050框图 三、I2C外设(硬件)3.1简介3.2I2C框图3.3I2C基本结构3.4主机发送3.5主机接收3.6软件/硬件波形对比1. 时序精度2. 信号稳定性3. 速率与效率4. 波…

使用 Azure LLM Functions 与 Elasticsearch 构建更智能的查询体验

作者&#xff1a;来自 Elastic Jonathan Simon 及 James Williams 试用这个示例房地产搜索应用&#xff0c;它结合了 Azure Gen AI LLM Functions 与 Elasticsearch&#xff0c;提供灵活的混合搜索结果。在 GitHub Codespaces 中查看逐步配置和运行该示例应用的方法。 更多阅读…

模糊查询 的深度技术解析

以下是 模糊查询 的深度技术解析&#xff0c;涵盖核心语法、通配符策略、性能优化及实战陷阱&#xff1a; &#x1f50d; 一、核心运算符&#xff1a;LIKE SELECT * FROM 表名 WHERE 列名 LIKE 模式字符串;&#x1f3af; 二、通配符详解 通配符作用示例匹配案例%任意长度字符…

[论文阅读] (39)EuroSP25 CTINEXUS:基于大模型的威胁情报知识图谱自动构建

《娜璋带你读论文》系列主要是督促自己阅读优秀论文及听取学术讲座&#xff0c;并分享给大家&#xff0c;希望您喜欢。由于作者的英文水平和学术能力不高&#xff0c;需要不断提升&#xff0c;所以还请大家批评指正&#xff0c;非常欢迎大家给我留言评论&#xff0c;学术路上期…

强化学习三大分类

核心目标&#xff1a; 教会一个智能体&#xff08;比如机器人、游戏AI、推荐系统&#xff09;通过试错和奖励&#xff0c;学会在某个环境中完成特定任务的最佳策略。 核心角色&#xff1a; 智能体 (Agent)&#xff1a; 学习者&#xff0c;比如玩游戏的小人、控制温度的空调系…

城市排水生命线安全运行监测项目

近年来&#xff0c;城市内涝、污水溢流等问题频发&#xff0c;让排水管网这一"城市生命线"的安全运行备受关注。如何让地下的"毛细血管"更智能、更可靠&#xff1f;本文将带您深入解析城市排水生命线安全运行监测项目的建设逻辑与技术内核&#xff0c;看科…

LeetCode - 34. 在排序数组中查找元素的第一个和最后一个位置

题目 34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣&#xff08;LeetCode&#xff09; 思路 查找左边界 初始化 left 0, right nums.size() - 1 当 left < right 时循环&#xff1a; 计算中点 mid left (right - left) / 2 如果 nums[mid] < target…

Tesollo四指灵巧手DG-4F:18自由度与多种抓取模式结合实现高精度操作

Tesollo四指灵巧手 DG-4F 是一款具备 18 自由度的多模态末端执行器&#xff0c;采用模块化结构设计&#xff0c;融合人手灵活性与夹爪高效性特点。该产品兼容 Universal Robots、Techman、Doosan Robotics、Rainbow Robotics 等主流机器人平台&#xff0c;适用于工业自动化、科…

深入浅出JavaScript 原型链:对象继承的“隐形链条”

深入浅出JavaScript 原型链&#xff1a;对象继承的“隐形链条” 在 JavaScript 的世界里&#xff0c;原型链&#xff08;Prototype Chain&#xff09;是一个核心概念。它如同一条隐形的链条&#xff0c;连接着所有对象&#xff0c;使得代码能够高效地共享属性和方法。理解原型…

LINUX中MYSQL的使用

LINUX中MYSQL的使用 MYSQL的数据类型 bool&#xff1a; 布尔类型 0 或者 1 CHAR&#xff1a; 单字符的字符 CHAR&#xff08;n&#xff09;:多字节字符 VARCHAR&#xff08;n&#xff09;&#xff1a;可变长度的字符型 TINYINT &#xff1a; 单字节整型 SMALLINT&#x…

打卡第48天:随机函数与广播机制

知识点回顾&#xff1a; 随机张量的生成&#xff1a;torch.randn函数卷积和池化的计算公式&#xff08;可以不掌握&#xff0c;会自动计算的&#xff09;pytorch的广播机制&#xff1a;加法和乘法的广播机制 ps&#xff1a;numpy运算也有类似的广播机制&#xff0c;基本一致 …

学习昇腾开发的第四天--基本指令

1、查看npu当前状态信息 npu-smi info 2、查看NPU的ID npu-smi info -l3、调用python python3 4、修改用户名 su - HwHiAiUser 5、查看cann版本 cat /usr/local/Ascend/ascend-toolkit/latest/compiler/version.info 6、删除文件夹 sudo rm -rf HelloWorld7、在本地环…