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

從入門到精通詳解Java Apache POI操作Excel的實戰(zhàn)教程

 更新時間:2026年05月30日 08:51:26   作者:小當(dāng)家.105  
在Java開發(fā)中,Excel文件處理是一項常見且重要的技能,Apache POI作為Java操作Excel的經(jīng)典庫,提供了強大的API支持,本文從基礎(chǔ)IO流操作Excel的局限性入手,本文詳細介紹了Apache POI的核心概念,依賴配置,以及實戰(zhàn)案例

一、Excel操作方式概述

在Java開發(fā)中,操作Excel文件主要有兩種方式:

  1. Apache POI:Apache基金會的開源項目,用于操作Microsoft Office格式文件,包括Excel。
  2. EasyExcel:阿里巴巴開源的Excel處理框架,是對POI的封裝,簡化了Excel操作。

本文將重點介紹Apache POI的使用方法,幫助大家快速掌握Java操作Excel的核心技能。

二、Java基礎(chǔ)IO流操作Excel的局限性

使用Java基礎(chǔ)IO流可以實現(xiàn)文件的復(fù)制,但無法直接以字符串形式讀取Excel文件中的數(shù)據(jù),讀取結(jié)果會是亂碼或無法解析的字符。

// 錯誤演示:用字符流讀取Excel文件
import java.io.FileReader;
import java.io.BufferedReader;
import java.io.IOException;

public class WrongExcelReaderDemo {
    public static void main(String[] args) {
        // 待讀取的Excel文件路徑(.xls或.xlsx均可,都會報錯/亂碼)
        String excelFilePath = "src/test/java/Demo.xlsx";
        
        // 聲明字符流對象
        FileReader fileReader = null;
        BufferedReader bufferedReader = null;

        try {
            // 1. 初始化字符流,嘗試讀取Excel文件
            fileReader = new FileReader(excelFilePath);
            bufferedReader = new BufferedReader(fileReader);

            // 2. 按行讀取文件內(nèi)容
            String line;
            System.out.println("嘗試用字符流讀取Excel文件內(nèi)容:");
            while ((line = bufferedReader.readLine()) != null) {
                // 3. 輸出讀取到的內(nèi)容(會是亂碼或無法解析的字符)
                System.out.println(line);
            }

        } catch (IOException e) {
            // 捕獲IO異常(可能直接拋出文件讀取失敗,或讀取過程中報錯)
            e.printStackTrace();
        } finally {
            // 4. 手動關(guān)閉流(避免資源泄露,即使讀取失敗也執(zhí)行)
            try {
                if (bufferedReader != null) {
                    bufferedReader.close();
                }
                if (fileReader != null) {
                    fileReader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

不能直接使用IO,雖然能用二進制的形式實現(xiàn)文件轉(zhuǎn)移這一類行為.

三、Apache POI入門

3.1 POI簡介

Apache POI(Poor Obfuscation Implementation)是Apache基金會的開源項目,提供了Java API來處理Microsoft Office格式的文件,包括Excel、Word、PowerPoint等。

3.2 Excel文件格式

Excel有兩種主要文件格式:

  • .xls:Excel 2003及之前版本的文件格式,最多包含65536行,256列。
  • .xlsx:Excel 2007及之后版本的文件格式,最多包含1048576行,16384列。

3.3 導(dǎo)入POI依賴

不同版本的Excel文件需要使用不同的POI依賴:

<!-- POI依賴(xls格式) -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>5.2.4</version>
</dependency>
<!-- POI依賴(xlsx格式) -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>5.2.4</version>
</dependency>

四、POI寫入Excel文件

下面我們通過一個實例來學(xué)習(xí)如何使用POI寫入Excel文件:

4.1 核心API說明

  • Workbook:工作簿接口,代表整個Excel文件
    • HSSFWorkbook:對應(yīng).xls格式
    • XSSFWorkbook:對應(yīng).xlsx格式
  • Sheet:工作表,一個Workbook可以包含多個Sheet
  • Row:行,一個Sheet可以包含多個Row
  • Cell:單元格,一個Row可以包含多個Cell

4.2 寫入Excel示例

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import java.io.FileOutputStream;
import java.io.IOException;

// 生成實習(xí)記錄Excel文件(.xls格式)
public class Test {
    public static void main(String[] args) throws Exception {
        // 1. 創(chuàng)建Workbook(HSSFWorkbook對應(yīng).xls,XSSFWorkbook對應(yīng).xlsx)
        Workbook workbook = new HSSFWorkbook();
        
        // 2. 創(chuàng)建Sheet,命名為「實習(xí)記錄」(核心修改點1)
        Sheet sheet = workbook.createSheet("實習(xí)記錄");
        
        // 3. 創(chuàng)建表頭行(第一行,索引0)
        Row headerRow = sheet.createRow(0);
        // 表頭單元格:姓名、性別、工作、公司
        headerRow.createCell(0).setCellValue("姓名");
        headerRow.createCell(1).setCellValue("性別");
        headerRow.createCell(2).setCellValue("工作");
        headerRow.createCell(3).setCellValue("公司");
        
        // 4. 創(chuàng)建數(shù)據(jù)行(第二行,索引1),填充指定數(shù)據(jù)(核心修改點2)
        Row dataRow = sheet.createRow(1);
        dataRow.createCell(0).setCellValue("小當(dāng)家");  // 姓名
        dataRow.createCell(1).setCellValue("男");      // 性別
        dataRow.createCell(2).setCellValue("后端開發(fā)");// 工作
        dataRow.createCell(3).setCellValue("xxx");     // 公司

        // 5. 自動調(diào)整列寬(優(yōu)化顯示效果)
        for (int i = 0; i < 4; i++) {
            sheet.autoSizeColumn(i);
        }
        
        // 6. 寫入文件并關(guān)閉資源
        try (FileOutputStream fos = new FileOutputStream("D:\\實習(xí)記錄.xls")) {
            workbook.write(fos);
            System.out.println("實習(xí)記錄Excel生成成功!路徑:D:\\實習(xí)記錄.xls");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            workbook.close();
        }
    }
}

4.3 運行結(jié)果

運行上述代碼后,會在D盤根目錄生成一個名為"實習(xí)記錄.xls"的Excel文件:

這里的報錯是日志依賴,無視即可,不影響demo演示

五、POI讀取Excel文件

5.1 基本讀取示例

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import java.io.FileInputStream;
import java.io.InputStream;

public class TestRead {
    public static void main(String[] args) throws Exception {
        // 獲取文件的數(shù)據(jù)流(實習(xí)記錄Excel路徑)
        InputStream inputStream = new FileInputStream("D:\\實習(xí)記錄.xls");
        
        // 創(chuàng)建文件對象(僅支持.xls格式)
        Workbook workbook = new HSSFWorkbook(inputStream);
        
        // 獲取Sheet(按索引取第一個Sheet)
        Sheet sheet = workbook.getSheetAt(0);
        
        // ========== 讀取小當(dāng)家的信息 ==========
        // 讀取第二行(數(shù)據(jù)行,索引1):第一行是表頭(索引0)
        Row dataRow = sheet.getRow(1);
        
        // 讀取“姓名”列(第二行第一列,索引0)
        Cell nameCell = dataRow.getCell(0);
        String name = nameCell.getStringCellValue();
        
        // 讀取“性別”列(第二行第二列,索引1)
        Cell genderCell = dataRow.getCell(1);
        String gender = genderCell.getStringCellValue();
        
        // 讀取“工作”列(第二行第三列,索引2)
        Cell jobCell = dataRow.getCell(2);
        String job = jobCell.getStringCellValue();
        
        // 讀取“公司”列(第二行第四列,索引3)
        Cell companyCell = dataRow.getCell(3);
        String company = companyCell.getStringCellValue();
        
        // 打印讀取結(jié)果
        System.out.println("姓名:" + name);
        System.out.println("性別:" + gender);
        System.out.println("工作:" + job);
        System.out.println("公司:" + company);
        
        // 關(guān)閉流
        inputStream.close();
    }
}

5.2 運行結(jié)果

5.3 處理不同類型的單元格

在實際開發(fā)中,Excel單元格可能包含不同類型的數(shù)據(jù)(字符串、數(shù)字、日期等)。如果直接使用getStringCellValue()讀取數(shù)字類型的單元格,會報錯。因此,我們需要根據(jù)單元格類型進行不同的處理:

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import java.io.FileInputStream;
import java.io.InputStream;

public class TestRead {
    public static void main(String[] args) throws Exception {
        // 獲取文件的數(shù)據(jù)流(實習(xí)記錄Excel路徑)
        InputStream inputStream = new FileInputStream("D:\\實習(xí)記錄.xls");
        
        // 創(chuàng)建文件對象(僅支持.xls格式)
        Workbook workbook = new HSSFWorkbook(inputStream);
        
        // 獲取Sheet(按索引取第一個Sheet)
        Sheet sheet = workbook.getSheetAt(0);
        
        // ========== 讀取小當(dāng)家的信息 ==========
        // 讀取第二行(數(shù)據(jù)行,索引1):第一行是表頭(索引0)
        Row dataRow = sheet.getRow(1);
        
        // 讀取“姓名”列(第二行第一列,索引0)
        Cell nameCell = dataRow.getCell(0);
        String name = nameCell.getStringCellValue();
        
        // 讀取“性別”列(第二行第二列,索引1)
        Cell genderCell = dataRow.getCell(1);
        String gender = genderCell.getStringCellValue();
        
        // 讀取“工作”列(第二行第三列,索引2)
        Cell jobCell = dataRow.getCell(2);
        if (jobCell.getCellType() == CellType.STRING) {
            String job = jobCell.getStringCellValue();
        } else if (jobCell.getCellType() == CellType.NUMERIC) {
            double jobNum = jobCell.getNumericCellValue();
            String job = String.valueOf(jobNum);
        }
        
        // 讀取“公司”列(第二行第四列,索引3)
        Cell companyCell = dataRow.getCell(3);
        if (companyCell.getCellType() == CellType.STRING) {
            String company = companyCell.getStringCellValue();
        } else if (companyCell.getCellType() == CellType.NUMERIC) {
            double companyNum = companyCell.getNumericCellValue();
            String company = String.valueOf(companyNum);
        }
        
        // 打印讀取結(jié)果
        System.out.println("姓名:" + name);
        System.out.println("性別:" + gender);
        System.out.println("工作:" + job);
        System.out.println("公司:" + company);
        
        // 關(guān)閉流
        inputStream.close();
    }
}

六、總結(jié)

通過本文的學(xué)習(xí),我們了解了:

  1. Java操作Excel的兩種主要方式:POI和EasyExcel
  2. 基礎(chǔ)IO流操作Excel的局限性
  3. POI的核心API和使用方法
  4. 如何使用POI寫入Excel文件
  5. 如何使用POI讀取Excel文件
  6. 如何處理不同類型的Excel單元格

POI作為Java操作Excel的經(jīng)典庫,功能強大但使用相對復(fù)雜。在實際開發(fā)中,如果需要處理大量數(shù)據(jù)或追求更簡潔的代碼,可以考慮使用EasyExcel等封裝庫。

到此這篇關(guān)于從入門到精通詳解Java Apache POI操作Excel的實戰(zhàn)教程的文章就介紹到這了,更多相關(guān)Java Apache POI操作Excel內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java SPI機制原理與實戰(zhàn)技巧

    Java SPI機制原理與實戰(zhàn)技巧

    這段文章深入解析了JavaSPI機制原理與實戰(zhàn),涵蓋基本原理、代碼實戰(zhàn)及優(yōu)化方案,重點介紹了資源管理、異常處理、日志規(guī)范和單元測試的最佳實踐,助你寫出高質(zhì)量代碼,感興趣的朋友一起看看吧
    2026-06-06
  • Spring?Boot如何配置yml配置文件定義集合、數(shù)組和Map

    Spring?Boot如何配置yml配置文件定義集合、數(shù)組和Map

    這篇文章主要介紹了Spring?Boot?優(yōu)雅配置yml配置文件定義集合、數(shù)組和Map,包括Spring?Boot?yml配置文件定義基本數(shù)據(jù)類型和引用數(shù)據(jù)類型的方式,需要的朋友可以參考下
    2023-10-10
  • Spring?AI集成DeepSeek實現(xiàn)流式輸出的操作方法

    Spring?AI集成DeepSeek實現(xiàn)流式輸出的操作方法

    本文介紹了如何在SpringBoot中使用Sse(Server-SentEvents)技術(shù)實現(xiàn)流式輸出,后端使用SpringMVC中的SseEmitter對象,前端使用EventSource對象監(jiān)聽SSE接口并展示數(shù)據(jù)流,通過這種方式可以提升用戶體驗,避免大模型響應(yīng)速度慢的問題,感興趣的朋友一起看看吧
    2025-03-03
  • Netty + ZooKeeper 實現(xiàn)簡單的服務(wù)注冊與發(fā)現(xiàn)

    Netty + ZooKeeper 實現(xiàn)簡單的服務(wù)注冊與發(fā)現(xiàn)

    服務(wù)注冊和發(fā)現(xiàn)一直是分布式的核心組件。本文介紹了借助 ZooKeeper 做注冊中心,如何實現(xiàn)一個簡單的服務(wù)注冊和發(fā)現(xiàn)。,需要的朋友可以參考下
    2019-06-06
  • SpringBoot自定義注解驗證枚舉的實現(xiàn)

    SpringBoot自定義注解驗證枚舉的實現(xiàn)

    本文主要介紹了SpringBoot自定義注解驗證枚舉的實現(xiàn),數(shù)據(jù)校驗,需要對枚舉類型的數(shù)據(jù)傳參,進行數(shù)據(jù)校驗,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-01-01
  • Java?靜態(tài)機制之靜態(tài)變量、方法、代碼塊與類加載深入理解

    Java?靜態(tài)機制之靜態(tài)變量、方法、代碼塊與類加載深入理解

    本文全面解析了Java中static關(guān)鍵字的特性與應(yīng)用,靜態(tài)機制使成員與類本身關(guān)聯(lián),包括靜態(tài)變量(存儲在方法區(qū),所有對象共享)、靜態(tài)方法(可通過類名直接調(diào)用,不能訪問實例成員)和靜態(tài)代碼塊(類加載時執(zhí)行),感興趣的朋友跟隨小編一起看看吧
    2025-11-11
  • java并發(fā)編程專題(四)----淺談(JUC)Lock鎖

    java并發(fā)編程專題(四)----淺談(JUC)Lock鎖

    這篇文章主要介紹了java并發(fā)編程(JUC)Lock鎖的相關(guān)內(nèi)容,文中講解非常細致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • Jenkins安裝以及郵件配置詳解

    Jenkins安裝以及郵件配置詳解

    這篇文章主要介紹了Jenkins安裝以及郵件配置相關(guān)問題,并通過圖文給大家做了詳細講解步驟,需要的朋友參考下吧。
    2017-12-12
  • Spring根據(jù)XML配置文件注入屬性的方法

    Spring根據(jù)XML配置文件注入屬性的方法

    下面小編就為大家?guī)硪黄猄pring根據(jù)XML配置文件注入屬性的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • Java 設(shè)計模式之責(zé)任鏈模式及異步責(zé)任鏈詳解

    Java 設(shè)計模式之責(zé)任鏈模式及異步責(zé)任鏈詳解

    顧名思義,責(zé)任鏈模式(Chain of Responsibility Pattern)為請求創(chuàng)建了一個接收者對象的鏈。這種模式給予請求的類型,對請求的發(fā)送者和接收者進行解耦。這種類型的設(shè)計模式屬于行為型模式
    2021-11-11

最新評論

仁布县| 新竹市| 浪卡子县| 三都| 鹿邑县| 敖汉旗| 绥阳县| 武川县| 南岸区| 中方县| 沙雅县| 曲沃县| 邵东县| 晋城| 麟游县| 渑池县| 蓬溪县| 赤峰市| 宁国市| 淳化县| 同仁县| 深州市| 铅山县| 石棉县| 黄平县| 凤山市| 三江| 青岛市| 福建省| 丹阳市| 嘉鱼县| 庆阳市| 教育| 余姚市| 永春县| 海阳市| 那坡县| 兴安县| 长顺县| 康定县| 邹城市|