Java POI生成帶有下拉框&級(jí)聯(lián)下拉框的Excel

Apache POI在生成excel文件方面比其他工具較為強(qiáng)大,把在項(xiàng)目中用到的東西記錄下來(lái)。由于之前沒(méi)有用過(guò)poi,所以期間耗費(fèi)了一些時(shí)間收集資料和看api。在此特地記錄下來(lái),希望能幫助你。
在這里只指出關(guān)鍵點(diǎn),完整源碼請(qǐng)根據(jù)下方提供的git地址查看。
本文示例使用poi版本: poi-3.10-FINAL-20140208 。

先把下拉框數(shù)據(jù)寫入隱藏sheet頁(yè)中,寫的同時(shí)進(jìn)行下拉數(shù)據(jù)與所要級(jí)聯(lián)的下拉數(shù)據(jù)進(jìn)行“名稱”映射(注意:excel“名稱”不能以數(shù)字開(kāi)頭,且不能包含特殊字符)
    /**
     * 初始化倉(cāng)庫(kù)&貨架下拉框數(shù)據(jù)
     *
     * @param workbook
     * @param wsSheet
     * @param warehouses
     * @param warehousesAndShelves
     */
    private static void initWarehousesAndShelves(HSSFWorkbook workbook, HSSFSheet wsSheet, List<String> warehouses, Map<String, List<String>> warehousesAndShelves) {
        writeWarehouses(workbook, wsSheet, warehouses);
        writeShelves(workbook, wsSheet, warehouses, warehousesAndShelves);
        initWarehouseNameMapping(workbook, wsSheet.getSheetName(), warehouses.size());
    }
/**
     * 生成下拉框之前的準(zhǔn)備:根據(jù)公式生成下拉框驗(yàn)證規(guī)則及提示
     *
     * @param formulaString
     * @param columnIndex
     * @return
     */
    public static DataValidation getDataValidationByFormula(String formulaString, int columnIndex) {
        // 加載下拉列表內(nèi)容
        DVConstraint constraint = DVConstraint.createFormulaListConstraint(formulaString);
        // 設(shè)置數(shù)據(jù)有效性加載在哪個(gè)單元格上。
        // 四個(gè)參數(shù)分別是:起始行、終止行、起始列、終止列
        CellRangeAddressList regions = new CellRangeAddressList(1, XLS_MAX_ROW, columnIndex, columnIndex);
        // 數(shù)據(jù)有效性對(duì)象
        DataValidation dataValidationList = new HSSFDataValidation(regions, constraint);
        dataValidationList.createErrorBox("Error", "請(qǐng)選擇或輸入有效的選項(xiàng),或下載最新模版重試!");
        String promptText = initPromptText(columnIndex);
        dataValidationList.createPromptBox("", promptText);
        return dataValidationList;
    }
 /**
     * 在主sheet中初始化下拉框
     *
     * @param mainSheet
     */
    private static void initSheetNameMapping(HSSFSheet mainSheet) {
        DataValidation warehouseValidation = getDataValidationByFormula(WAREHOUSE_NAMES, 3);
        DataValidation shelfValidation = getDataValidationByFormula("INDIRECT($D1)", 4); //formula同"INDIRECT(INDIRECT(\"R\"&ROW()&\"C\"&(COLUMN()-1),FALSE))"
        DataValidation deviceValidation = getDataValidationByFormula(DEVICE_NAMES, 0);
        DataValidation deviceTypeValidation = getDataValidationByFormula(DEVICE_TYPE_NAMES, 1);
        // 主sheet添加驗(yàn)證數(shù)據(jù)
        mainSheet.addValidationData(warehouseValidation);
        mainSheet.addValidationData(shelfValidation);
        mainSheet.addValidationData(deviceValidation);
        mainSheet.addValidationData(deviceTypeValidation);
    }

注意: 級(jí)聯(lián)下拉框包含被級(jí)聯(lián)項(xiàng)和及聯(lián)項(xiàng)(選擇前者后可供選擇的下拉項(xiàng)),前者由于excel“名稱”的限制,不能以數(shù)字開(kāi)頭,也不能包含特殊字符。
給出效果圖:

excel.gif

源碼詳見(jiàn):https://github.com/hzhqk/java/blob/master/poi/excel%20template/ExcelTemplate.java

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,027評(píng)論 25 709
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,554評(píng)論 19 139
  • 實(shí)習(xí)第二周 No.2 項(xiàng)目功能里要求能夠?qū)⒄故镜膱?bào)表導(dǎo)出excel,因?yàn)閳?bào)表的數(shù)據(jù)都是動(dòng)態(tài)從list傳進(jìn)來(lái)的,所...
    蘇筱筑閱讀 2,507評(píng)論 2 7
  • 得到函數(shù)的名字。按照優(yōu)先級(jí)來(lái)進(jìn)行區(qū)分
    基本密碼宋閱讀 343評(píng)論 0 0
  • 最近因?yàn)樽陨淼木壒剩降兹绾握嬲蔀橐粋€(gè)牛人,不僅是思維上的改變,更多應(yīng)該是行為層面發(fā)生改變。開(kāi)始深入的學(xué)習(xí)和研究...
    李撒歡閱讀 275評(píng)論 0 0

友情鏈接更多精彩內(nèi)容