java實現poi-ooxml導出Excel的功能

文章目錄

  • 1. 添加poi-ooxml依賴
  • 2. Excel導出工具類
  • 3.核心邏輯說明
  • 4.擴展建議
  • 5.HSSF、XSSF、SXSSF 的核心原則和場景建議,幫助你在不同需求下快速決策:

以下是一個基于 Apache POI 實現的簡單、通用的Java導出Excel工具類,代碼邏輯清晰且注釋詳細,適合快速集成到項目中

1. 添加poi-ooxml依賴

在 pom.xml 中添加 Apache POI 依賴:

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

2. Excel導出工具類

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.List;/*** Excel導出工具類*/
public class ExcelExporter {/*** 導出數據到Excel文件* @param dataList  數據列表(泛型支持任意對象)* @param headers   表頭配置,格式:{ {"列名1", "字段名1"}, {"列名2", "字段名2"} }* @param filePath  導出文件路徑(如:/tmp/data.xlsx)*/public static <T> void exportToExcel(List<T> dataList, String[][] headers, String filePath) {try (Workbook workbook = new XSSFWorkbook()) { // 創建Excel工作簿(xlsx格式)Sheet sheet = workbook.createSheet("Sheet1"); // 創建Sheet頁// 1. 創建表頭行Row headerRow = sheet.createRow(0);for (int i = 0; i < headers.length; i++) {Cell cell = headerRow.createCell(i);cell.setCellValue(headers[i][0]); // 寫入列名}// 2. 填充數據行for (int rowIdx = 0; rowIdx < dataList.size(); rowIdx++) {T data = dataList.get(rowIdx);Row dataRow = sheet.createRow(rowIdx + 1); // 數據從第2行開始// 通過反射獲取字段值for (int colIdx = 0; colIdx < headers.length; colIdx++) {String fieldName = headers[colIdx][1]; // 獲取字段名Object value = getFieldValue(data, fieldName);Cell cell = dataRow.createCell(colIdx);setCellValue(cell, value); // 寫入單元格值}}// 3. 自動調整列寬for (int i = 0; i < headers.length; i++) {sheet.autoSizeColumn(i);}// 4. 寫入文件try (FileOutputStream fos = new FileOutputStream(filePath)) {workbook.write(fos);}System.out.println("Excel導出成功,路徑:" + filePath);} catch (IOException | ReflectiveOperationException e) {System.err.println("導出Excel失敗:" + e.getMessage());}}/*** 通過反射獲取對象的字段值*/private static <T> Object getFieldValue(T data, String fieldName) throws NoSuchFieldException, IllegalAccessException {Field field = data.getClass().getDeclaredField(fieldName);field.setAccessible(true); // 允許訪問私有字段return field.get(data);}/*** 設置單元格的值(支持String、Number、Boolean類型)*/private static void setCellValue(Cell cell, Object value) {if (value == null) {cell.setCellValue("");} else if (value instanceof Number) {cell.setCellValue(((Number) value).doubleValue());} else if (value instanceof Boolean) {cell.setCellValue((Boolean) value);} else {cell.setCellValue(value.toString());}}
}
import java.util.Arrays;
import java.util.List;public class Main {public static void main(String[] args) {// 模擬數據List<User> userList = Arrays.asList(new User("張三", 25, true),new User("李四", 30, false));// 表頭配置:{ "列顯示名", "實體類字段名" }String[][] headers = {{"姓名", "name"},{"年齡", "age"},{"是否VIP", "isVip"}};// 導出ExcelExcelExporter.exportToExcel(userList, headers, "users.xlsx");}
}

3.核心邏輯說明

泛型支持:工具類可導出任意對象列表,通過反射動態獲取字段值。

表頭靈活配置:通過二維數組定義表頭顯示名和對應字段名。

自動類型處理:支持 String、Number、Boolean 類型字段的自動轉換。

資源自動關閉:使用 try-with-resources 確保流正確關閉。

列寬自適應:調用 autoSizeColumn 使列寬適應內容。

4.擴展建議

大數據量優化:若數據量超過萬級,建議改用 SXSSFWorkbook(Apache POI流式API)避免內存溢出。

樣式定制:可擴展工具類,添加單元格樣式(字體、顏色、邊框等)。

異常細化:根據業務需求增加更詳細的異常處理邏輯。

此實現方案兼顧了簡單性和通用性,適合快速集成到Spring Boot、普通Java項目等場景。

5.HSSF、XSSF、SXSSF 的核心原則和場景建議,幫助你在不同需求下快速決策:

< 1萬行:任選 HSSF 或 XSSF。需要兼容舊版Office(如2003):選 HSSF。需要現代Excel功能(如更多樣式、公式):選 XSSF。1萬 ~ 100萬行:必須選 SXSSF(避免內存溢出)。> 100萬行:SXSSF + 分Sheet存儲(單Sheet最多104萬行)。小數據、兼容性優先 → HSSF。中小數據、功能豐富 → XSSF。大數據量、內存敏感 → SXSSF。

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

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

相關文章

Nginx端口telnet不通排查指南

nginx已經配置server及端口20002&#xff0c;telnet不通&#xff1a;telnet 127.0.0.1 20002 Trying 127.0.0.1... telnet: connect to address 127.0.0.1: Connection refused 一、檢查 systemctl status nginx.service nginx: [emerg] bind() to 0.0.0.0:20002 failed (13…

【RabbitMQ】消息丟失問題排查與解決

RabbitMQ 消息丟失是一個常見的問題&#xff0c;可能發生在消息的生產、傳輸、消費或 Broker 端等多個環節。消息丟失的常見原因及對應的解決方案&#xff1a; 一、消息丟失的常見原因 1. 生產端&#xff08;Producer&#xff09;原因 (1) 消息未持久化 原因&#xff1a;生產…

docker默認存儲遷移

在容器化場景下默認存儲路徑為&#xff08;/var/lib/docker&#xff09;大多數平臺根目錄不支持系統盤擴容&#xff0c;會有空間不足風險隱患&#xff0c;因未配置持久化存儲導致容器數據丟失。以遷移Docker存儲路徑至大容量/data目錄說明 一、停止容器 systemctl stop docke…

【Golang筆記02】函數、方法、泛型、接口學習筆記

Golang筆記02&#xff1a;函數、方法、泛型、接口學習筆記 一、進階學習 1.1、函數 go中的函數使用func關鍵字進行定義&#xff0c;go程序的入口函數叫做&#xff1a;main&#xff0c;并且必須是屬于main包里面。 1.1.1、定義函數 &#xff08;1&#xff09;普通函數 go中…

LLM筆記(九)KV緩存調研

KV 緩存 (Key-Value Cache) 技術詳解 KV 緩存&#xff08;Key-Value Cache&#xff09;是在 Transformer 模型&#xff08;尤其是 Decoder-Only 架構或 Encoder-Decoder 架構的 Decoder 部分&#xff09;進行自回歸 (auto-regressive) 推理生成序列時&#xff0c;一種至關重要…

【Boost搜索引擎】構建Boost站內搜索引擎實踐

目錄 1. 搜索引擎的相關宏觀原理 2. 正排索引 vs 倒排索引 - 搜索引擎具體原理 3. 編寫數據去標簽與數據清洗的模塊 Parser 去標簽 編寫parser 用boost枚舉文件名 解析html 提取title ?編輯 去標簽 構建URL 將解析內容寫入文件中 4. 編寫建立索引的模塊 Index 建…

LeetCode 熱題 100 1.兩數之和

目錄 題目&#xff1a; 題目描述&#xff1a; 題目鏈接&#xff1a; 思路&#xff1a; 思路一暴力遍歷&#xff1a; 代碼&#xff1a; 暴力遍歷Java代碼&#xff1a; 題目&#xff1a; 題目描述&#xff1a; 題目鏈接&#xff1a; 1. 兩數之和 - 力扣&#xff08;LeetC…

基于LSTM-GARCH混合模型的黃金價格波動率預測:信用降級事件沖擊評估

摘要&#xff1a;本文構建多維度量化分析框架&#xff0c;對近期黃金市場波動進行技術解構。通過主權信用評級調整、地緣風險及宏觀經濟數據等公開信息源&#xff0c;運用統計學習模型解析市場驅動因素&#xff0c;避免主觀預判。文中所有技術分析均基于歷史數據回測&#xff0…

分布式與集群:概念、區別與協同

分布式與集群:概念、區別與協同 在分布式系統與云計算領域,分布式(Distributed)和集群(Cluster)是兩個高頻出現的核心概念。它們常被混淆,但本質上屬于不同維度的設計思想。本文將從定義、分類、實際應用及協同關系四個層面,結合 Dubbo、Git、Hadoop 等典型案例,系統…

Prometheus實戰教程:k8s平臺-Mysql監控案例

配置文件優化后的 Prometheus 自動發現 MySQL 實例的完整 YAML 文件。該配置包括&#xff1a; MySQL Exporter 部署&#xff1a;使用 ConfigMap 提供 MySQL 連接信息。Prometheus 自動發現&#xff1a;通過 Kubernetes 服務發現自動抓取 MySQL 實例。 1、mysql 配置文件 &…

基于區塊鏈技術的智能汽車診斷與性能分析

我是穿拖鞋的漢子&#xff0c;魔都中堅持長期主義的汽車電子工程師。 老規矩&#xff0c;分享一段喜歡的文字&#xff0c;避免自己成為高知識低文化的工程師&#xff1a; 鈍感力的“鈍”&#xff0c;不是木訥、遲鈍&#xff0c;而是直面困境的韌勁和耐力&#xff0c;是面對外界…

文字溢出省略號顯示

一、 單行文字溢出、省略號顯示 二、 多行文字溢出&#xff0c;省略號顯示 有較大的兼容性問題&#xff0c;適用于Webkit為內核的瀏覽器軟件&#xff0c;或者移動端的&#xff08;大部分也是webkit&#xff09; 此效果建議后端人員開發 三、圖片底側空白縫隙的修復技巧&#…

JavaScript 中使用 Elasticsearch 的正確方式,第一部分

作者&#xff1a;來自 Elastic Jeffrey Rengifo 講解如何用 JavaScript 創建一個可用于生產環境的 Elasticsearch 后端。 想獲得 Elastic 認證&#xff1f;看看下一期 Elasticsearch 工程師培訓什么時候開始吧&#xff01; Elasticsearch 擁有大量新功能&#xff0c;能幫助你…

RAG-MCP:突破大模型工具調用瓶頸,告別Prompt膨脹

大語言模型&#xff08;LLM&#xff09;的浪潮正席卷全球&#xff0c;其強大的自然語言理解、生成和推理能力&#xff0c;為各行各業帶來了前所未有的機遇。然而&#xff0c;正如我們在之前的探討中多次提及&#xff0c;LLM并非萬能。它們受限于訓練數據的時效性和范圍&#xf…

鴻蒙OSUniApp制作一個小巧的圖片瀏覽器#三方框架 #Uniapp

利用UniApp制作一個小巧的圖片瀏覽器 最近接了個需求&#xff0c;要求做一個輕量級的圖片瀏覽工具&#xff0c;考慮到多端適配的問題&#xff0c;果斷選擇了UniApp作為開發框架。本文記錄了我從0到1的開發過程&#xff0c;希望能給有類似需求的小伙伴一些參考。 前言 移動互聯…

Python爬蟲實戰:獲取taobao網最新rtx5060ti顯卡銷量數據并分析,為消費者做參考

一、系統定義與技術架構 1.1 系統定義 本系統是基于 Python 開發的電商數據采集與分析工具,旨在通過模擬用戶行為實現淘寶平臺 50 系列顯卡(以 RTX 5060 Ti 為例)銷售數據的自動化獲取、清洗、分析及可視化。核心功能包括: 自動登錄:通過 Selenium 模擬瀏覽器操作完成賬…

OCframework編譯Swift

建一個OC的framework&#xff1a; 需要對外暴露的OC文件&#xff0c;需要放到OC的.h文件中 framework中&#xff0c;OC類&#xff0c;調用framework中的Swift類&#xff1a; #import "WowAudioFocus/WowAudioFocus-Swift.h" //02 #import "{工程名}/{工程…

每日算法 -【Swift 算法】Two Sum 問題:從暴力解法到最優解法的演進

【Swift 算法】Two Sum 問題&#xff1a;從暴力解法到最優解法的演進 本文通過“Two Sum”問題&#xff0c;帶你了解如何從最直觀的暴力解法&#xff0c;逐步優化到高效的哈希表解法&#xff0c;并對兩者進行對比&#xff0c;適合算法入門和面試準備。 &#x1f4a1; 問題描述 …

【保姆級】Nginx簡介以及安裝

Nginx簡介 ? Nginx是一個高性能的HTTP和反向代理web服務器&#xff0c;同時也提供了IMAP/POP3/SMTP服務。Nginx是由伊戈爾賽索耶夫為俄羅斯訪問量第二的Rambler.ru站點&#xff08;俄文&#xff1a;Рамблер&#xff09;開發的&#xff0c;第一個公開版本0.1.0發布于20…

C++(25): 標準庫 <deque>

目錄 1、 核心概念 2. 基本語法 3. 特點 4. 特有成員函數 5. 內存與性能 6. 示例代碼 7. 成員函數列表 8. 使用場景 9. 注意事項 1、 核心概念 雙端隊列(Double-Ended Queue,deque) 是一種允許在隊列頭部和尾部高效插入和刪除元素的線性數據結構,同時支持隨機訪問。…