欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot使用Apache POI庫(kù)讀取Excel文件的操作詳解

 更新時(shí)間:2025年01月06日 08:26:31   作者:Andya  
在日常開(kāi)發(fā)中,我們經(jīng)常需要處理Excel文件中的數(shù)據(jù),無(wú)論是從數(shù)據(jù)庫(kù)導(dǎo)入數(shù)據(jù)、處理數(shù)據(jù)報(bào)表,還是批量生成數(shù)據(jù),都可能會(huì)遇到需要讀取和操作Excel文件的場(chǎng)景,本文將詳細(xì)介紹如何使用Java中的Apache POI庫(kù)來(lái)讀取Excel文件,需要的朋友可以參考下

項(xiàng)目背景

假設(shè)我們需要開(kāi)發(fā)一個(gè)功能,讀取一個(gè)Excel文件中的數(shù)據(jù)并進(jìn)行處理。通常,這樣的需求會(huì)出現(xiàn)在以下場(chǎng)景中:

  • 數(shù)據(jù)遷移:將Excel表格的數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫(kù)。
  • 數(shù)據(jù)分析:對(duì)Excel中的數(shù)據(jù)進(jìn)行匯總、統(tǒng)計(jì)分析。
  • 批量處理:從Excel文件中讀取配置信息或參數(shù)進(jìn)行批量處理。 在本篇文章中,我們將展示如何使用Java讀取Excel文件,獲取其中的數(shù)據(jù),并展示如何將這些數(shù)據(jù)轉(zhuǎn)化為業(yè)務(wù)對(duì)象以便后續(xù)處理。

依賴導(dǎo)入

首先,你需要在項(xiàng)目中添加Apache POI的依賴。這里使用的是Apache POI 3.x版本,你可以在pom.xml中加入如下依賴:

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

這個(gè)依賴包包括了讀取xlsx格式的支持,如果需要支持更老的xls格式,可以再加上poi模塊。

讀取Excel模板的實(shí)現(xiàn)

接下來(lái),我們來(lái)看一個(gè)簡(jiǎn)單的示例代碼,展示如何讀取Excel文件的內(nèi)容,并對(duì)數(shù)據(jù)進(jìn)行處理。我們將以一個(gè)示例Excel表格為例,假設(shè)表格的內(nèi)容如下:

姓名年齡性別
張三25
李四30
王五28

代碼實(shí)現(xiàn)

import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.stereotype.Service;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * 讀取Excel文件并進(jìn)行數(shù)據(jù)處理的服務(wù)類
 */
@Service
@Slf4j
public class ReadExcelServiceImpl {

    public Boolean readExcel() {
        try {
            String pathStr = "/path/to/your/excel/file.xlsx";
            // excel文件路徑
            FileInputStream fis = new FileInputStream(pathStr);
            // 創(chuàng)建一個(gè)工作簿對(duì)象
            Workbook workbook = new XSSFWorkbook(fis);
            // 獲取第一個(gè)工作表
            Sheet sheet = workbook.getSheetAt(0);
            // 獲取總行數(shù)
            int lastRowNum = sheet.getLastRowNum();
            
            // 存放Excel讀取的數(shù)據(jù)列表
            List<ExcelDemoInfoDTO> demoInfoList = new ArrayList<>();

            // 讀取數(shù)據(jù)。循環(huán)遍歷行,從第二行開(kāi)始,假設(shè)第一行是標(biāo)題行
            for (int i = 1; i <= lastRowNum; i++) {
                log.info("Reading row {}", i);

                Row row = sheet.getRow(i);
                if (row != null) {
                    try {
                        // 獲取單元格的值
                        String cell0 = getCellValue(row.getCell(0)); // 姓名
                        String cell1 = getCellValue(row.getCell(1)); // 年齡
                        String cell2 = getCellValue(row.getCell(2)); // 性別

                        // 創(chuàng)建數(shù)據(jù)對(duì)象并設(shè)置字段
                        ExcelDemoInfoDTO demoInfoDTO = new ExcelDemoInfoDTO();
                        demoInfoDTO.setName(cell0);
                        demoInfoDTO.setAge(Integer.parseInt(cell1));
                        demoInfoDTO.setGender(cell2);

                        // 將數(shù)據(jù)對(duì)象加入到列表
                        demoInfoList.add(demoInfoDTO);

                    } catch (Exception e) {
                        log.error("Error reading row {}", i, e);
                    }
                }
            }

            // 使用Jackson將讀取的數(shù)據(jù)轉(zhuǎn)換為JSON字符串
            ObjectMapper mapper = new ObjectMapper();
            String json = mapper.writeValueAsString(demoInfoList);
            System.out.println(json);

            // 關(guān)閉資源
            workbook.close();
            fis.close();

        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

    /**
     * 獲取單元格的值,處理不同類型的單元格
     *
     * @param cell 單元格對(duì)象
     * @return 單元格的字符串值
     */
    private static String getCellValue(Cell cell) {
        if (cell == null) {
            return "";
        }

        switch (cell.getCellType()) {
            case STRING:
                return cell.getStringCellValue();
            case NUMERIC:
                return String.valueOf((int) cell.getNumericCellValue());
            default:
                return "";
        }
    }
}

代碼解析

  • 打開(kāi)Excel文件 使用FileInputStream打開(kāi)指定路徑的Excel文件,然后通過(guò)XSSFWorkbook將其加載為工作簿(Workbook)。
  • 讀取Excel工作表 通過(guò)workbook.getSheetAt(0)獲取第一個(gè)工作表(Sheet)。你可以根據(jù)需要更改getSheetAt中的索引值來(lái)獲取其他工作表。
  • 遍歷行和列 使用sheet.getRow(i)獲取每一行的數(shù)據(jù)。我們從第二行開(kāi)始讀取(i=1),因?yàn)榈谝恍型ǔJ菢?biāo)題行。
  • 獲取單元格內(nèi)容 通過(guò)row.getCell(i)獲取每一列的內(nèi)容,并使用getCellValue方法根據(jù)單元格的類型(字符串、數(shù)字等)獲取對(duì)應(yīng)的值。
  • 封裝數(shù)據(jù) 將每行的數(shù)據(jù)封裝為一個(gè)業(yè)務(wù)對(duì)象(ExcelDemoInfoDTO),并將其加入到一個(gè)列表中。
  • 轉(zhuǎn)換為JSON格式 使用Jackson庫(kù)將讀取的數(shù)據(jù)轉(zhuǎn)化為JSON格式,以便后續(xù)的處理或傳輸。
  • 資源關(guān)閉 使用完畢后,關(guān)閉workbook和FileInputStream以釋放資源。

ExcelDemoInfoDTO 數(shù)據(jù)傳輸對(duì)象

為了更好地封裝數(shù)據(jù),我們創(chuàng)建一個(gè)簡(jiǎn)單的DTO(數(shù)據(jù)傳輸對(duì)象)類ExcelDemoInfoDTO:

public class ExcelDemoInfoDTO {
    private String name;
    private int age;
    private String gender;

    // Getters and Setters
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }
}

總結(jié)

在本次實(shí)踐中,我們介紹了如何使用Apache POI庫(kù)在Java中讀取Excel文件,獲取其中的數(shù)據(jù),并將這些數(shù)據(jù)封裝為業(yè)務(wù)對(duì)象。通過(guò)這種方式,我們可以靈活地讀取各種格式的Excel數(shù)據(jù),并進(jìn)行后續(xù)的業(yè)務(wù)處理。對(duì)于更復(fù)雜的Excel文件,我們還可以進(jìn)一步擴(kuò)展代碼來(lái)處理更多類型的單元格、跨工作表讀取等情況。

以上就是SpringBoot使用Apache POI庫(kù)讀取Excel文件的操作詳解的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot Apache POI庫(kù)讀取Excel的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • java  設(shè)計(jì)模式之單例模式

    java 設(shè)計(jì)模式之單例模式

    這篇文章主要介紹了java 設(shè)計(jì)模式之單例模式的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • java使用任務(wù)架構(gòu)執(zhí)行任務(wù)調(diào)度示例

    java使用任務(wù)架構(gòu)執(zhí)行任務(wù)調(diào)度示例

    在Java 5.0之前啟動(dòng)一個(gè)任務(wù)是通過(guò)調(diào)用Thread類的start()方法來(lái)實(shí)現(xiàn)的,5.0里提供了一個(gè)新的任務(wù)執(zhí)行架構(gòu)使你可以輕松地調(diào)度和控制任務(wù)的執(zhí)行,并且可以建立一個(gè)類似數(shù)據(jù)庫(kù)連接池的線程池來(lái)執(zhí)行任務(wù),下面看一個(gè)示例
    2014-01-01
  • JAVA監(jiān)控JMX的使用

    JAVA監(jiān)控JMX的使用

    Java Management Extensions(JMX)提供了一種標(biāo)準(zhǔn)化的方法來(lái)管理和監(jiān)控Java應(yīng)用程序,為Java應(yīng)用提供了一種高效、一致的管理方式,本文就來(lái)介紹一下JMX的使用,感興趣的可以了解一下
    2024-10-10
  • Java設(shè)計(jì)模式七大原則之里氏替換原則詳解

    Java設(shè)計(jì)模式七大原則之里氏替換原則詳解

    在面向?qū)ο蟮某绦蛟O(shè)計(jì)中,里氏替換原則(Liskov Substitution principle)是對(duì)子類型的特別定義。本文將為大家詳細(xì)介紹Java設(shè)計(jì)模式七大原則之一的里氏替換原則,需要的可以參考一下
    2022-02-02
  • springboot實(shí)現(xiàn)郵箱發(fā)送(激活碼)功能的示例代碼

    springboot實(shí)現(xiàn)郵箱發(fā)送(激活碼)功能的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用springboot實(shí)現(xiàn)郵箱發(fā)送(激活碼)功能,文中的示例代碼簡(jiǎn)潔易懂,有需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-10-10
  • MyBatis框架迭代器模式實(shí)現(xiàn)原理解析

    MyBatis框架迭代器模式實(shí)現(xiàn)原理解析

    這篇文章主要介紹了MyBatis框架迭代器模式實(shí)現(xiàn)原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Mybatis千萬(wàn)級(jí)數(shù)據(jù)查詢的解決方式,避免OOM問(wèn)題

    Mybatis千萬(wàn)級(jí)數(shù)據(jù)查詢的解決方式,避免OOM問(wèn)題

    這篇文章主要介紹了Mybatis千萬(wàn)級(jí)數(shù)據(jù)查詢的解決方式,避免OOM問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Java中BM(Boyer-Moore)算法的圖解與實(shí)現(xiàn)

    Java中BM(Boyer-Moore)算法的圖解與實(shí)現(xiàn)

    本文主要介紹了兩個(gè)大的部分,第一部分通過(guò)圖解的方式講解BM算法,第二部分則代碼實(shí)現(xiàn)一個(gè)簡(jiǎn)易的BM算法,感興趣的小伙伴可以學(xué)習(xí)一下
    2022-05-05
  • Elasticsearch模糊查詢?cè)敿?xì)介紹

    Elasticsearch模糊查詢?cè)敿?xì)介紹

    這篇文章主要給大家介紹了關(guān)于Elasticsearch模糊查詢的相關(guān)資料,在數(shù)據(jù)庫(kù)查詢中模糊查詢是一種強(qiáng)大的技術(shù),可以用來(lái)搜索與指定模式匹配的數(shù)據(jù),需要的朋友可以參考下
    2023-09-09
  • 基于java下載中g(shù)etContentLength()一直為-1的一些思路

    基于java下載中g(shù)etContentLength()一直為-1的一些思路

    下面小編就為大家?guī)?lái)一篇基于java下載中g(shù)etContentLength()一直為-1的一些思路。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06

最新評(píng)論