基于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
英文地址,請注明出處:http://en.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、在本地環…