java基于poi-ooxml編寫Excel導(dǎo)出的工具類
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導(dǎo)出工具類
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導(dǎo)出工具類
*/
public class ExcelExporter {
/**
* 導(dǎo)出數(shù)據(jù)到Excel文件
* @param dataList 數(shù)據(jù)列表(泛型支持任意對象)
* @param headers 表頭配置,格式:{ {"列名1", "字段名1"}, {"列名2", "字段名2"} }
* @param filePath 導(dǎo)出文件路徑(如:/tmp/data.xlsx)
*/
public static <T> void exportToExcel(List<T> dataList, String[][] headers, String filePath) {
try (Workbook workbook = new XSSFWorkbook()) { // 創(chuàng)建Excel工作簿(xlsx格式)
Sheet sheet = workbook.createSheet("Sheet1"); // 創(chuàng)建Sheet頁
// 1. 創(chuàng)建表頭行
Row headerRow = sheet.createRow(0);
for (int i = 0; i < headers.length; i++) {
Cell cell = headerRow.createCell(i);
cell.setCellValue(headers[i][0]); // 寫入列名
}
// 2. 填充數(shù)據(jù)行
for (int rowIdx = 0; rowIdx < dataList.size(); rowIdx++) {
T data = dataList.get(rowIdx);
Row dataRow = sheet.createRow(rowIdx + 1); // 數(shù)據(jù)從第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. 自動調(diào)整列寬
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導(dǎo)出成功,路徑:" + filePath);
} catch (IOException | ReflectiveOperationException e) {
System.err.println("導(dǎo)出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);
}
/**
* 設(shè)置單元格的值(支持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) {
// 模擬數(shù)據(jù)
List<User> userList = Arrays.asList(
new User("張三", 25, true),
new User("李四", 30, false)
);
// 表頭配置:{ "列顯示名", "實體類字段名" }
String[][] headers = {
{"姓名", "name"},
{"年齡", "age"},
{"是否VIP", "isVip"}
};
// 導(dǎo)出Excel
ExcelExporter.exportToExcel(userList, headers, "users.xlsx");
}
}
3.核心邏輯說明
泛型支持:工具類可導(dǎo)出任意對象列表,通過反射動態(tài)獲取字段值。
表頭靈活配置:通過二維數(shù)組定義表頭顯示名和對應(yīng)字段名。
自動類型處理:支持 String、Number、Boolean 類型字段的自動轉(zhuǎn)換。
資源自動關(guān)閉:使用 try-with-resources 確保流正確關(guān)閉。
列寬自適應(yīng):調(diào)用 autoSizeColumn 使列寬適應(yīng)內(nèi)容。
4.擴展建議
大數(shù)據(jù)量優(yōu)化:若數(shù)據(jù)量超過萬級,建議改用 SXSSFWorkbook(Apache POI流式API)避免內(nèi)存溢出。
樣式定制:可擴展工具類,添加單元格樣式(字體、顏色、邊框等)。
異常細化:根據(jù)業(yè)務(wù)需求增加更詳細的異常處理邏輯。
此實現(xiàn)方案兼顧了簡單性和通用性,適合快速集成到Spring Boot、普通Java項目等場景。
5.HSSF、XSSF、SXSSF
以下是HSSF、XSSF、SXSSF的核心原則和場景建議,幫助你在不同需求下快速決策
< 1萬行:任選 HSSF 或 XSSF。
需要兼容舊版Office(如2003):選 HSSF。
需要現(xiàn)代Excel功能(如更多樣式、公式):選 XSSF。
1萬 ~ 100萬行:必須選 SXSSF(避免內(nèi)存溢出)。
> 100萬行:SXSSF + 分Sheet存儲(單Sheet最多104萬行)。
小數(shù)據(jù)、兼容性優(yōu)先 → HSSF。
中小數(shù)據(jù)、功能豐富 → XSSF。
大數(shù)據(jù)量、內(nèi)存敏感 → SXSSF。
到此這篇關(guān)于java基于poi-ooxml編寫Excel導(dǎo)出的工具類的文章就介紹到這了,更多相關(guān)java導(dǎo)出Excel內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Java反射模擬實現(xiàn)Spring的IoC容器的操作
這篇文章主要介紹了使用Java反射模擬實現(xiàn)Spring的IoC容器的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08
SpringBoot結(jié)合JWT登錄權(quán)限控制的實現(xiàn)
本文主要介紹了SpringBoot結(jié)合JWT登錄權(quán)限控制的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
Intellij IDEA的一些調(diào)試技巧(小結(jié))
本篇文章主要介紹了Intellij IDEA的一些調(diào)試技巧(小結(jié)),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-11-11
Java中this()與super()的用法區(qū)別解析
this()調(diào)用本類構(gòu)造函數(shù)復(fù)用代碼,super()調(diào)用父類構(gòu)造函數(shù)初始化繼承,兩者均需為構(gòu)造函數(shù)首條語句,適用場景分別為代碼復(fù)用和父類初始化,本文給大家介紹Java中this()與super()的用法區(qū)別,感興趣的朋友跟隨小編一起看看吧2025-08-08
Java中的logback標(biāo)記日志過濾器MarkerFilter詳解
這篇文章主要介紹了Java中的logback標(biāo)記日志過濾器MarkerFilter詳解,在logback-classic中存在一個全局過濾器TurboFilter,TurboFilter是與LoggerContext綁定,會在會在其它過濾器之前執(zhí)行,需要的朋友可以參考下2023-11-11
SpringBoot整合MyBatis-Plus3.1教程詳解
這篇文章主要介紹了SpringBoot整合MyBatis-Plus3.1詳細教程,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2019-08-08

