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

基于Java POI實(shí)現(xiàn)動(dòng)態(tài)列Excel導(dǎo)出的通用方法

 更新時(shí)間:2025年07月14日 08:42:23   作者:自由的瘋  
在企業(yè)級(jí)開(kāi)發(fā)中,Excel導(dǎo)出功能是常見(jiàn)需求,當(dāng)面對(duì)前端動(dòng)態(tài)傳參、列數(shù)不確定的場(chǎng)景時(shí),編寫(xiě)通用的動(dòng)態(tài)列導(dǎo)出方法能顯著提升開(kāi)發(fā)效率,本文將結(jié)合Java POI框架,詳細(xì)解析如何實(shí)現(xiàn)支持多級(jí)表頭、動(dòng)態(tài)列求和及合并單元格的Excel導(dǎo)出功能,并提供完整代碼示例與使用說(shuō)明

一、核心功能特性

1. 動(dòng)態(tài)列處理

  • 支持從前端接收??List<String>???類(lèi)型的列名集合(??cellList???),結(jié)合固定列數(shù)組(??strCloumnAry??)動(dòng)態(tài)拼接最終列集合
  • 使用??LinkedHashMap??維護(hù)列順序,確保導(dǎo)出列與傳入順序一致

2. 多級(jí)表頭支持

  • 通過(guò)??headerNum??參數(shù)控制表頭層級(jí)(1-3 級(jí))
  • 表頭名稱通過(guò)??||???分隔(如??"船舶信息||完船日期||噸位"??),自動(dòng)解析為多級(jí)結(jié)構(gòu)

3. 數(shù)據(jù)統(tǒng)計(jì)功能

  • 自動(dòng)識(shí)別數(shù)值型列(??Number???類(lèi)型),生成??totalMap??存儲(chǔ)列求和結(jié)果
  • 支持在導(dǎo)出數(shù)據(jù)末尾添加 "合計(jì)" 行,并合并單元格顯示

4. 樣式與布局優(yōu)化

  • 統(tǒng)一設(shè)置單元格邊框、居中對(duì)齊、字體大小
  • 自動(dòng)調(diào)整列寬適應(yīng)內(nèi)容
  • 多級(jí)表頭行合并相同標(biāo)題單元格,提升可讀性

二、關(guān)鍵代碼解析

1. 列集合初始化

LinkedHashMap<String, Integer> allColumn = new LinkedHashMap<>();
// 先添加固定列
for (int i = 0; i < strCloumnAry.length; i++) {
    allColumn.putIfAbsent(strCloumnAry[i], i);
}
// 再添加動(dòng)態(tài)列(避免重復(fù))
int i = strCloumnAry.length;
for (String key : cellList) {
    if (!allColumn.containsKey(key)) {
        allColumn.put(key, i++);
    }
}
  • 使用??LinkedHashMap??保持順序,固定列在前,動(dòng)態(tài)列在后
  • 通過(guò)??putIfAbsent??避免重復(fù)列名導(dǎo)致的索引沖突

2. 多級(jí)表頭生成

if (headerNum == 2) { // 二級(jí)表頭處理
    for (String key : allColumn.keySet()) {
        String[] parts = key.split("\|\|"); // 按||拆分
        if (parts.length == 2) {
            // 一級(jí)表頭行
            Cell cell1 = headerRow1.createCell(allColumn.get(key));
            cell1.setCellValue(parts[0]);
            // 二級(jí)表頭行
            Cell cell2 = headerRow2.createCell(allColumn.get(key));
            cell2.setCellValue(parts[1]);
        }
    }
}
  • 通過(guò)??split("\|\|")??解析多級(jí)表頭名稱
  • 根據(jù)??headerNum??創(chuàng)建對(duì)應(yīng)行數(shù)的表頭行(1-3 級(jí))
  • 同一列的多級(jí)表頭單元格共享相同列索引

3. 數(shù)據(jù)行與合計(jì)行

// 寫(xiě)入數(shù)據(jù)行
int row = headerNum; // 表頭行下方開(kāi)始寫(xiě)數(shù)據(jù)
for (Map<String, Object> data : datas) {
    Row dataRow = sheet.createRow(row++);
    for (Map.Entry<String, Integer> entry : allColumn.entrySet()) {
        Cell cell = dataRow.createCell(entry.getValue());
        cell.setCellValue(data.get(entry.getKey()) != null ? data.get(entry.getKey()).toString() : "");
    }
}

// 寫(xiě)入合計(jì)行
Row totalRow = sheet.createRow(row);
totalRow.createCell(0).setCellValue("合計(jì)");
for (Map.Entry<String, Object> entry : totalMap.entrySet()) {
    int colIndex = allColumn.get(entry.getKey());
    Cell cell = totalRow.createCell(colIndex);
    cell.setCellValue(entry.getValue() != null ? entry.getValue().toString() : "");
}
// 合并合計(jì)行標(biāo)題單元格
sheet.addMergedRegion(new CellRangeAddress(row, row, 0, maxSp));
  • ??totalMap??通過(guò)遍歷數(shù)據(jù)行自動(dòng)計(jì)算數(shù)值列總和
  • 合計(jì)行標(biāo)題 "合計(jì)" 通過(guò)??CellRangeAddress??合并多個(gè)列單元格
  • ??maxSp??變量動(dòng)態(tài)計(jì)算需要合并的列范圍

4. 單元格樣式設(shè)置

// 創(chuàng)建通用樣式
CellStyle cellStyle = workbook.createCellStyle();
cellStyle.setAlignment(HorizontalAlignment.CENTER);
cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
cellStyle.setBorderTop(BorderStyle.THIN);
cellStyle.setBorderBottom(BorderStyle.THIN);
cellStyle.setBorderLeft(BorderStyle.THIN);
cellStyle.setBorderRight(BorderStyle.THIN);

// 表頭字體設(shè)置
Font headerFont = workbook.createFont();
headerFont.setFontHeightInPoints((short) 10);
cellStyle.setFont(headerFont);
  • 統(tǒng)一設(shè)置水平 / 垂直居中對(duì)齊
  • 添加細(xì)邊框樣式
  • 表頭使用 10 號(hào)字體

三、使用示例

1. 方法參數(shù)說(shuō)明

參數(shù)名類(lèi)型說(shuō)明
responseHttpServletResponseServlet 響應(yīng)對(duì)象,用于輸出文件流
datasList<Map<String,Object>>導(dǎo)出數(shù)據(jù)集合,每個(gè) Map 代表一行數(shù)據(jù)
cellListList動(dòng)態(tài)列名集合(如前端勾選的列)
baseFileNameString基礎(chǔ)文件名(不含時(shí)間戳)
strAryString[]固定列顯示名稱數(shù)組(與 strCloumnAry 對(duì)應(yīng))
strCloumnAryString[]固定列字段名數(shù)組(如數(shù)據(jù)庫(kù)字段名)
headerNumint表頭層級(jí)(1-3 級(jí))

2. 調(diào)用示例

// 假設(shè)前端傳入動(dòng)態(tài)列名為["price","quantity"]
List<String> cellList = Arrays.asList("price", "quantity");
// 固定列字段名與顯示名
String[] strCloumnAry = {"name", "date"};
String[] strAry = {"商品名稱", "日期"};

// 構(gòu)造模擬數(shù)據(jù)
List<Map<String, Object>> datas = new ArrayList<>();
Map<String, Object> data1 = new HashMap<>();
data1.put("name", "蘋(píng)果");
data1.put("date", "2023-10-01");
data1.put("price", 5.99);
data1.put("quantity", 100);
datas.add(data1);

// 調(diào)用導(dǎo)出方法(二級(jí)表頭示例)
exportDynamicExcel(response, datas, cellList, "商品銷(xiāo)售報(bào)表", strAry, strCloumnAry, 2);

3. 表頭命名規(guī)范

多級(jí)表頭通過(guò)??||??分隔,如:

  • 一級(jí)表頭:??"銷(xiāo)售額"??
  • 二級(jí)表頭:??"季度數(shù)據(jù)||銷(xiāo)售額"??
  • 三級(jí)表頭:??"年度匯總||季度數(shù)據(jù)||銷(xiāo)售額"??

四、優(yōu)化與擴(kuò)展建議

1. 類(lèi)型適配優(yōu)化

當(dāng)前代碼僅處理??Number??類(lèi)型數(shù)值求和,可擴(kuò)展支持:

  • ??String??類(lèi)型數(shù)值轉(zhuǎn)換(需校驗(yàn)格式)
  • ??LocalDate???/??LocalDateTime??類(lèi)型日期格式化顯示

2. 樣式擴(kuò)展

  • 添加條件格式(如數(shù)值超過(guò)閾值時(shí)標(biāo)紅)
  • 支持不同背景色區(qū)分奇偶行
  • 表頭行添加自動(dòng)篩選功能

3. 性能優(yōu)化

  • 大數(shù)據(jù)量場(chǎng)景可改用??SXSSFWorkbook??(基于磁盤(pán)緩存的流式處理)
  • 合并單元格操作可批量處理,減少??sheet.addMergedRegion??調(diào)用次數(shù)

4. 錯(cuò)誤處理增強(qiáng)

  • 添加參數(shù)校驗(yàn)(如??cellList???與??strCloumnAry??重復(fù)校驗(yàn))
  • 提供更友好的異常提示信息(如字段名不存在)

五、總結(jié)

本文提供的動(dòng)態(tài)列 Excel 導(dǎo)出方法通過(guò)靈活的參數(shù)設(shè)計(jì),實(shí)現(xiàn)了:

  • 動(dòng)態(tài)列與固定列的混合展示
  • 1-3 級(jí)多級(jí)表頭的自動(dòng)解析
  • 數(shù)值列自動(dòng)求和與合計(jì)行生成
  • 統(tǒng)一的單元格樣式與布局優(yōu)化

適用于需要根據(jù)用戶選擇動(dòng)態(tài)展示列的管理系統(tǒng)(如數(shù)據(jù)報(bào)表、權(quán)限控制場(chǎng)景)。實(shí)際使用中可根據(jù)業(yè)務(wù)需求進(jìn)一步擴(kuò)展類(lèi)型適配、樣式定制等功能,提升導(dǎo)出文件的實(shí)用性與美觀性。

以上就是基于Java POI實(shí)現(xiàn)動(dòng)態(tài)列Excel導(dǎo)出的通用方法的詳細(xì)內(nèi)容,更多關(guān)于Java POI動(dòng)態(tài)列Excel導(dǎo)出的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • java排查死鎖示例

    java排查死鎖示例

    這篇文章主要介紹了java排查死鎖示例,通過(guò)java中簡(jiǎn)單的死鎖示例引出四種排查死鎖的工具,詳細(xì)講解請(qǐng)看全文,希望對(duì)大家有所幫助
    2021-08-08
  • java九九乘法表示例

    java九九乘法表示例

    這篇文章主要介紹了java九九乘法表示例,需要的朋友可以參考下
    2014-04-04
  • 最簡(jiǎn)單的spring boot打包docker鏡像的實(shí)現(xiàn)

    最簡(jiǎn)單的spring boot打包docker鏡像的實(shí)現(xiàn)

    這篇文章主要介紹了最簡(jiǎn)單的spring boot打包docker鏡像的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • java如何強(qiáng)制刪除java程序占用的文件

    java如何強(qiáng)制刪除java程序占用的文件

    這篇文章主要介紹了java如何強(qiáng)制刪除java程序占用的文件問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • 利用POI讀取word、Excel文件的最佳實(shí)踐教程

    利用POI讀取word、Excel文件的最佳實(shí)踐教程

    Apache POI 是用Java編寫(xiě)的免費(fèi)開(kāi)源的跨平臺(tái)的 Java API,Apache POI提供API給Java程式對(duì)Microsoft Office格式檔案讀和寫(xiě)的功能。 下面這篇文章主要給大家介紹了關(guān)于利用POI讀取word、Excel文件的最佳實(shí)踐的相關(guān)資料,需要的朋友可以參考下。
    2017-11-11
  • Java編程學(xué)習(xí)的幾個(gè)典型實(shí)例詳解

    Java編程學(xué)習(xí)的幾個(gè)典型實(shí)例詳解

    這篇文章主要給大家介紹了Java編程學(xué)習(xí)的幾個(gè)典型實(shí)例,其中包括模擬酒店房間管理系統(tǒng)、螺旋矩陣 例或者百雞問(wèn)題的變形等經(jīng)典實(shí)例,具體來(lái)一起看詳細(xì)內(nèi)容吧,需要的朋友可以參考學(xué)習(xí)。
    2017-02-02
  • Intellij無(wú)法創(chuàng)建java文件解決方案

    Intellij無(wú)法創(chuàng)建java文件解決方案

    這篇文章主要介紹了Intellij無(wú)法創(chuàng)建java文件解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • Java中ClassNotFoundException的類(lèi)加載問(wèn)題排查與修復(fù)方法

    Java中ClassNotFoundException的類(lèi)加載問(wèn)題排查與修復(fù)方法

    在Java開(kāi)發(fā)中,java.lang.ClassNotFoundException是常見(jiàn)的運(yùn)行時(shí)異常,通常表示JVM在嘗試加載某個(gè)類(lèi)時(shí)未能找到其定義,本文結(jié)合實(shí)戰(zhàn)經(jīng)驗(yàn),系統(tǒng)性分析ClassNotFoundException的排查與修復(fù)方法,并提供豐富的代碼示例和表格分析,需要的朋友可以參考下
    2025-06-06
  • SpringBoot配置log4j2的實(shí)現(xiàn)示例

    SpringBoot配置log4j2的實(shí)現(xiàn)示例

    SpringBoot中默認(rèn)使用Logback作為日志框架,本文主要介紹了SpringBoot配置log4j2的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • java Class文件結(jié)構(gòu)解析常量池字節(jié)碼

    java Class文件結(jié)構(gòu)解析常量池字節(jié)碼

    這篇文章主要為大家介紹了java Class文件的整體結(jié)構(gòu)解析常量池字節(jié)碼詳細(xì)講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07

最新評(píng)論

临泽县| 新乡县| 汝南县| 清水河县| 遵义市| 固阳县| 闵行区| 海门市| 赤水市| 子洲县| 宜昌市| 临颍县| 图木舒克市| 凌云县| 利津县| 涿州市| 宝兴县| 太原市| 监利县| 泾阳县| 出国| 遂昌县| 巴南区| 泗洪县| 徐闻县| 罗定市| 靖西县| 翁源县| 陆川县| 桃源县| 镇雄县| 安泽县| 包头市| 凉城县| 游戏| 壶关县| 江川县| 西藏| 高唐县| 东阳市| 余姚市|