美文网首页
Java POI生成带有下拉框&级联下拉框的Excel

Java POI生成带有下拉框&级联下拉框的Excel

作者: hzhqk | 来源:发表于2017-12-12 10:49 被阅读0次

    Apache POI在生成excel文件方面比其他工具较为强大,把在项目中用到的东西记录下来。由于之前没有用过poi,所以期间耗费了一些时间收集资料和看api。在此特地记录下来,希望能帮助你。
    在这里只指出关键点,完整源码请根据下方提供的git地址查看。
    本文示例使用poi版本: poi-3.10-FINAL-20140208 。

    先把下拉框数据写入隐藏sheet页中,写的同时进行下拉数据与所要级联的下拉数据进行“名称”映射(注意:excel“名称”不能以数字开头,且不能包含特殊字符)
        /**
         * 初始化仓库&货架下拉框数据
         *
         * @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());
        }
    
    /**
         * 生成下拉框之前的准备:根据公式生成下拉框验证规则及提示
         *
         * @param formulaString
         * @param columnIndex
         * @return
         */
        public static DataValidation getDataValidationByFormula(String formulaString, int columnIndex) {
            // 加载下拉列表内容
            DVConstraint constraint = DVConstraint.createFormulaListConstraint(formulaString);
            // 设置数据有效性加载在哪个单元格上。
            // 四个参数分别是:起始行、终止行、起始列、终止列
            CellRangeAddressList regions = new CellRangeAddressList(1, XLS_MAX_ROW, columnIndex, columnIndex);
            // 数据有效性对象
            DataValidation dataValidationList = new HSSFDataValidation(regions, constraint);
            dataValidationList.createErrorBox("Error", "请选择或输入有效的选项,或下载最新模版重试!");
            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添加验证数据
            mainSheet.addValidationData(warehouseValidation);
            mainSheet.addValidationData(shelfValidation);
            mainSheet.addValidationData(deviceValidation);
            mainSheet.addValidationData(deviceTypeValidation);
        }
    

    注意: 级联下拉框包含被级联项和及联项(选择前者后可供选择的下拉项),前者由于excel“名称”的限制,不能以数字开头,也不能包含特殊字符。
    给出效果图:

    excel.gif
    源码详见:https://github.com/hzhqk/java/blob/master/poi/excel%20template/ExcelTemplate.java

    相关文章

      网友评论

          本文标题:Java POI生成带有下拉框&级联下拉框的Excel

          本文链接:https://www.haomeiwen.com/subject/vyugixtx.html