SpringBoot整合POI實現Excel文件的導出與導入

使用 Apache POI 操作 Excel文件,系列文章:

《SpringBoot整合POI實現Excel文件的導出與導入》 

《SpringMVC實現文件的上傳與下載》

《C#使用NPOI導出Excel文件》

《NPOI使用手冊》

1、Apache POI 的介紹

Apache POI 是一個基于 Java 的開源庫,專為讀寫 Microsoft Office 格式文件(如 Excel、Word、PowerPoint、Visio 等)而設計,支持 Office 97-2016 版本的文件操作?。其名稱源于“Poor Obfuscation Implementation”(簡潔版的模糊實現)的首字母縮寫?。Apache POI 功能全面,覆蓋 Office 文件的全生命周期操作。?社區活躍,文檔豐富,適用于復雜場景(如:模板替換、動態生成報表)?。

?多格式支持?:

  • Excel?:通過 HSSF(.xls 格式)和 XSSF(.xlsx 格式)模塊實現讀寫?。
  • Word?:通過 HWPF(.doc 格式)和 XWPF(.docx 格式)模塊處理文檔?。
  • PowerPoint?:支持 .ppt 和 .pptx 文件的創建與修改?。

應用場景?:

  • ?企業級開發?:生成復雜 Excel 報表、自動化數據導入導出?。
  • ?模板化文檔處理?:通過占位符替換動態填充 Word 模板內容?。
  • 跨平臺兼容需求?:在非 Windows 系統中實現 Office 文件的讀寫與轉換?。 

Apache POI 中文教程:《Apache POI中文教程》

2、Apache POI 的接口

POI 將一個 Excel 文件劃分為如下圖所示的幾個部分,每一個部分都對應一個 POI 接口。其中, Workbook 表示整個 Excel 文件,Sheet 表示 Excel 文件中的分頁,Row 表示 Excel 文件中某一頁的一行,Cell 表示 Excel 文件中某一頁的一個具體的單元格。當讀取 Excel 文件中每一個單元格的數據需要按照“Workbook > Sheet > Row > Cell”順序創建對應 POI 接口的對象。

2.1 創建 Workbook 對象

創建 Workbook 對象有如下兩種方式,這兩種方式都需要使用 WorkbookFactory 工廠類的 create() 方法。

(1)根據 File 對象創建 Workbook 對象。

File file = new File("D:\\demo.xlsx");
Workbook workbook = WorkbookFactory.create(file);

(2)從字節輸入流中創建 Workbook 對象。

InputStream is = new FileInputStream("D:\\demo.xlsx");
Workbook workbook = WorkbookFactory.create(is);

2.2 創建 Sheet 對象

在獲取 Workbook 對象后,就可以創建 Sheet 對象。

Sheet sheet = workbook.getSheetAt(0);

getSheetAt() 方法 中的參數為分頁的索引。其中,第一個分頁的索引為 0。

2.3 創建 Row 對象

在獲取 Sheet 對象后,就可以創建 Row 對象。

Row row = sheet.getRow(0);

getCell() 方法中的參數為列索引。其中,第一列的索引為 0。

2.4 創建 Cell 對象

在獲取 Row 對象后,就可以創建 Cell 對象。

Cell cell = row.getCell(0);

getRow() 方法中的參數為行索引。其中,第一行的索引為 0。

2.5 獲取單元格數據

在獲取 Cell 對象后,也就獲取了單元格中的具體數據。Excel 文件的單元格可以支持不同的數據類型,這些數據類型在 POI 中采用如下的 CellType 枚舉:

CellType.NUMERIC:數字
CellType.STRING:字符串
CellType.FORMULA:公式
CellType.BLANK:空內容
CellType.BOOLEAN:布爾值
CellType.ERROR:錯誤單元格

程序開發人員可以調用 Cell 對象的 getCellType() 方法判斷單元格的數據類型:

if (cell.getCellType() == CellType.NUMERIC) {// 數字格式,需要轉換
}

返回單元格不同類型的方法:

boolean bool = cell.getBooleanCellValue(); //返回布爾值
java.util.Date date = cell.getDateCellValue(); //返回日期對象
double number = cell.getNumericCellValue(); //返回數字
String str = cell.getStringCellValue();//返回文本數據
String formula = cell.getCellFormula(); //返回公式字符串
RichTextString richText = cell.getRichStringCellValue(); //返回富文本

可以將其封裝成一個公共方法:

/*** 解析Excel數據類型,返回單元格的值*/
private Object getCellValue(Cell cell)
{//1.獲取到單元格的屬性類型CellType cellType = cell.getCellType();//2.根據單元格數據類型獲取數據Object value = null;switch (cellType){case STRING:value = cell.getStringCellValue();

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/77141.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/77141.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/77141.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

構建用戶友好的記賬體驗 - LedgerX交互設計與性能優化實踐

構建用戶友好的記賬體驗 - LedgerX交互設計與性能優化實踐 發布日期: 2025-04-16 引言 在財務管理應用領域,技術實力固然重要,但最終決定用戶留存的往往是日常使用體驗。本文作為LedgerX技術博客的第二篇,將深入探討我們如何通過精心的交互…

如何用AI輔助軟件產品原型設計及工具推薦

以下是針對軟件產品原型設計的 AI輔助工具推薦,涵蓋國內外主流工具,結合功能特點、優劣勢及適用場景分析,并標注是否為國內軟件及付費情況: 一、國內工具推薦 1. 墨刀AI(MockingBot AI) 特點:…

MySQL的MVCC機制詳解

1. 什么是MVCC? MVCC(Multi-Version Concurrency Control,多版本并發控制)是數據庫系統中用于實現并發控制的一種技術。它通過保存數據在某個時間點的快照來實現,使得在同一個數據行上可以同時存在多個版本&#xff0…

C語言數字圖像處理---2.31統計濾波器

本文介紹空域濾波器中的一種:統計濾波器 [定義與算法] 統計濾波(Statistic Filter)定義:基于圖像處理中的鄰域統計方法,對鄰域內的像素信息進行統計,如基于均值和方差的信息,用于平滑或去噪圖像,同時保留邊緣信息。 算法步驟如下: 統計濾波器的優點和缺點主要包…

計算機視覺相機模型與標定:如何讓計算機“看懂”三維世界?

計算機視覺相機模型與標定:如何讓計算機“看懂”三維世界? 一、前言二、相機模型基礎?2.1 針孔相機模型?2.1.1 模型原理?2.1.2 代碼示例?2.2 透視變換與相機內參?2.2.1 透視變換矩陣?2.2.2 內參矩陣的作用?2.3 相機外參?2.3.1 世界坐標系與相機坐標系的轉換?2.3.2 外…

DeepSpeed ZeRO++:降低4倍網絡通信,顯著提高大模型及類ChatGPT模型訓練效率

圖1: DeepSpeed ZeRO 簡介 大型 AI 模型正在改變數字世界。基于大型語言模型 (LLM)的 Turing-NLG、ChatGPT 和 GPT-4 等生成語言模型用途廣泛,能夠執行摘要、代碼生成和翻譯等任務。 同樣,DALLE、Microsoft Designer 和 Bing Image Creator 等大型多模…

Seq2Seq - 編碼器(Encoder)和解碼器(Decoder)

本節實現一個簡單的 Seq2Seq(Sequence to Sequence)模型 的編碼器(Encoder)和解碼器(Decoder)部分。 重點把握Seq2Seq 模型的整體工作流程 理解編碼器(Encoder)和解碼器&#xff08…

Spring Boot集成MinIO的詳細步驟

1. 安裝MinIO 使用Docker部署MinIO 拉取MinIO鏡像: docker pull minio/minio 這將從Docker Hub中獲取最新的MinIO鏡像。 創建目錄: mkdir -p /home/minio/config mkdir -p /home/minio/data 這些目錄將用于持久化MinIO的數據和配置文件 創建MinIO…

基于PLC的停車場車位控制系統的設計

2.1 設計目標 本課題為基于PLC的停車場車位控制系統來設計,在此將功能確定如下: 針對8個車位的停車場進行設計將停車場分為入口處,車位處、以及出口處三個部分;每個車位都有指示燈指示當前位置是否空閑,方便司機查找空…

微服務即時通信系統---(四)框架學習

目錄 ElasticSearch 介紹 安裝 安裝kibana ES客戶端安裝 頭文件包含和編譯時鏈接庫 ES核心概念 索引(Index) 類型(Type) 字段(Field) 映射(mapping) 文檔(document) ES對比MySQL Kibana訪問ES測試 創建索引庫 新增數據 查看并搜索數據 刪除索引 ES…

除了 `task_type=“SEQ_CLS“`(序列分類),還有CAUSAL_LM,QUESTION_ANS

task_type="SEQ_CLS"是什么意思:QUESTION_ANS 我是qwen,不同模型是不一樣的 SEQ_CLS, SEQ_2_SEQ_LM, CAUSAL_LM, TOKEN_CLS, QUESTION_ANS, FEATURE_EXTRACTION. task_type="SEQ_CLS" 通常用于自然語言處理(NLP)任務中,SEQ_CLS 是 Sequence Classif…

Android ViewPager使用預加載機制導致出現頁面穿透問題

? 緣由 在應用中使用ViewPager,并且設置預加載頁面。結果出現了一些異常的現象。 我們有4個頁面,分別是4個Fragment,暫且稱為FragmentA、FragmentB、FragmentC、FragmentD,ViewPager在MainActivity中,切換時&#x…

apt3.0和apt2.0的區別

一,簡單區別 更新方式 apt2.0:一次性更新所有內容,沒有分階段更新功能。apt3.0:引入分階段更新功能,可分批推送更新包。 界面顯示 apt2.0:界面簡單,輸出信息較為雜亂,沒有彩色高亮和…

過電壓保護器與傳統的保護方式對比

過電壓保護器主要用于保護電氣設備免受大氣過電壓(如雷擊)和操作過電壓(開關動作等引發)的侵害。它通常由非線性電阻片等元件組成,利用其獨特的伏安特性工作。正常電壓下,保護器呈現高阻態,幾乎…

機器學習(3)——決策樹

文章目錄 1. 決策樹基本原理1.1. 什么是決策樹?1.2. 決策樹的基本構成:1.3. 核心思想 2. 決策樹的構建過程2.1. 特征選擇2.1.1. 信息增益(ID3)2.1.2. 基尼不純度(CART)2.1.3. 均方誤差(MSE&…

充電樁領域垂直行業大模型分布式推理與訓練平臺建設方案 - 慧知開源充電樁平臺

沒有任何廣告! 充電樁領域垂直行業大模型分布式推理與訓練平臺建設方案 一、平臺定位與核心價值 行業首個垂直化AI平臺 專為充電樁運營場景設計的分布式大模型訓練與推理基礎設施,實現"算力-算法-場景"三位一體閉環管理。 核心價值主張&am…

NLP高頻面試題(四十五)——PPO 算法在 RLHF 中的原理與實現詳解

近端策略優化(Proximal Policy Optimization, PPO)算法是強化學習領域的一種新穎且高效的策略優化方法,在近年大規模語言模型的人類反饋強化學習(Reinforcement Learning with Human Feedback, RLHF)中發揮了關鍵作用。本文將以學術嚴謹的風格,詳細闡述 PPO 算法的原理及…

C++指針和引用之區別(The Difference between C++Pointers and References)

面試題:C指針和引用有什么區 C指針和引用有什么區別? 在 C 中,指針和引用都是用來訪問其他變量的值的方式,但它們之間存在一些重要的區別。了解這些區別有助于更好地理解和使用這兩種工具。 01 指針 指針(Pointer…

LWIP學習筆記

TCP/ip協議結構分層 傳輸層簡記 TCP:可靠性強,有重傳機制 UDP:單傳機制,不可靠 UDP在ip層分片 TCP在傳輸層分包 應用層傳輸層網絡層,構成LWIP內核程序: 鏈路層;由mac內核STM芯片的片上外設…

【經驗記錄貼】活用shell,提高工作效率

背景 最近在做測試的時候,需要手動kill服務的進程,然后通過命令重啟服務,再進行測試。每次重啟都會涉及到下面三個命令的執行: 1)檢索進程ID $ ps -eLf | grep programname root 1123 112 1234 0 0 0 0:00…