阿里easyexcel實現導出excel下拉框

如題,excel導出帶下拉框的表格

有這麼個需求,人員導入,但用戶是不知道也不方便選擇部門信息的,需要導出excel的時候帶上部門信息,部門信息是個下拉框。

先引入pom,要3.*的版本纔行

 <!-- 阿里excel 解析包 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>3.3.2</version>
        </dependency>

定義一個 SheetWriteHandler 的實現

@Slf4j
public class UserImportFileFilter implements SheetWriteHandler {


    /**
     * 下拉框值
     */
    private Map<Integer,String[]> dropDownMap;

    /**
     * 多少行有下拉
     */
    private final static Integer rowSize = 200;

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

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

    }

    @Override
    public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
        Sheet sheet = writeSheetHolder.getSheet();
        DataValidationHelper helper = sheet.getDataValidationHelper();

        dropDownMap.forEach((celIndex, strings) -> {
            // 區間設置
            CellRangeAddressList cellRangeAddressList = new CellRangeAddressList(1, rowSize, celIndex, celIndex);
            // 下拉內容
            DataValidationConstraint constraint = helper.createExplicitListConstraint(strings);
            DataValidation dataValidation = helper.createValidation(constraint, cellRangeAddressList);
            sheet.addValidationData(dataValidation);
        });
    }
}

增加一個工具類,用於導出的

/**
     * 寫出數據到excel
     *
     * @param list 要寫出的數據
     * @param clazz 寫出數據對應的類
     *                  如果要指定excel的寬高,需要使用 @ColumnWidth(25)  @HeadRowHeight(20) @ContentRowHeight(10) 等相關注解
     *                  多表頭導出則需要使用到 @ExcelProperty({"主標題", "字符串標題"}) 類似這種寫法
     *                  需要導出excel有背景顏色,則需要使用:
     *                      頭背景設置成紅色 IndexedColors.RED.getIndex() @HeadStyle(fillPatternType = FillPatternType.SOLID_FOREGROUND, fillForegroundColor = 10)
     *                      頭字體設置成20  @HeadFontStyle(fontHeightInPoints = 20)
     *                      內容的背景設置成綠色 @ContentStyle(fillPatternType = FillPatternType.SOLID_FOREGROUND, fillForegroundColor = 17)
     *                      內容字體設置成20   @ContentFontStyle(fontHeightInPoints = 20)
     *
     * @param fileName 寫出excel的名稱,例如:1.xls ,不填則默認 MongoDB ID生成策略實現.xls ,注意,一定要帶後綴
     * @param sheetName sheet的名稱,不填默認sheet1
     * @param <T>
     * @return 返回的絕對路徑,如:/temps/excel/out/2020/3/文件導出測試.xlsx
     */
    public static <T, E extends SheetWriteHandler> String writeSelect(List<T> list, Class<T> clazz, String fileName, String sheetName, E select){
        if (CheckTool.checkNull(fileName)){
            fileName = IdUtil.objectId() + ".xls";
        }
        if (CheckTool.checkNull(sheetName)){
            sheetName = "sheet1";
        }

        //返回存儲在本地的絕對路徑
        String path = getOutPath(fileName, false);

        try {
            HorizontalCellStyleStrategy horizontalCellStyleStrategy = styleDefault();
            //如果不需要加樣式,直接將 registerWriteHandler 去掉即可。
            ExcelWriterBuilder write = EasyExcel.write(path, clazz);
            if (select != null){
                write.registerWriteHandler(select);
            }
            write.registerWriteHandler(horizontalCellStyleStrategy).sheet(sheetName).doWrite(list);

        } catch (Exception e) {
            log.error("excel 生成失敗!", e);
            throw new ServiceException("excel生成失敗");
        }

        return path;
    }

此時,就可以自定義要導出的下拉框了

@GetMapping("getImportExcelFile")
    public Result getImportExcelFile(){
        HashMap<Integer, String[]> dropDownMap = new HashMap<>();
        // 指定下拉框
        String[] type = {"全部員工類型","在職員工","退休員工"};
        // 從0開始
        dropDownMap.put(2, type);

        UserImportFileFilter userImportFileFilter = new UserImportFileFilter(dropDownMap);
        String s = ExcelTool.writeSelect(null, UserImportFile.class, null, null, userImportFileFilter);
        System.out.println(s);
        return Result.success(s);
    }

注意上面的map,從0開始,序號在那個位置就在哪個列加對應的下拉框。

 

注意,如果你們已經引入了poi相關的jar,很可能出現依賴衝突。

此時排除掉poi的依賴一般可以解決問題

 <!-- 阿里excel 解析包 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>${easyexcel-version}</version>
            <exclusions>
                <exclusion>
                    <artifactId>poi-ooxml-schemas</artifactId>
                    <groupId>com.test.b2c.base</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>poi-ooxml</artifactId>
                    <groupId>com.test.b2c.base</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>poi</artifactId>
                    <groupId>com.test.b2c.base</groupId>
                </exclusion>
            </exclusions>
        </dependency>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章