最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于Java實現(xiàn)Excel列數(shù)據(jù)提取工具

 更新時間:2025年06月18日 10:29:50   作者:碼銀  
這篇文章主要介紹了一個使用Java語言開發(fā)的Excel列數(shù)據(jù)提取工具,該工具借助Apache?POI庫實現(xiàn)對Excel文件的讀取與特定列數(shù)據(jù)提取功能,感興趣的小伙伴可以跟隨小編一起學習一下

一、引言

在數(shù)據(jù)處理任務中,常常需要從Excel文件中提取特定列的數(shù)據(jù)。本程序利用Java語言和Apache POI庫,實現(xiàn)根據(jù)用戶輸入的列名,從Excel文件中提取對應列數(shù)據(jù)的功能。

  • 支持處理.xls 和.xlsx 兩種 Excel 格式文件
  • 通過命令行交互獲取文件路徑和要提取的列名
  • 可以同時提取多個列的數(shù)據(jù)
  • 對列名進行了大小寫不敏感的匹配
  • 包含了基本的錯誤處理機制

二、核心代碼實現(xiàn)

使用的依賴

<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 主函數(shù)邏輯

主函數(shù)main負責與用戶交互并協(xié)調(diào)整個數(shù)據(jù)提取流程。

1.用戶輸入獲?。?/p>

使用Scanner類獲取用戶輸入的Excel文件路徑和要提取的列名。用戶輸入的列名以逗號分隔,程序?qū)⑵浞指畈⑻幚頌槟繕肆忻斜怼?/p>

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());
}

2.Excel文件處理:

嘗試打開用戶指定路徑的Excel文件,并根據(jù)文件擴展名確定使用XSSFWorkbook(.xlsx文件)或HSSFWorkbook(.xls文件)創(chuàng)建Workbook對象。

try {
    FileInputStream file = new FileInputStream(new File(filePath));
    Workbook workbook = getWorkbook(file, filePath);

3.工作表與表頭處理:

獲取Excel文件的第一個工作表和表頭行,用于后續(xù)查找目標列的索引。

Sheet sheet = workbook.getSheetAt(0); // 獲取第一個工作表
Row headerRow = sheet.getRow(0); // 獲取表頭行,0是第一行

4.目標列索引查找:

遍歷目標列名列表,通過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);
    }
}

5.目標列數(shù)據(jù)提取與展示:

如果找到至少一個目標列,則從工作表的第二行開始遍歷每一行,提取目標列的數(shù)據(jù)并打印。

// 提取并打印目標列的數(shù)據(jù)
if (!targetColumnIndices.isEmpty()) {
    System.out.println("\n提取的數(shù)據(jù):");
    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());
    }
}

6.資源關(guān)閉:

完成數(shù)據(jù)提取后,關(guān)閉Workbook和FileInputStream資源。

workbook.close();
file.close();

7.異常處理:

如果在處理Excel文件過程中發(fā)生IOException,捕獲異常并打印錯誤信息。

catch (IOException e) {
    System.err.println("處理Excel文件時出錯: " + e.getMessage());
    e.printStackTrace();
}

2.2 獲取Workbook對象

getWorkbook方法根據(jù)文件路徑的擴展名,返回對應的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方法根據(jù)單元格的類型,將單元格的值轉(zhuǎn)換為字符串形式返回。它支持處理字符串、數(shù)字、日期、布爾值、公式和空白等不同類型的單元格。

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();
    }
}

結(jié)果輸出:

請輸入Excel文件路徑: D:\pyprogect\excellianxi\all.xlsx
請輸入要提取的列名(多個列名用逗號分隔): id,age,income
找到列: id, 索引: 0
找到列: age, 索引: 1
找到列: income, 索引: 4

提取的數(shù)據(jù):
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.07

Process 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);
                }
            }

            // 提取并打印目標列的數(shù)據(jù)
            if (!targetColumnIndices.isEmpty()) {
                System.out.println("\n提取的數(shù)據(jù):");
                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();
        }
    }
}    

到此這篇關(guān)于基于Java實現(xiàn)Excel列數(shù)據(jù)提取工具的文章就介紹到這了,更多相關(guān)Java提取Excel列數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java中Collection迭代器的實現(xiàn)

    java中Collection迭代器的實現(xiàn)

    Java迭代器是遍歷Collection集合的標準工具,提供hasNext()、next()和remove()三個核心方法,下面就來介紹一下Collection迭代器的實現(xiàn),感興趣的可以了解一下
    2026-01-01
  • SpringBoot讀取yaml文件操作詳解

    SpringBoot讀取yaml文件操作詳解

    YAML 是 “YAML Ain’t Markup Language”(YAML 不是一種標記語言)的遞歸縮寫。在開發(fā)的這種語言時,YAML 的意思其實是:“Yet Another Markup Language”(仍是一種標記語言),本文給大家介紹的非常詳細,需要的朋友可以參考下
    2022-09-09
  • Java泛型類型通配符和C#對比分析

    Java泛型類型通配符和C#對比分析

    下面小編就為大家?guī)硪黄狫ava泛型類型通配符和C#對比分析。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-10-10
  • Java Assert.assertEquals案例詳解

    Java Assert.assertEquals案例詳解

    這篇文章主要介紹了Java Assert.assertEquals案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • SPRING FRAMEWORK BEAN作用域和生命周期原理解析

    SPRING FRAMEWORK BEAN作用域和生命周期原理解析

    這篇文章主要介紹了SPRING FRAMEWORK BEAN作用域和生命周期原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-01-01
  • MyBatis注解開發(fā)之實現(xiàn)自定義映射關(guān)系和關(guān)聯(lián)查詢

    MyBatis注解開發(fā)之實現(xiàn)自定義映射關(guān)系和關(guān)聯(lián)查詢

    本文主要詳細介紹了MyBatis注解開發(fā)中,實現(xiàn)自定義映射關(guān)系和關(guān)聯(lián)查詢,文中有詳細的代碼示例,對學習MyBatis有一定的參考價值,需要的朋友可以參考閱讀
    2023-04-04
  • java實現(xiàn)貪吃蛇游戲代碼(附完整源碼)

    java實現(xiàn)貪吃蛇游戲代碼(附完整源碼)

    這篇文章主要介紹了java實現(xiàn)貪吃蛇游戲代碼(附完整源碼),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • IDEA2025.1如何取消代碼自動補全

    IDEA2025.1如何取消代碼自動補全

    這篇文章主要介紹了IDEA2025.1如何取消代碼自動補全的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-06-06
  • java導出csv格式文件的方法

    java導出csv格式文件的方法

    這篇文章主要為大家詳細介紹了java導出csv格式文件的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • 超級好用的輕量級JSON處理命令jq(最新推薦)

    超級好用的輕量級JSON處理命令jq(最新推薦)

    jq是一個輕量級的命令行工具,讓你可以非常方便地處理JSON數(shù)據(jù),如切分、過濾、映射、轉(zhuǎn)化等,就像sed、awk、grep文本處理三劍客一樣,這篇文章主要介紹了超級好用的輕量級JSON處理命令jq,需要的朋友可以參考下
    2023-01-01

最新評論

北辰区| 吉安市| 渭南市| 揭西县| 湘潭市| 太保市| 云龙县| 开原市| 石棉县| 大石桥市| 石河子市| 郴州市| 财经| 郓城县| 板桥市| 河间市| 田东县| 怀集县| 共和县| 磐石市| 全椒县| 宁乡县| 即墨市| 叙永县| 郯城县| 响水县| 贡山| 阿城市| 洪洞县| 疏勒县| 金沙县| 桓台县| 中西区| 绥宁县| 长宁区| 渭南市| 鄱阳县| 徐汇区| 南靖县| 马边| 建始县|