欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2025年08月22日 10:15:53   作者:yujkss  
這篇文章主要為大家詳細(xì)介紹了java如何基于poi-ooxml編寫(xiě)一個(gè)Excel導(dǎo)出功能的工具類,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(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ù)列表(泛型支持任意對(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)證

    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)思路

    這篇文章主要介紹了Springboot敏感字段脫敏的實(shí)現(xiàn)思路,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2021-09-09
  • 如何利用MyBatisX插件自動(dòng)生成代碼

    如何利用MyBatisX插件自動(dòng)生成代碼

    這篇文章主要介紹了如何利用MyBatisX插件自動(dòng)生成代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • MyBatis-Plus自動(dòng)填充字段的詳細(xì)教程

    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
  • Java實(shí)現(xiàn)JDBC批量插入原理詳解

    Java實(shí)現(xiàn)JDBC批量插入原理詳解

    在JDBC中,executeBatch這個(gè)方法可以將多條dml語(yǔ)句批量執(zhí)行,效率比單條執(zhí)行executeUpdate高很多,這是什么原理呢?在mysql和oracle中又是如何實(shí)現(xiàn)批量執(zhí)行的呢?本文將給大家介紹這背后的原理
    2023-03-03
  • spring整合JMS實(shí)現(xiàn)同步收發(fā)消息(基于ActiveMQ的實(shí)現(xiàn))

    spring整合JMS實(shí)現(xiàn)同步收發(fā)消息(基于ActiveMQ的實(shí)現(xiàn))

    本篇文章主要介紹了spring整合JMS實(shí)現(xiàn)同步收發(fā)消息(基于ActiveMQ的實(shí)現(xiàn)),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • 關(guān)于idea2022.2?閃退的問(wèn)題

    關(guān)于idea2022.2?閃退的問(wèn)題

    最近更新了idea2022.2版本,這是一個(gè)比較大的軟件版本更迭,下面小編給大家介紹下idea2022.2?閃退的問(wèn)題及解決方法,需要的朋友可以參考下
    2022-08-08
  • Java數(shù)據(jù)庫(kù)連接池技術(shù)的入門(mén)教程

    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
  • 使用Java計(jì)算屏幕的PPI的方法詳解

    使用Java計(jì)算屏幕的PPI的方法詳解

    在現(xiàn)代電子設(shè)備中,屏幕的分辨率和顯示效果是用戶非常關(guān)注的一個(gè)指標(biāo),PPI(Pixels Per Inch,每英寸像素?cái)?shù))是衡量屏幕顯示精度的重要參數(shù)之一,PPI越高,屏幕顯示的圖像越細(xì)膩,視覺(jué)效果越好,本文將詳細(xì)介紹PPI的概念、計(jì)算方法,并通過(guò)Java代碼實(shí)現(xiàn)PPI的計(jì)算
    2025-02-02
  • java實(shí)現(xiàn)文件的上傳功能

    java實(shí)現(xiàn)文件的上傳功能

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)文件的上傳功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01

最新評(píng)論