java基于poi-ooxml編寫(xiě)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ù)列表(泛型支持任意對(duì)象)
* @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頁(yè)
// 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]); // 寫(xiě)入列名
}
// 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行開(kāi)始
// 通過(guò)反射獲取字段值
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); // 寫(xiě)入單元格值
}
}
// 3. 自動(dòng)調(diào)整列寬
for (int i = 0; i < headers.length; i++) {
sheet.autoSizeColumn(i);
}
// 4. 寫(xiě)入文件
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());
}
}
/**
* 通過(guò)反射獲取對(duì)象的字段值
*/
private static <T> Object getFieldValue(T data, String fieldName)
throws NoSuchFieldException, IllegalAccessException {
Field field = data.getClass().getDeclaredField(fieldName);
field.setAccessible(true); // 允許訪問(wèn)私有字段
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)
);
// 表頭配置:{ "列顯示名", "實(shí)體類字段名" }
String[][] headers = {
{"姓名", "name"},
{"年齡", "age"},
{"是否VIP", "isVip"}
};
// 導(dǎo)出Excel
ExcelExporter.exportToExcel(userList, headers, "users.xlsx");
}
}
3.核心邏輯說(shuō)明
泛型支持:工具類可導(dǎo)出任意對(duì)象列表,通過(guò)反射動(dòng)態(tài)獲取字段值。
表頭靈活配置:通過(guò)二維數(shù)組定義表頭顯示名和對(duì)應(yīng)字段名。
自動(dòng)類型處理:支持 String、Number、Boolean 類型字段的自動(dòng)轉(zhuǎn)換。
資源自動(dòng)關(guān)閉:使用 try-with-resources 確保流正確關(guān)閉。
列寬自適應(yīng):調(diào)用 autoSizeColumn 使列寬適應(yīng)內(nèi)容。
4.擴(kuò)展建議
大數(shù)據(jù)量?jī)?yōu)化:若數(shù)據(jù)量超過(guò)萬(wàn)級(jí),建議改用 SXSSFWorkbook(Apache POI流式API)避免內(nèi)存溢出。
樣式定制:可擴(kuò)展工具類,添加單元格樣式(字體、顏色、邊框等)。
異常細(xì)化:根據(jù)業(yè)務(wù)需求增加更詳細(xì)的異常處理邏輯。
此實(shí)現(xiàn)方案兼顧了簡(jiǎn)單性和通用性,適合快速集成到Spring Boot、普通Java項(xiàng)目等場(chǎng)景。
5.HSSF、XSSF、SXSSF
以下是HSSF、XSSF、SXSSF的核心原則和場(chǎng)景建議,幫助你在不同需求下快速?zèng)Q策
< 1萬(wàn)行:任選 HSSF 或 XSSF。
需要兼容舊版Office(如2003):選 HSSF。
需要現(xiàn)代Excel功能(如更多樣式、公式):選 XSSF。
1萬(wàn) ~ 100萬(wàn)行:必須選 SXSSF(避免內(nèi)存溢出)。
> 100萬(wàn)行:SXSSF + 分Sheet存儲(chǔ)(單Sheet最多104萬(wàn)行)。
小數(shù)據(jù)、兼容性優(yōu)先 → HSSF。
中小數(shù)據(jù)、功能豐富 → XSSF。
大數(shù)據(jù)量、內(nèi)存敏感 → SXSSF。
到此這篇關(guān)于java基于poi-ooxml編寫(xiě)Excel導(dǎo)出的工具類的文章就介紹到這了,更多相關(guān)java導(dǎo)出Excel內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java servlet手機(jī)app訪問(wèn)接口(一)數(shù)據(jù)加密傳輸驗(yàn)證
這篇文章主要為大家詳細(xì)介紹了java servlet手機(jī)app訪問(wèn)接口(一),數(shù)據(jù)加密傳輸驗(yàn)證,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12
Springboot敏感字段脫敏的實(shí)現(xiàn)思路
這篇文章主要介紹了Springboot敏感字段脫敏的實(shí)現(xiàn)思路,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-09-09
MyBatis-Plus自動(dòng)填充字段的詳細(xì)教程
今天編寫(xiě)一個(gè)詳細(xì)的教程來(lái)介紹如何在?Spring?Boot?項(xiàng)目中使用?MyBatis-Plus?實(shí)現(xiàn)自動(dòng)填充時(shí)間字段(如創(chuàng)建時(shí)間?createTime?和更新時(shí)間?updateTime),可以分為以下幾個(gè)部分,這個(gè)教程將涵蓋從項(xiàng)目配置到自動(dòng)填充的完整過(guò)程,需要的朋友可以參考下2024-08-08
spring整合JMS實(shí)現(xiàn)同步收發(fā)消息(基于ActiveMQ的實(shí)現(xiàn))
本篇文章主要介紹了spring整合JMS實(shí)現(xiàn)同步收發(fā)消息(基于ActiveMQ的實(shí)現(xiàn)),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10
Java數(shù)據(jù)庫(kù)連接池技術(shù)的入門(mén)教程
這篇文章主要給大家介紹了關(guān)于Java數(shù)據(jù)庫(kù)連接池技術(shù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03

