使用java的poi工具包实现下拉框的级联效果

 

  1. 创建主Sheet页

//生成Sheet1
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("Sheet1");

  1. 创建附属sheet页

//生成存放对应数据的辅助表单
Sheet sheet2 = wb.createSheet("Sheet2");

  1. 将辅助表单所需数据存到java对象中

List provNameList = new ArrayList();
provNameList.add("安徽省");
provNameList.add("浙江省");

Map> siteMap = new HashMap>();
List childList = new ArrayList();
childList.add("杭州市");
childList.add("宁波市");
siteMap.put("浙江省", childList);
List list1 = new ArrayList();
list1.add("芜湖市");
list1.add("滁州市");
siteMap.put("安徽省", list1);
List list2 = new ArrayList();
list2.add("戈江区");
list2.add("三山区");
siteMap.put("芜湖市", list2);
List list3 = new ArrayList();
list3.add("来安县");
list3.add("凤阳县");
siteMap.put("滁州市", list3);
List list4 = new ArrayList();
list4.add("上城区");
list4.add("下城区");
siteMap.put("杭州市", list4);
List list5 = new ArrayList();
list5.add("余姚区");
list5.add("慈溪区");
siteMap.put("宁波市", list5);

  1. 将这些数据注入到辅助sheet页中

int rowId = 0;
Row proviRow = sheet2.createRow(rowId++);
proviRow.createCell(0).setCellValue("省列表");
//在第一行添加省信息
for (int i = 1; i < provNameList.size(); i++)
{
    Cell proviCell = proviRow.createCell(i);
    proviCell.setCellValue(provNameList.get(i));
}

Iterator keyIterator = siteMap.keySet().iterator();
//接下来每行都是第一个是父区域,后面跟着父区域的下一级子区域
while (keyIterator.hasNext())
{
    String key = keyIterator.next();
    List son = siteMap.get(key);

    Row row = sheet2.createRow(rowId++);
    row.createCell(0).setCellValue(key);
    for (int i = 0; i < son.size(); ++i)
    {
        Cell cell = row.createCell(i + 1);
        cell.setCellValue(son.get(i));
    }

    
}

  1. 给辅助sheet页的每行数据添加名称管理器

//每一行都添加名称管理器
    String range = getRange(1, rowId, son.size());
    Name name = wb.createName();
    name.setNameName(key);
    String formula = "Sheet2!" + range;
    name.setRefersToFormula(formula);

  1. 我们以省市区为例,设置省级下拉框的限制

//添加省的规则

//设置下拉框的所选内容
DVConstraint provConstraint = DVConstraint.createExplicitListConstraint(provNameList.toArray(new String[]{}));

//设置下拉框的作用范围
CellRangeAddressList provRangeAddressList = new CellRangeAddressList(cell.getRowIndex()+1,10,cell.getColumnIndex(),cell.getColumnIndex());


DataValidation provinceDataValidation = new HSSFDataValidation(provRangeAddressList, provConstraint);

//设置下拉框的错误输入提示
provinceDataValidation.createErrorBox("error", "请选择正确省份");

//让该下拉框在该sheet页生效
sheet.addValidationData(provinceDataValidation);

  1. 设置市和区县的下拉框限制

//设置每一个单元格都以前一个单元格的选择作为标准

//用for循环控制行数
for (int j = 2; j <= 12; j++)
{
    //市规则

//这里用到了excel中的公式和名称管理器,先是用INDIRECT方法取到第AD列第j行的数据,然后在到名称管理器中查找对应的list,然后赋值给下拉框;
    DVConstraint formula = DVConstraint.createFormulaListConstraint("INDIRECT($AD$" + j + ")");
    CellRangeAddressList rangeAddressList = new CellRangeAddressList(j-1, j-1,cell.getColumnIndex()+1,cell.getColumnIndex()+1);
    DataValidation cacse = new HSSFDataValidation(rangeAddressList, formula);
    cacse.createErrorBox("error", "请选择正确的城市");
    sheet.addValidationData(cacse);

    //区规则
    formula = DVConstraint.createFormulaListConstraint("INDIRECT($AE$" + j + ")");
    rangeAddressList = new CellRangeAddressList(j-1, j-1,cell.getColumnIndex()+2,cell.getColumnIndex()+2);
    cacse = new HSSFDataValidation(rangeAddressList, formula);
    cacse.createErrorBox("error", "请选择正确的区");
    sheet.addValidationData(cacse);
}

 

你可能感兴趣的:(java)