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

Spring Boot 使用FastExcel實現(xiàn)多級表頭動態(tài)數(shù)據(jù)填充導(dǎo)出

 更新時間:2025年12月24日 11:15:09   作者:愿你天黑有燈下雨有傘  
文章介紹了如何使用Maven管理依賴,創(chuàng)建動態(tài)表頭實體類,實現(xiàn)動態(tài)表頭數(shù)據(jù)填充策略,并提供了一個導(dǎo)出工具類的示例,感興趣的朋友跟隨小編一起看看吧

1:依賴(Maven)

<!-- FastExcel 官網(wǎng)最新版 -->
<dependency>
    <groupId>cn.idev.excel</groupId>
    <artifactId>fastexcel</artifactId>
    <version>1.0.0</version>
</dependency>

2:動態(tài)表頭實體類

package com.fantaibao.module.vo.target;
import cn.idev.excel.annotation.ExcelProperty;
import cn.idev.excel.annotation.write.style.ColumnWidth;
import cn.idev.excel.annotation.write.style.ContentStyle;
import cn.idev.excel.annotation.write.style.HeadFontStyle;
import cn.idev.excel.annotation.write.style.HeadStyle;
import cn.idev.excel.enums.poi.FillPatternTypeEnum;
import cn.idev.excel.enums.poi.HorizontalAlignmentEnum;
import cn.idev.excel.enums.poi.VerticalAlignmentEnum;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@HeadFontStyle(fontName = "黑體", fontHeightInPoints = 12)
@HeadStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER, verticalAlignment = VerticalAlignmentEnum.CENTER,
        fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 44)
@ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER, verticalAlignment = VerticalAlignmentEnum.CENTER)
public class TargetIndexExportStoreStaVo {
    /**
     * 年份(2025)
     */
    @ColumnWidth(15)
    @ExcelProperty({"${indexName}", "年度"})
    private Integer year;
    /**
     * 門店名稱
     */
    @ColumnWidth(20)
    @ExcelProperty({"${indexName}", "門店名稱"})
    private String storeName;
    /**
     * 年目標
     */
    @ColumnWidth(15)
    @ExcelProperty({"${indexName}", "年目標"})
    private String totalTarget;
    /**
     * 當前進度
     */
    @ColumnWidth(20)
    @ExcelProperty({"${indexName}", "當前進度"})
    private String progress;
    /**
     * 目標完成率
     */
    @ColumnWidth(20)
    @ExcelProperty({"${indexName}", "目標完成率"})
    private String finishRate;
}
package com.fantaibao.module.vo.target;
import cn.idev.excel.annotation.ExcelProperty;
import cn.idev.excel.annotation.write.style.*;
import cn.idev.excel.enums.poi.FillPatternTypeEnum;
import cn.idev.excel.enums.poi.HorizontalAlignmentEnum;
import cn.idev.excel.enums.poi.VerticalAlignmentEnum;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@HeadFontStyle(fontName = "黑體", fontHeightInPoints = 12)
@HeadStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER, verticalAlignment = VerticalAlignmentEnum.CENTER,
        fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 44)
@ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER, verticalAlignment = VerticalAlignmentEnum.CENTER)
@ContentFontStyle(fontName = "黑體", fontHeightInPoints = 10)
public class TargetIndexExportStoreMonthStaVo {
    /**
     * 年份(2025)
     */
    @ColumnWidth(15)
    @ExcelProperty({"${indexName}", "年度"})
    private Integer year;
    /**
     * 門店名稱
     */
    @ColumnWidth(25)
    @ExcelProperty({"${indexName}", "門店名稱"})
    private String storeName;
    /**
     * 月目標
     */
    @ColumnWidth(15)
    @ExcelProperty({"${indexName}", "${month}月目標"})
    private String totalTarget;
    /**
     * 當前進度
     */
    @ColumnWidth(20)
    @ExcelProperty({"${indexName}", "當前進度"})
    private String progress;
    /**
     * 目標完成率
     */
    @ColumnWidth(20)
    @ExcelProperty({"${indexName}", "目標完成率"})
    private String finishRate;
}

3:動態(tài)表頭數(shù)據(jù)填充策略

package com.fantaibao.handler;
import cn.hutool.core.collection.CollUtil;
import cn.idev.excel.metadata.Head;
import cn.idev.excel.write.handler.CellWriteHandler;
import cn.idev.excel.write.metadata.holder.WriteSheetHolder;
import cn.idev.excel.write.metadata.holder.WriteTableHolder;
import org.apache.poi.ss.usermodel.Cell;
public class CustomHeaderWriteHandler implements CellWriteHandler {
    private final String indexName;
    public CustomHeaderWriteHandler(String indexName) {
        this.indexName = indexName;
    }
    @Override
    public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder,
                                Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
        // 處理表頭
        if (CollUtil.isNotEmpty(head.getHeadNameList())) {
            // 處理一級表頭
            if (CollUtil.isNotEmpty(head.getHeadNameList())) {
                String replace = head.getHeadNameList().get(0).replace("${indexName}", indexName);
                head.getHeadNameList().set(0, replace);
            }
        }
    }
}
public class CustomMonthHeaderWriteHandler implements CellWriteHandler {
    private final String indexName;
    private final int month;
    public CustomMonthHeaderWriteHandler(String indexName, int month) {
        this.indexName = indexName;
        this.month = month;
    }
    @Override
    public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder,
                                Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
        if (isHead && head != null) {
            // 處理表頭
            if (CollUtil.isNotEmpty(head.getHeadNameList())) {
                // 處理一級表頭
                String indexName = head.getHeadNameList().get(0).replace("${indexName}", this.indexName);
                head.getHeadNameList().set(0, indexName);
                // 處理二級表頭
                String monthStr = head.getHeadNameList().get(1);
                if (!monthStr.contains("${month}")) {
                    return;
                }
                String month = monthStr.replace("${month}", String.valueOf(this.month));
                head.getHeadNameList().set(1, month);
            }
        }
    }
}

4:導(dǎo)出工具類

/**
     * 按單個指標生成年度-月度匯總數(shù)據(jù)
     *
     * @param zipOut               ZIP輸出流
     * @param fileNamePrefix        文件名前綴
     * @param storeTargetYearList  門店年目標集合
     * @param storeMonthTargetList 門店月目標集合
     * @param enums                指標
     * @param storeMap             門店集合
     * @throws IOException 拋出的異常
     */
    public static void generateSingleIndexStaExcelFile(ZipOutputStream zipOut, String fileNamePrefix, List<StoreIndexYearStaVo> storeTargetYearList,
                                                       List<StoreIndexMonthStaVo> storeMonthTargetList, IndicatorsTypeEnums enums,
                                                       Map<String, StoreInfoListVO> storeMap) throws IOException {
        ZipEntry zipEntry = new ZipEntry(enums.getName() + "門店" + fileNamePrefix + "目標匯總.xlsx");
        zipOut.putNextEntry(zipEntry);
        try (ExcelWriter excelWriter = EasyExcel.write(zipOut).autoCloseStream(false).build()) {
            // Sheet1: 門店指標年目標匯總
            WriteSheet yearSheet = EasyExcel.writerSheet(0, enums.getName() + "門店年目標")
                    .head(TargetIndexExportStoreStaVo.class)
                    .registerWriteHandler(new CustomHeaderWriteHandler(StrUtil.isNotBlank(enums.getUnit()) ? enums.getName() + "(" + enums.getUnit() + ")" : enums.getName()))
                    .build();
            excelWriter.write(getYearSheetData(enums, storeTargetYearList, storeMap), yearSheet);
            // Sheet2: 門店指標月目標匯總
            for (int month = 1; month <= 12; month++) {
                WriteSheet monthSheet = EasyExcel.writerSheet(month, "門店" + month + "月目標")
                        .head(TargetIndexExportStoreMonthStaVo.class)
                        .registerWriteHandler(new CustomMonthHeaderWriteHandler(StrUtil.isNotBlank(enums.getUnit()) ? enums.getName() + "(" + enums.getUnit() + ")" : enums.getName(), month))
                        .build();
                excelWriter.write(getMonthSheetDataByMonth(enums, storeMonthTargetList, month, storeMap), monthSheet);
            }
            excelWriter.finish();
        } catch (Exception e) {
            try {
                zipOut.closeEntry();
            } catch (IOException ignored) {
            }
            throw e;
        }
        zipOut.closeEntry();
    }

5:樣例

到此這篇關(guān)于Spring Boot 使用FastExcel實現(xiàn)多級表頭動態(tài)數(shù)據(jù)填充導(dǎo)出的文章就介紹到這了,更多相關(guān)Spring Boot FastExcel多級表頭數(shù)據(jù)填充導(dǎo)出內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot動態(tài)定時任務(wù)、動態(tài)Bean、動態(tài)路由詳解

    SpringBoot動態(tài)定時任務(wù)、動態(tài)Bean、動態(tài)路由詳解

    這篇文章主要介紹了SpringBoot動態(tài)定時任務(wù)、動態(tài)Bean、動態(tài)路由詳解,之前用過Spring中的定時任務(wù),通過@Scheduled注解就能快速的注冊一個定時任務(wù),但有的時候,我們業(yè)務(wù)上需要動態(tài)創(chuàng)建,或者根據(jù)配置文件、數(shù)據(jù)庫里的配置去創(chuàng)建定時任務(wù),需要的朋友可以參考下
    2023-10-10
  • SpringCloud之熔斷監(jiān)控Hystrix Dashboard的實現(xiàn)

    SpringCloud之熔斷監(jiān)控Hystrix Dashboard的實現(xiàn)

    這篇文章主要介紹了SpringCloud之熔斷監(jiān)控Hystrix Dashboard的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Java 中的 Consumer 與 Supplier 接口使用場景與示例

    Java 中的 Consumer 與 Supplier 接口使用場景與

    文章介紹了Java 8中函數(shù)式接口的核心概念,Consumer與Supplier接口使用場景與示例,重點對比了Consumer(消費數(shù)據(jù))與Supplier(供給數(shù)據(jù))的區(qū)別,感興趣的朋友跟隨小編一起看看吧
    2025-08-08
  • 深入解析Java中ThreadLocal線程類的作用和用法

    深入解析Java中ThreadLocal線程類的作用和用法

    ThreadLocal為解決多線程程序的并發(fā)問題提供了一種新的思路,ThreadLocal并不是一個Thread,而是Thread的局部變量,本文就來深入解析Java中ThreadLocal線程類的作用和用法.
    2016-05-05
  • Idea?中控制啟動命令的詳細過程?區(qū)分環(huán)境案例詳解

    Idea?中控制啟動命令的詳細過程?區(qū)分環(huán)境案例詳解

    這篇文章主要介紹了Idea?中控制啟動命令的詳細過程?區(qū)分環(huán)境案例詳解,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08
  • Java調(diào)用python代碼的五種方式總結(jié)

    Java調(diào)用python代碼的五種方式總結(jié)

    這篇文章主要給大家介紹了關(guān)于Java調(diào)用python代碼的五種方式,在Java中調(diào)用Python函數(shù)的方法有很多種,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-09-09
  • Spring Boot中操作使用Redis實現(xiàn)詳解

    Spring Boot中操作使用Redis實現(xiàn)詳解

    Spring Boot與Redis結(jié)合使用,通過使用Spring Data Redis來實現(xiàn)對Redis的操作,實現(xiàn)數(shù)據(jù)緩存和高效存儲,提高應(yīng)用程序的性能和響應(yīng)速度。可以利用Spring Boot自帶的Redis Starter方便地集成和配置Redis
    2023-04-04
  • Spring boot集成Go-FastDFS實現(xiàn)圖片上傳刪除等功能實現(xiàn)

    Spring boot集成Go-FastDFS實現(xiàn)圖片上傳刪除等功能實現(xiàn)

    這篇文章主要介紹了Spring boot集成Go-FastDFS實現(xiàn)圖片上傳刪除等功能實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • SpringSecurity的安全過濾器鏈功能詳解

    SpringSecurity的安全過濾器鏈功能詳解

    本文介紹了如何配置SpringSecurity的安全過濾器鏈,包括定義URL路徑的訪問權(quán)限、用戶認證和授權(quán)配置、自定義CSRF過濾器等內(nèi)容,通過這些配置,可以實現(xiàn)對不同URL路徑的訪問控制以及用戶的登錄、注銷等功能,感興趣的朋友一起看看吧
    2025-03-03
  • Java 線程相關(guān)總結(jié)

    Java 線程相關(guān)總結(jié)

    這篇文章主要介紹了Java 線程的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-02-02

最新評論

临泉县| 丽江市| 托克托县| 星座| 延长县| 库车县| 定远县| 九寨沟县| 河东区| 泰顺县| 安宁市| 长海县| 共和县| 扎囊县| 达尔| 高尔夫| 九龙城区| 南平市| 怀仁县| 罗江县| 瑞金市| 榆树市| 吴川市| 苍南县| 乐昌市| 松溪县| 麻江县| 大庆市| 南城县| 广汉市| 河源市| 乡城县| 丹东市| 泸溪县| 栾川县| 临颍县| 安阳市| 苍南县| 沅江市| 兴海县| 宁明县|