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

使用Apache?POI和SpringBoot實(shí)現(xiàn)Excel文件上傳和解析功能

 更新時(shí)間:2025年01月08日 08:52:58   作者:Kwan的解憂雜貨鋪  
在現(xiàn)代企業(yè)應(yīng)用開發(fā)中,數(shù)據(jù)的導(dǎo)入和導(dǎo)出是一項(xiàng)常見且重要的功能需求,Excel?作為一種廣泛使用的電子表格工具,常常被用來存儲(chǔ)和展示數(shù)據(jù),下面我們來看看如何使用Apache?POI和SpringBoot實(shí)現(xiàn)Excel文件上傳和解析功能吧

在現(xiàn)代企業(yè)應(yīng)用開發(fā)中,數(shù)據(jù)的導(dǎo)入和導(dǎo)出是一項(xiàng)常見且重要的功能需求。Excel 作為一種廣泛使用的電子表格工具,因其直觀、易用的特性,常常被用來存儲(chǔ)和展示數(shù)據(jù)。因此,實(shí)現(xiàn) Excel 文件的上傳和解析功能,能夠方便地將外部數(shù)據(jù)導(dǎo)入到系統(tǒng)中,對(duì)于提高工作效率、實(shí)現(xiàn)數(shù)據(jù)共享具有重要意義。

一、技術(shù)選型與環(huán)境搭建

Apache POI 庫簡介

Apache POI 是一個(gè)開源的 Java 庫,用于處理 Microsoft Office 文檔。它提供了對(duì) Excel 文件的讀寫支持,能夠處理 Excel 97-2003(.xls)和 Excel 2007+(.xlsx)兩種格式。POI 通過提供豐富的 API,使得開發(fā)者能夠方便地操作 Excel 文件中的單元格、行、列、工作表等元素,實(shí)現(xiàn)數(shù)據(jù)的讀取、寫入、格式化等功能。

Spring Boot 框架簡介

Spring Boot 是一個(gè)基于 Spring 框架的項(xiàng)目,旨在簡化 Spring 應(yīng)用的開發(fā)過程。它通過提供一系列的“Starters”依賴管理和自動(dòng)配置功能,使得開發(fā)者能夠快速搭建起一個(gè) Spring 應(yīng)用。Spring Boot 還內(nèi)置了 Tomcat 容器,無需部署 WAR 包,可以直接運(yùn)行 Spring 應(yīng)用,極大地簡化了部署流程。此外,Spring Boot 還支持 RESTful API 的開發(fā),通過注解的方式能夠輕松實(shí)現(xiàn)數(shù)據(jù)的接收和響應(yīng)。

環(huán)境搭建

開發(fā)工具:推薦使用 IntelliJ IDEA 或 Eclipse 等主流的 Java 開發(fā)工具,它們提供了豐富的插件支持和便捷的代碼提示功能,有助于提高開發(fā)效率。

JDK 版本:需要安裝 JDK 1.8 或更高版本,因?yàn)?Spring Boot 和 Apache POI 都依賴于 Java 8 及以上版本的新特性。

依賴管理:使用 Maven 或 Gradle 作為項(xiàng)目的依賴管理工具。在項(xiàng)目的pom.xml文件中引入 Apache POI 和 Spring Boot 相關(guān)的依賴。

<!-- Apache POI依賴 -->
<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>
<!-- Spring Boot Web依賴 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>2.7.5</version>
</dependency>
<!-- Spring Boot文件上傳依賴 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
    <version>2.7.5</version>
</dependency>

項(xiàng)目結(jié)構(gòu):創(chuàng)建一個(gè) Spring Boot 項(xiàng)目,并在項(xiàng)目中創(chuàng)建相應(yīng)的包結(jié)構(gòu),如controller、service、model等,用于存放控制器、服務(wù)層代碼和數(shù)據(jù)模型等。

二、Excel 文件上傳接口實(shí)現(xiàn)

創(chuàng)建控制器

在 Spring Boot 項(xiàng)目中創(chuàng)建一個(gè)控制器類ExcelController,用于處理 Excel 文件的上傳請(qǐng)求。使用@RestController注解來定義控制器,表示該控制器中的所有方法都會(huì)返回 JSON 格式的數(shù)據(jù)。

@RestController
public class ExcelController {
    // 文件上傳接口
    @PostMapping("/upload")
    public Result upload(@RequestParam("file") MultipartFile file) {
        // 文件上傳處理邏輯
    }
}

在upload方法中,使用@PostMapping注解來指定請(qǐng)求的 URL 路徑為/upload,并使用@RequestParam注解來接收前端上傳的文件。MultipartFile是 Spring 提供的一個(gè)接口,用于表示上傳的文件。

文件讀取與解析

在upload方法中,首先獲取上傳文件的輸入流,然后使用 Apache POI 庫來讀取和解析 Excel 文件。

try (InputStream inputStream = file.getInputStream()) {
    Workbook workbook = WorkbookFactory.create(inputStream); // 使用WorkbookFactory來自動(dòng)處理不同格式的Excel文件
    Sheet sheet = workbook.getSheetAt(0); // 獲取第一個(gè)工作表
    // 解析Excel數(shù)據(jù)的邏輯
}

WorkbookFactory.create(inputStream)方法會(huì)根據(jù)輸入流中的文件格式自動(dòng)創(chuàng)建相應(yīng)的Workbook對(duì)象,無論是.xls還是.xlsx格式的 Excel 文件都能被正確處理。workbook.getSheetAt(0)方法用于獲取 Excel 文件中的第一個(gè)工作表。

數(shù)據(jù)解析與存儲(chǔ)

在獲取到工作表后,可以遍歷工作表中的每一行和每一列,將數(shù)據(jù)解析出來并存儲(chǔ)到合適的數(shù)據(jù)結(jié)構(gòu)中。通常情況下,第一行是列名,從第二行開始是實(shí)際的數(shù)據(jù)。

List<Map<String, String>> data = new ArrayList<>();
Row headerRow = sheet.getRow(0); // 獲取第一行作為列名
String[] headers = new String[3];
for (int i = 0; i < 3; i++) {
    headers[i] = headerRow.getCell(i).getStringCellValue();
}
for (int i = 1; i <= sheet.getLastRowNum(); i++) {
    Row row = sheet.getRow(i);
    Map<String, String> rowData = new HashMap<>();
    for (int j = 0; j < 3; j++) {
        Cell cell = row.getCell(j);
        String cellValue = "";
        if (cell != null) {
            switch (cell.getCellType()) {
                case STRING:
                    cellValue = cell.getStringCellValue();
                    break;
                case NUMERIC:
                    if (DateUtil.isCellDateFormatted(cell)) {
                        cellValue = cell.getDateCellValue().toString();
                    } else {
                        cellValue = String.format("%.0f", cell.getNumericCellValue());
                    }
                    break;
                case BOOLEAN:
                    cellValue = String.valueOf(cell.getBooleanCellValue());
                    break;
                case FORMULA:
                    cellValue = cell.getCellFormula();
                    break;
                default:
                    cellValue = "";
            }
        }
        rowData.put(headers[j], cellValue);
    }
    data.add(rowData);
}

在上述代碼中,首先讀取第一行的列名,并存儲(chǔ)到headers數(shù)組中。然后從第二行開始遍歷每一行的數(shù)據(jù),對(duì)于每個(gè)單元格,根據(jù)其類型(字符串、數(shù)值、日期、布爾值、公式等)進(jìn)行相應(yīng)的處理,并將解析出的數(shù)據(jù)存儲(chǔ)到rowData這個(gè)Map中,其中鍵為列名,值為單元格的值。最后將每一行的數(shù)據(jù)rowData添加到data這個(gè)列表中。

數(shù)據(jù)處理與響應(yīng)

在解析完 Excel 文件中的數(shù)據(jù)后,可以根據(jù)實(shí)際需求對(duì)數(shù)據(jù)進(jìn)行進(jìn)一步的處理,例如存儲(chǔ)到數(shù)據(jù)庫中。在本示例中,僅簡單地將解析出的數(shù)據(jù)打印到控制臺(tái),并返回一個(gè)結(jié)果對(duì)象表示操作是否成功。

System.out.println("讀取到的數(shù)據(jù): " + data);
return Result.ok("導(dǎo)入excel完成");

如果在處理過程中發(fā)生異常,則捕獲異常并返回錯(cuò)誤結(jié)果。

} catch (Exception e) {
    e.printStackTrace();
    return Result.error("導(dǎo)入excel失敗");
}

三、前端頁面實(shí)現(xiàn)

創(chuàng)建 HTML 頁面

在 Spring Boot 項(xiàng)目的src/main/resources/static目錄下創(chuàng)建一個(gè) HTML 頁面,用于實(shí)現(xiàn)文件上傳的功能。

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Excel文件上傳</title>
  </head>
  <body>
    <h1>Excel文件上傳</h1>
    <form id="uploadForm" enctype="multipart/form-data">
      <input type="file" id="file" name="file" accept=".xls,.xlsx" />
      <button type="button" onclick="uploadFile()">上傳</button>
    </form>
    <script>
      function uploadFile() {
        var formData = new FormData(document.getElementById("uploadForm"));
        fetch("/upload", {
          method: "POST",
          body: formData,
        })
          .then((response) => response.json())
          .then((data) => {
            if (data.status === "ok") {
              alert("文件上傳成功!");
            } else {
              alert("文件上傳失?。? + data.message);
            }
          })
          .catch((error) => {
            console.error("上傳失敗:", error);
          });
      }
    </script>
  </body>
</html>

在 HTML 頁面中,創(chuàng)建一個(gè)表單uploadForm,其中包含一個(gè)文件輸入框file和一個(gè)上傳按鈕。文件輸入框的accept屬性設(shè)置為.xls,.xlsx,表示只允許選擇 Excel 文件。點(diǎn)擊上傳按鈕時(shí),會(huì)調(diào)用uploadFile函數(shù),該函數(shù)使用 JavaScript 的FormData對(duì)象來構(gòu)建表單數(shù)據(jù),并通過fetch API 發(fā)送 POST 請(qǐng)求到后端的/upload接口。

以上就是使用Apache POI和SpringBoot實(shí)現(xiàn)Excel文件上傳和解析功能的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot Apache POI上傳和解析Excel的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • idea插件篇之java內(nèi)存分析工具(JProfiler)的使用

    idea插件篇之java內(nèi)存分析工具(JProfiler)的使用

    這篇文章主要介紹了idea插件篇之java內(nèi)存分析工具(JProfiler),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Java如何將若干時(shí)間區(qū)間進(jìn)行合并的方法步驟

    Java如何將若干時(shí)間區(qū)間進(jìn)行合并的方法步驟

    這篇文章主要介紹了Java如何將若干時(shí)間區(qū)間進(jìn)行合并的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • Java面試題沖刺第二十二天-- Nginx

    Java面試題沖刺第二十二天-- Nginx

    這篇文章主要為大家分享了最有價(jià)值的三道關(guān)于Nginx的面試題,涵蓋內(nèi)容全面,包括數(shù)據(jù)結(jié)構(gòu)和算法相關(guān)的題目、經(jīng)典面試編程題等,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Java文件管理操作的知識(shí)點(diǎn)整理

    Java文件管理操作的知識(shí)點(diǎn)整理

    這篇文章主要為大家詳細(xì)介紹了Java中文件管理操作的一些知識(shí)點(diǎn)和實(shí)現(xiàn)方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下
    2022-09-09
  • 輕松掌握java組合模式

    輕松掌握java組合模式

    這篇文章主要幫助大家輕松掌握java組合模式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • java 重載(overload)與重寫(override)詳解及實(shí)例

    java 重載(overload)與重寫(override)詳解及實(shí)例

    這篇文章主要介紹了java 重載(overload)與重寫(override)詳解及實(shí)例的相關(guān)資料,并附實(shí)例代碼,需要的朋友可以參考下
    2016-10-10
  • Java?AQS?線程安全同步隊(duì)列的實(shí)現(xiàn)

    Java?AQS?線程安全同步隊(duì)列的實(shí)現(xiàn)

    AQS 同步隊(duì)列是很多的 Java 線程安全對(duì)象的實(shí)現(xiàn),例如 ReentrantLock, Semaphore, CountDownLatch, ReentrantReadWriteLock 等等,本文就介紹了Java?AQS?線程安全同步隊(duì)列的實(shí)現(xiàn),感興趣的可以了解一下
    2023-08-08
  • java中for循環(huán)執(zhí)行的順序圖文詳析

    java中for循環(huán)執(zhí)行的順序圖文詳析

    關(guān)于java的for循環(huán)想必大家非常熟悉,它是java常用的語句之一,這篇文章主要給大家介紹了關(guān)于java中for循環(huán)執(zhí)行順序的相關(guān)資料,需要的朋友可以參考下
    2021-06-06
  • 詳解快速排序算法中的區(qū)間劃分法及Java實(shí)現(xiàn)示例

    詳解快速排序算法中的區(qū)間劃分法及Java實(shí)現(xiàn)示例

    這篇文章主要介紹了詳解快速排序算法中的區(qū)間劃分法及Java實(shí)現(xiàn)示例,文中分別介紹了快排時(shí)兩種區(qū)間劃分的思路,需要的朋友可以參考下
    2016-04-04
  • java線程池:獲取運(yùn)行線程數(shù)并控制線程啟動(dòng)速度的方法

    java線程池:獲取運(yùn)行線程數(shù)并控制線程啟動(dòng)速度的方法

    下面小編就為大家?guī)硪黄猨ava線程池:獲取運(yùn)行線程數(shù)并控制線程啟動(dòng)速度的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-05-05

最新評(píng)論