文章目錄
- 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。