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

SpringBoot+EasyExcel實(shí)現(xiàn)自定義復(fù)雜樣式導(dǎo)入導(dǎo)出

 更新時(shí)間:2025年07月10日 16:30:17   作者:夢想blog  
這篇文章主要為大家詳細(xì)介紹了SpringBoot如何結(jié)果EasyExcel實(shí)現(xiàn)自定義復(fù)雜樣式導(dǎo)入導(dǎo)出功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下

tips:能用模板就用模板,當(dāng)模板不適用的情況下,再選擇自定義生成 Excel。

官網(wǎng):https://easyexcel.opensource.alibaba.com

安裝

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>3.1.1</version>
        </dependency>

處理自定義導(dǎo)出復(fù)雜場景

1、列不固定,動(dòng)態(tài)列

2、動(dòng)態(tài)下拉

3、自定義鎖定行/列,添加密碼

4、合并單元格

5、導(dǎo)入自定義統(tǒng)一注解統(tǒng)一校驗(yàn)

6、樣式處理(字體,顏色,底色,富文本,列寬,行寬等)

7、凍結(jié)窗格

8、多Sheet處理

1、列不固定,動(dòng)態(tài)列

首先定義一個(gè)公共實(shí)體,處理公共字段和動(dòng)態(tài)列字段,具體實(shí)體則繼承該類即可。

package com.example.springbootexcel.excel.base.model;

import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;

import java.util.List;
import java.util.Map;

@Data
public class BaseExcel {

    @ExcelProperty( value = "序號")
    private String num;

    /**
     * 動(dòng)態(tài)字段處理
     */
    private List<Map<String, Object>> dynamicList;

}

2、動(dòng)態(tài)下拉

封裝一個(gè)公共類,構(gòu)造入?yún)ap,key為表頭,value為下拉字符串?dāng)?shù)組。

.registerWriteHandler(new DropDownHandler(dropDownMap));

package com.example.springbootexcel.excel.base.style;

import com.alibaba.excel.write.handler.SheetWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder;
import org.apache.poi.ss.usermodel.DataValidation;
import org.apache.poi.ss.usermodel.DataValidationConstraint;
import org.apache.poi.ss.usermodel.DataValidationHelper;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddressList;

import java.util.Map;

/**
 * 添加下拉選單
 *
 * @author jason
 */
public class DropDownHandler implements SheetWriteHandler {
    private final Map<Integer, String[]> dropDownMap;  // key:列號(從0開始), value:下拉數(shù)據(jù)

    public DropDownHandler(Map<Integer, String[]> dropDownMap) {
        this.dropDownMap = dropDownMap;
    }

    @Override
    public void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
        // 不需要實(shí)現(xiàn)
    }

    @Override
    public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
        if (dropDownMap == null || dropDownMap.isEmpty()) {
            return;
        }

        Sheet sheet = writeSheetHolder.getSheet();
        DataValidationHelper helper = sheet.getDataValidationHelper();

        dropDownMap.forEach((columnIndex, dropDownData) -> {
            // 設(shè)置下拉框數(shù)據(jù)范圍 (這里設(shè)置從第2行到第10000行)
            CellRangeAddressList addressList = new CellRangeAddressList(1, 9999, columnIndex, columnIndex);

            // 創(chuàng)建數(shù)據(jù)驗(yàn)證約束
            DataValidationConstraint constraint = helper.createExplicitListConstraint(dropDownData);

            // 創(chuàng)建數(shù)據(jù)驗(yàn)證
            DataValidation validation = helper.createValidation(constraint, addressList);

            // 阻止輸入非下拉選項(xiàng)的值
            validation.setErrorStyle(DataValidation.ErrorStyle.STOP);
            validation.setShowErrorBox(true);
            validation.setSuppressDropDownArrow(true);
            validation.createErrorBox("提示", "請從下拉選項(xiàng)中選擇");

            // 添加驗(yàn)證到sheet
            sheet.addValidationData(validation);
        });
    }
}

3、自定義鎖定行/列,添加密碼

@Override
    public void afterCellCreate(CellWriteHandlerContext context) {
        WriteSheetHolder writeSheetHolder = context.getWriteSheetHolder();
        Sheet sheet = writeSheetHolder.getSheet();
        Workbook workbook = sheet.getWorkbook();
        Cell cell = context.getCell();
        int columnIndex = cell.getColumnIndex();
        Row row = cell.getRow();

        // 設(shè)置工作表保護(hù)
        if (!sheet.getProtect()) {
            XSSFSheet xssfSheet = (XSSFSheet) sheet;
            // 啟用保護(hù)
            xssfSheet.protectSheet("1234");
            // 設(shè)置保護(hù)選項(xiàng):允許刪除未鎖定行
            xssfSheet.lockDeleteRows(false);
            // 設(shè)置保護(hù)選項(xiàng):允許插入未鎖定行
            xssfSheet.lockInsertRows(false);
        }

        // 設(shè)置工作表的默認(rèn)單元格樣式為不鎖定
        CellStyle defaultStyle = workbook.createCellStyle();
        defaultStyle.setLocked(false);
        sheet.setDefaultColumnStyle(columnIndex, defaultStyle);
        row.setRowStyle(defaultStyle);
    }

4、合并單元格

sheet.addMergedRegion(new CellRangeAddress(relativeRowIndex, relativeRowIndex, 0, 10));

5、導(dǎo)入自定義統(tǒng)一注解統(tǒng)一校驗(yàn)

package com.example.springbootexcel.excel.base.component;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * tips:非必填校驗(yàn),填了就校驗(yàn),不填不校驗(yàn)
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface ExcelValidation {

    /**
     * 日期校驗(yàn)
     *
     * @return true表示必須為日期,false表示不限制
     */
    boolean date() default false;

    /**
     * 是否必須為數(shù)字
     *
     * @return true表示必須為數(shù)字,false表示不限制
     */
    boolean numeric() default false;

    /**
     * 是否允許小數(shù),且最多兩位小數(shù)
     *
     * @return true表示允許最多兩位小數(shù),false表示不允許小數(shù)
     */
    boolean decimal() default false;

    /**
     * 是否允許斜杠
     *
     * @return true表示允許斜杠,false表示不允許
     */
    boolean allowSlash() default false;

    /**
     * 校驗(yàn)失敗時(shí)的錯(cuò)誤提示信息
     *
     * @return 錯(cuò)誤提示信息
     */
    String message() default "字段校驗(yàn)失敗";

}

6、樣式處理(字體,顏色,底色,富文本,列寬,行寬等)

// 基本樣式設(shè)置
        cellStyle.setBorderTop(BorderStyle.THIN);
        cellStyle.setBorderBottom(BorderStyle.THIN);
        cellStyle.setBorderLeft(BorderStyle.THIN);
        cellStyle.setBorderRight(BorderStyle.THIN);
        // 設(shè)置水平對齊為左對齊
        cellStyle.setAlignment(HorizontalAlignment.LEFT);
        // 設(shè)置垂直對齊為垂直居中
        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
        // 設(shè)置自動(dòng)換行
        cellStyle.setWrapText(true);

        // 創(chuàng)建默認(rèn)字體
        Font defaultFont = workbook.createFont();
        defaultFont.setFontName(DEFAULT_FONT_NAME);
        defaultFont.setFontHeightInPoints(DEFAULT_FONT_POINTS);
        defaultFont.setColor(IndexedColors.BLACK.getIndex());
        defaultFont.setBold(false);

        // 創(chuàng)建紅色字體
        Font redFont = workbook.createFont();
        redFont.setFontName(DEFAULT_FONT_NAME);
        redFont.setFontHeightInPoints(DEFAULT_FONT_POINTS);
        redFont.setColor(IndexedColors.RED.getIndex());
        redFont.setBold(true);

        // 自定義列寬
        String cellValue = cell.getStringCellValue();
        Integer columnWidth = COLUMN_WIDTHS.get(cellValue);
        if (ObjectUtil.isNotNull(columnWidth) && !CollectionUtil.contains(COLUMN_WIDTHS_EXIST, context.getColumnIndex())) {
            sheet.setColumnWidth(context.getColumnIndex(), columnWidth);
            COLUMN_WIDTHS_EXIST.add(context.getColumnIndex());
        }
        // 設(shè)置默認(rèn)寬度
        if (!CollectionUtil.contains(COLUMN_WIDTHS_EXIST, context.getColumnIndex())) {
            sheet.setColumnWidth(context.getColumnIndex(), DEFAULT_COLUMN_WIDTH);
        }

        // 提示詞
        if (CollectionUtil.contains(TIPS_LIST, relativeRowIndex)) {
            defaultFont = redFont;
            // 合并單元格
            sheet.addMergedRegion(new CellRangeAddress(relativeRowIndex, relativeRowIndex, 0, 10));
        }
        // 表頭
        if (CollectionUtil.contains(HEAD_LIST, relativeRowIndex)) {
            defaultFont.setBold(true);
            // 背景色
            cellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
            cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);

            // 動(dòng)態(tài)字段標(biāo)紅
            if (CollectionUtil.contains(HEAD_READ_COLOR, cell.getColumnIndex())) {
                defaultFont = redFont;
            } else {
                // 星號標(biāo)紅
                RichTextString richText = cell.getRichStringCellValue();
                if (StrUtil.startWith(cellValue, "*")) {
                    richText.applyFont(0, 1, redFont);
                    if (cellValue.length() > 1) {
                        richText.applyFont(1, cellValue.length(), defaultFont);
                    }
                    cell.setCellValue(richText);
                }
            }
        }
        cellStyle.setFont(defaultFont);

7、凍結(jié)窗格

.registerWriteHandler(new FreezePaneHandler(2))

package com.example.springbootexcel.excel.base.style;

import com.alibaba.excel.write.handler.SheetWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder;
import org.apache.poi.ss.usermodel.Sheet;

/**
 * 凍結(jié)窗格
 *
 * @author jason
 */
public class FreezePaneHandler implements SheetWriteHandler {
    private final int row;  // 需要凍結(jié)的行

    public FreezePaneHandler(int row) {
        this.row = row;
    }

    @Override
    public void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
    }

    @Override
    public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
        Sheet sheet = writeSheetHolder.getSheet();
        // 凍結(jié)首行
        // sheet.createFreezePane(0, 1, 0, 1);

        sheet.createFreezePane(0, row, 0, row);
    }

}

8、多Sheet處理

        // 創(chuàng)建 ExcelWriter 對象
        ExcelWriter excelWriter = EasyExcel.write(filePath).inMemory(true).build();

        // 寫入第1個(gè) Sheet
        WriteSheet sheet1 = EasyExcel.writerSheet("Sheet1")
                .registerWriteHandler(new CommonStyleHandler(MockDataUtil.getHeadReadColor(headList, dynamicList)))
                .registerWriteHandler(new DropDownHandler(dropDownMap))
                .registerWriteHandler(new FreezePaneHandler(2))
                .build();
        excelWriter.write(sheet1DataList, sheet1);

        // 寫入第2個(gè) Sheet
        WriteSheet sheet2 = EasyExcel.writerSheet("Sheet2")
                .head(BrandModelExcel.class)
                .registerWriteHandler(new FreezePaneHandler(1))
                .build();
        excelWriter.write(MockDataUtil.brandModelExcelList(), sheet2);

        // 寫入第3個(gè) Sheet
        WriteSheet sheet3 = EasyExcel.writerSheet("Sheet3")
                .head(VehicleNameExcel.class)
                .registerWriteHandler(new FreezePaneHandler(1))
                .build();
        excelWriter.write(MockDataUtil.vehicleNameExcelList(), sheet3);

        // 非常重要:最后一定要關(guān)閉 excelWriter
        excelWriter.finish();

        log.info("導(dǎo)出成功:{}", filePath);

源碼:https://gitee.com/zhaomingjian/workspace_dora/tree/master/spring-boot-excel

到此這篇關(guān)于SpringBoot+EasyExcel實(shí)現(xiàn)自定義復(fù)雜樣式導(dǎo)入導(dǎo)出的文章就介紹到這了,更多相關(guān)SpringBoot EasyExcel自定義樣式導(dǎo)入導(dǎo)出內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 一文帶你全面了解Java?Properties類

    一文帶你全面了解Java?Properties類

    Properties是JDK1.0中引入的java類,目前也在項(xiàng)目中大量使用,主要用來讀取外部的配置,那除了這個(gè),你對它其他的一些api也了解嗎??你了解它是怎么實(shí)現(xiàn)的嗎??如果不清楚的話,就通過本篇文章帶你一探究竟
    2022-09-09
  • IDEA 2020 無法啟動(dòng)的解決辦法(啟動(dòng)崩盤)附IDEA 2020 新功能

    IDEA 2020 無法啟動(dòng)的解決辦法(啟動(dòng)崩盤)附IDEA 2020 新功能

    這篇文章主要介紹了IDEA 2020 無法啟動(dòng)的解決辦法(啟動(dòng)崩盤)附IDEA 2020 新功能,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Java實(shí)現(xiàn)微信掃碼登入的實(shí)例代碼

    Java實(shí)現(xiàn)微信掃碼登入的實(shí)例代碼

    這篇文章主要介紹了java實(shí)現(xiàn)微信掃碼登入功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Java設(shè)計(jì)模式之抽象工廠模式

    Java設(shè)計(jì)模式之抽象工廠模式

    這篇文章主要為大家詳細(xì)介紹了Java設(shè)計(jì)模式之抽象工廠模式的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • SpringBoot整合MD5加密完成注冊和登錄方式

    SpringBoot整合MD5加密完成注冊和登錄方式

    MD5(MessageDigestAlgorithm5)是一種常見的哈希算法,用于生成固定長度(128位)的哈希值,主要應(yīng)用于數(shù)據(jù)完整性校驗(yàn)和密碼存儲,MD5具有快速計(jì)算、不可逆性和抗碰撞性等特點(diǎn),盡管存在碰撞漏洞,MD5仍廣泛應(yīng)用于文件下載校驗(yàn)和數(shù)字簽名等場景
    2024-10-10
  • java實(shí)現(xiàn)播放背景音樂

    java實(shí)現(xiàn)播放背景音樂

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)播放背景音樂,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • Java實(shí)現(xiàn)超市會員管理系統(tǒng)

    Java實(shí)現(xiàn)超市會員管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)超市會員管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Feign使用@PathVariable方式

    Feign使用@PathVariable方式

    Feign使用@PathVariable注解在URL中插入變量,類似于SpringMVC的用法,通過示例展示了如何使用該注解,并在實(shí)際調(diào)用中替換占位符
    2024-11-11
  • SpringBoot整合Redis實(shí)現(xiàn)緩存分頁數(shù)據(jù)查詢功能

    SpringBoot整合Redis實(shí)現(xiàn)緩存分頁數(shù)據(jù)查詢功能

    類似淘寶首頁,這些商品是從數(shù)據(jù)庫中查出來的嗎,答案肯定不是,本文我們就通過一個(gè)案例實(shí)操一下,首頁熱點(diǎn)數(shù)據(jù)怎么放到Redis中去查詢,感興趣的同學(xué)可以參考一下
    2023-06-06
  • SpringMVC中的HandlerMappingIntrospector工具類詳解

    SpringMVC中的HandlerMappingIntrospector工具類詳解

    這篇文章主要介紹了SpringMVC中的HandlerMappingIntrospector工具類詳解,這是一個(gè)Spring MVC助手類,用于集合應(yīng)用所配置的HandlerMapping(url pattern和請求處理handler之間的映射)表,用于獲取針對某個(gè)請求的如下信息,需要的朋友可以參考下
    2023-12-12

最新評論

中山市| 汽车| 当雄县| 嵊州市| 开化县| 新建县| 教育| 图木舒克市| 弥渡县| 武城县| 铜陵市| 高邑县| 汉川市| 绥中县| 遂平县| 拉萨市| 洛宁县| 准格尔旗| 开江县| 海城市| 浠水县| 河池市| 安龙县| 青铜峡市| 丹巴县| 安多县| 密云县| 互助| 新化县| 湖北省| 莱芜市| 赫章县| 府谷县| 攀枝花市| 雅江县| 华容县| 永定县| 庆元县| 张北县| 工布江达县| 淳化县|