java poi3.7实现excel下拉联动

Wesley13
• 阅读 801
/**
 *  
 * @File name:  CreateExcelMoBusiness.java 
 * @Create on:  2011-02-12 11:48:453
 * @Author   :  zhys513
 * @ChangeList
 * ---------------------------------------------------
 * Date         Editor              ChangeReasons
 *
 */
 
import java.io.FileOutputStream;
import java.util.HashMap;

import org.apache.poi.hssf.usermodel.DVConstraint;
import org.apache.poi.hssf.usermodel.HSSFDataValidation;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.DataValidation;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.Name;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddressList;
 
 
 

public class CreateExcelMoBusiness {

    private static String EXCEL_HIDE_SHEET_NAME = "excelhidesheetname"; 
    private static String HIDE_SHEET_NAME_SEX = "sexList";   
    private static String HIDE_SHEET_NAME_PROVINCE = "provinceList";  

    private HashMap map = new HashMap();
    //设置下拉列表的内容   
    private static String[] sexList = {"男","女"};   
    private static String[] provinceList = {"浙江","山东","江西","江苏","四川"};     
    private static String[] zjProvinceList = {"浙江","杭州","宁波","温州"};   
    private static String[] sdProvinceList = {"山东","济南","青岛","烟台"};   
    private static String[] jxProvinceList = {"江西","南昌","新余","鹰潭","抚州"};   
    private static String[] jsProvinceList = {"江苏","南京","苏州","无锡"};  
    private static String[] scProvinceList = {"四川","成都","绵阳","自贡"}; 
    
    public static void main(String[] args) {
        //使用事例
        Workbook wb = new HSSFWorkbook();   
        createExcelMo(wb);
        creatExcelHidePage(wb);   
        setDataValidation(wb);  
        FileOutputStream fileOut;
        try {
            fileOut = new FileOutputStream("d://excel_template.xls");
            wb.write(fileOut);   
            fileOut.close();
        } catch (Exception e) { 
            e.printStackTrace();
        }   
    }
    public static void  createExcelMo(Workbook wb){
            Sheet sheet = wb.createSheet("用户分类添加批导");   
            // Create a row and put some cells in it. Rows are 0 based.   
            Row row = sheet.createRow(0);   
            Cell cell = row.createCell(0);   
            cell.setCellValue("手机号码");   
            cell.setCellStyle(getTitleStyle(wb));   
            cell = row.createCell(1);   
            cell.setCellValue("所属父类");   
            cell.setCellStyle(getTitleStyle(wb));   
            cell = row.createCell(2);   
            cell.setCellValue("所属子类");   
            cell.setCellStyle(getTitleStyle(wb));   
            cell = row.createCell(3);   
    } 
    /**  
     * 设置模板文件的横向表头单元格的样式  
     * @param wb  
     * @return  
     */  
    private static CellStyle getTitleStyle(Workbook wb){   
        CellStyle style = wb.createCellStyle();   
        //对齐方式设置   
        style.setAlignment(CellStyle.ALIGN_CENTER);   
        //边框颜色和宽度设置   
        style.setBorderBottom(CellStyle.BORDER_THIN);   
        style.setBottomBorderColor(IndexedColors.BLACK.getIndex());   
        style.setBorderLeft(CellStyle.BORDER_THIN);   
        style.setLeftBorderColor(IndexedColors.BLACK.getIndex());   
        style.setBorderRight(CellStyle.BORDER_THIN);   
        style.setRightBorderColor(IndexedColors.BLACK.getIndex());   
        style.setBorderTop(CellStyle.BORDER_THIN);   
        style.setTopBorderColor(IndexedColors.BLACK.getIndex());   
        style.setFillBackgroundColor(IndexedColors.GREY_25_PERCENT.getIndex());   
        //设置背景颜色   
        style.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());   
        style.setFillPattern(CellStyle.SOLID_FOREGROUND);   
        //粗体字设置   
        Font font = wb.createFont();   
        font.setBoldweight(Font.BOLDWEIGHT_BOLD);   
        style.setFont(font);   
        return style;   
    }  
    /**  
     * 设置模板文件的横向表头单元格的样式  
     * @param wb  
     * @return  
     */ 
    public static void creatExcelHidePage(Workbook workbook){   
        Sheet hideInfoSheet = workbook.createSheet(EXCEL_HIDE_SHEET_NAME);//隐藏一些信息   
        //在隐藏页设置选择信息   
        //第一行设置性别信息   
        Row sexRow = hideInfoSheet.createRow(0);   
        creatRow(sexRow, sexList);   
        //第二行设置省份名称列表   
        Row provinceNameRow = hideInfoSheet.createRow(1);   
        creatRow(provinceNameRow, provinceList);   
        //以下行设置城市名称列表   
        Row cityNameRow = hideInfoSheet.createRow(2);   
        creatRow(cityNameRow, zjProvinceList);   
        
        cityNameRow = hideInfoSheet.createRow(3);   
        creatRow(cityNameRow, sdProvinceList);   
           
        cityNameRow = hideInfoSheet.createRow(4);   
        creatRow(cityNameRow, jxProvinceList);   
           
        cityNameRow = hideInfoSheet.createRow(5);   
        creatRow(cityNameRow, jsProvinceList);   
           
        cityNameRow = hideInfoSheet.createRow(6);   
        creatRow(cityNameRow, scProvinceList);
        //名称管理   
        //第一行设置性别信息   
        creatExcelNameList(workbook, HIDE_SHEET_NAME_SEX, 1, sexList.length, false);   
        //第二行设置省份名称列表   
        creatExcelNameList(workbook, HIDE_SHEET_NAME_PROVINCE, 2, provinceList.length, false);   
        //以后动态大小设置省份对应的城市列表   
        creatExcelNameList(workbook, provinceList[0], 3, zjProvinceList.length, true);   
        creatExcelNameList(workbook, provinceList[1], 4, sdProvinceList.length, true);   
        creatExcelNameList(workbook, provinceList[2], 5, jxProvinceList.length, true);   
        creatExcelNameList(workbook, provinceList[3], 6, jsProvinceList.length, true);   
        creatExcelNameList(workbook, provinceList[4], 7, scProvinceList.length, true);   
        //设置隐藏页标志   
        workbook.setSheetHidden(workbook.getSheetIndex(EXCEL_HIDE_SHEET_NAME), true);   
    }  
    
    /**  
     * 创建一个名称  
     * @param workbook  
     */  
    private static void creatExcelNameList(Workbook workbook,String nameCode,int order,int size,boolean cascadeFlag){   
        Name name;   
        name = workbook.createName();   
        name.setNameName(nameCode);   
        name.setRefersToFormula(EXCEL_HIDE_SHEET_NAME+"!"+creatExcelNameList(order,size,cascadeFlag));   
    }   
    
    /**  
     * 名称数据行列计算表达式  
     * @param workbook  
     */  
    private static String creatExcelNameList(int order,int size,boolean cascadeFlag){   
        char start = 'A';   
        if(cascadeFlag){   
            start = 'B';   
            if(size<=25){   
                char end = (char)(start+size-1);   
                return "$"+start+"$"+order+":$"+end+"$"+order;   
            }else{   
                char endPrefix = 'A';   
                char endSuffix = 'A';   
                if((size-25)/26==0||size==51){//26-51之间,包括边界(仅两次字母表计算)   
                    if((size-25)%26==0){//边界值   
                        endSuffix = (char)('A'+25);   
                    }else{   
                        endSuffix = (char)('A'+(size-25)%26-1);   
                    }   
                }else{//51以上   
                    if((size-25)%26==0){   
                        endSuffix = (char)('A'+25);   
                        endPrefix = (char)(endPrefix + (size-25)/26 - 1);   
                    }else{   
                        endSuffix = (char)('A'+(size-25)%26-1);   
                        endPrefix = (char)(endPrefix + (size-25)/26);   
                    }   
                }   
                return "$"+start+"$"+order+":$"+endPrefix+endSuffix+"$"+order;   
            }   
        }else{   
            if(size<=26){   
                char end = (char)(start+size-1);   
                return "$"+start+"$"+order+":$"+end+"$"+order;   
            }else{   
                char endPrefix = 'A';   
                char endSuffix = 'A';   
                if(size%26==0){   
                    endSuffix = (char)('A'+25);   
                    if(size>52&&size/26>0){   
                        endPrefix = (char)(endPrefix + size/26-2);   
                    }   
                }else{   
                    endSuffix = (char)('A'+size%26-1);   
                    if(size>52&&size/26>0){   
                        endPrefix = (char)(endPrefix + size/26-1);   
                    }   
                }   
                return "$"+start+"$"+order+":$"+endPrefix+endSuffix+"$"+order;   
            }   
        }   
    } 
    
    /**  
     * 创建一列数据  
     * @param currentRow  
     * @param textList  
     */  
    private static void creatRow(Row currentRow,String[] textList){   
        if(textList!=null&&textList.length>0){   
            int i = 0;   
            for(String cellValue : textList){   
                Cell userNameLableCell = currentRow.createCell(i++);   
                userNameLableCell.setCellValue(cellValue);   
            }   
        }   
    }/**  
     * 添加数据验证选项  
     * @param sheet  
     */  
    public static void setDataValidation(Workbook wb){   
        int sheetIndex = wb.getNumberOfSheets();   
        if(sheetIndex>0){   
            for(int i=0;i<sheetIndex;i++){   
                Sheet sheet = wb.getSheetAt(i);   
                if(!EXCEL_HIDE_SHEET_NAME.equals(sheet.getSheetName())){
                    DataValidation data_validation_list = null;
                    //省份选项添加验证数据    
                    for(int a=2;a<3002;a++){
                        data_validation_list = getDataValidationByFormula(HIDE_SHEET_NAME_PROVINCE,a,2);   
                        sheet.addValidationData(data_validation_list);   
                        //城市选项添加验证数据     
                        data_validation_list = getDataValidationByFormula("INDIRECT(B"+a+")",a,3);   
                        sheet.addValidationData(data_validation_list);   
                        //性别添加验证数据     
                        data_validation_list = getDataValidationByFormula(HIDE_SHEET_NAME_SEX,a,1);   
                        sheet.addValidationData(data_validation_list);     
                    }
                }   
            }   
        }   
    }  
    /**  
     * 使用已定义的数据源方式设置一个数据验证  
     * @param formulaString  
     * @param naturalRowIndex  
     * @param naturalColumnIndex  
     * @return  
     */  
    private static DataValidation getDataValidationByFormula(String formulaString,int naturalRowIndex,int naturalColumnIndex){   
        //加载下拉列表内容     
        DVConstraint constraint = DVConstraint.createFormulaListConstraint(formulaString);    
        //设置数据有效性加载在哪个单元格上。     
        //四个参数分别是:起始行、终止行、起始列、终止列     
        int firstRow = naturalRowIndex-1;   
        int lastRow = naturalRowIndex-1;   
        int firstCol = naturalColumnIndex-1;   
        int lastCol = naturalColumnIndex-1;   
        CellRangeAddressList regions=new CellRangeAddressList(firstRow,lastRow,firstCol,lastCol);     
        //数据有效性对象    
        DataValidation data_validation_list = new HSSFDataValidation(regions,constraint);   
        //设置输入信息提示信息   
        data_validation_list.createPromptBox("下拉选择提示","请使用下拉方式选择合适的值!");   
        //设置输入错误提示信息   
        data_validation_list.createErrorBox("选择错误提示","你输入的值未在备选列表中,请下拉选择合适的值!");   
        return data_validation_list;   
    }   
    
    private static DataValidation getDataValidationByDate(int naturalRowIndex,int naturalColumnIndex){   
        //加载下拉列表内容     
        DVConstraint constraint = DVConstraint.createDateConstraint(DVConstraint.OperatorType.BETWEEN,"1900-01-01", "5000-01-01", "yyyy-mm-dd");    
        //设置数据有效性加载在哪个单元格上。     
        //四个参数分别是:起始行、终止行、起始列、终止列     
        int firstRow = naturalRowIndex-1;   
        int lastRow = naturalRowIndex-1;   
        int firstCol = naturalColumnIndex-1;   
        int lastCol = naturalColumnIndex-1;   
        CellRangeAddressList regions=new CellRangeAddressList(firstRow,lastRow,firstCol,lastCol);     
        //数据有效性对象    
        DataValidation data_validation_list = new HSSFDataValidation(regions,constraint);   
        //设置输入信息提示信息   
        data_validation_list.createPromptBox("日期格式提示","请按照'yyyy-mm-dd'格式输入日期值!");   
        //设置输入错误提示信息   
        data_validation_list.createErrorBox("日期格式错误提示","你输入的日期格式不符合'yyyy-mm-dd'格式规范,请重新输入!");   
        return data_validation_list;   
    }    
}

 该示例参考了网上的代码,只是把代码整合在了一起,添加了可测试的main方法方便测试,以便没有成功实现联动的朋友只要把类拷贝到自己的工程里并引入需要的包就能直接看到效果。生成的EXCEL文件放在D盘根目录。 

参考的版本 poi3.7  下载请到http://www.apache.org/下载最新版本

 来源:优特产     个人博客:优特品

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Stella981 Stella981
3年前
Docker 部署SpringBoot项目不香吗?
  公众号改版后文章乱序推荐,希望你可以点击上方“Java进阶架构师”,点击右上角,将我们设为★“星标”!这样才不会错过每日进阶架构文章呀。  !(http://dingyue.ws.126.net/2020/0920/b00fbfc7j00qgy5xy002kd200qo00hsg00it00cj.jpg)  2
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这