最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java基于poi-ooxml編寫Excel導(dǎo)出的工具類

 更新時間:2025年08月22日 10:15:53   作者:yujkss  
這篇文章主要為大家詳細介紹了java如何基于poi-ooxml編寫一個Excel導(dǎo)出功能的工具類,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

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容器的操作

    這篇文章主要介紹了使用Java反射模擬實現(xiàn)Spring的IoC容器的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Windows Zookeeper安裝過程及啟動圖解

    Windows Zookeeper安裝過程及啟動圖解

    這篇文章主要介紹了Windows Zookeeper安裝過程及啟動圖解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-12-12
  • java爬蟲Jsoup主要類及功能使用詳解

    java爬蟲Jsoup主要類及功能使用詳解

    這篇文章主要為大家介紹了java爬蟲Jsoup主要類及功能使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • SpringBoot結(jié)合JWT登錄權(quán)限控制的實現(xiàn)

    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
  • Java處理壓縮文件的步驟詳解

    Java處理壓縮文件的步驟詳解

    在Java編程環(huán)境中,處理zip壓縮文件是一項常見的任務(wù),特別是在數(shù)據(jù)傳輸、備份或者打包應(yīng)用程序時,本文將詳細講解Java處理壓縮文件的步驟,并有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下
    2024-10-10
  • Intellij IDEA的一些調(diào)試技巧(小結(jié))

    Intellij IDEA的一些調(diào)試技巧(小結(jié))

    本篇文章主要介紹了Intellij IDEA的一些調(diào)試技巧(小結(jié)),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • Java中this()與super()的用法區(qū)別解析

    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詳解

    這篇文章主要介紹了Java中的logback標(biāo)記日志過濾器MarkerFilter詳解,在logback-classic中存在一個全局過濾器TurboFilter,TurboFilter是與LoggerContext綁定,會在會在其它過濾器之前執(zhí)行,需要的朋友可以參考下
    2023-11-11
  • SpringBoot整合MyBatis-Plus3.1教程詳解

    SpringBoot整合MyBatis-Plus3.1教程詳解

    這篇文章主要介紹了SpringBoot整合MyBatis-Plus3.1詳細教程,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-08-08
  • Java繼承超詳細教程

    Java繼承超詳細教程

    繼承是面向?qū)ο笳Z法的三大特征之一,繼承可以降低代碼編寫的冗余度,提高編程的效率,通過繼承,子類獲得了父類的成員變量和方法,一個子類如何繼承父類的字段和方法,如何修改從父類繼承過來的子類的方法呢,今天我們開始學(xué)習(xí)有關(guān)Java繼承的知識,感興趣的朋友一起看看吧
    2023-11-11

最新評論

泽州县| 石城县| 乐陵市| 同德县| 洛川县| 涪陵区| 福州市| 锦州市| 西宁市| 扶沟县| 巴里| 陆川县| 尚志市| 澄江县| 原阳县| 府谷县| 仙游县| 嘉峪关市| 嘉鱼县| 玛沁县| 繁昌县| 永仁县| 右玉县| 十堰市| 保山市| 棋牌| 荔浦县| 云龙县| 孟连| 奉贤区| 凤阳县| 辉县市| 民县| 平远县| 定日县| 铜川市| 观塘区| 滨海县| 诏安县| 桑植县| 孝昌县|