通过POI设置Excel级联导出

1:如何通过Excel设置数据级联(包括一级级联、二级级联以及多级级联)
我希望填写者能够按照固定的模式填写性别、省、市,而且市这一列填写内容必须随着省这一列发生动态改变。
通过POI设置Excel级联导出_第1张图片
Step1: 在当前excel中新建一个sheet,依次填写对应列的固定模式(此处性别这一列对应的固定模式为男/女,省这一列对应的固定模式为四川省/广西省,四川省对应的市有成都/眉山,广西省对应的市有河池/北海),通过ctrl+F3设置每一行的名称
通过POI设置Excel级联导出_第2张图片
Step2:设置目标列的数据有效性,如果当前为一级级联,如省这一列,设置数据有效性的来源为(=省份,此处的省份就是在step1中设置的名称);如果当前列为二级级联,如市这一列,则设置数据有效性的来源为(=INDIRECT($C2) ,此处的$C2就是指省这一列)
通过POI设置Excel级联导出_第3张图片
通过POI设置Excel级联导出_第4张图片
Step3:通过以上步骤我们就可以在性别与省这两列中,通过下拉选择对应的值。通过选择省可以级联出市这一列的下拉选项值。

2:通过代码实现上述操作过程
2.1:新建一个WorkBook,并在这个WorkBook中创建两个sheet,分别为sheet1与sheet2。在sheet1中第一行写入对应的列头,在sheet2中写入级联的内容
2.2:在sheet2中根据级联内容设置命名管理
2.3:在sheet1中设置一级级联与多级级联的数据有效性
2.4:下载代码实现,https://download.csdn.net/download/qq_31071543/10690560

3:扩展实现excel自动清除子级联相关数据
(比如我在省这一列下某一行选择四川省,对应的市选择成都,后来我发现自己选择错了,然后把当前选择的四川省改为广西省,此时我希望对应的市变为空)
实现方式:在项目中引入一个excel的基础模版cascade.xlsm这个模版的内容只有存在vba的宏代码,然后使用poi解析这个模版,最终就可以得到带有宏的、数据有效性的模版。以下为vba的宏代码:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Rng As Range
    If Target.Row < 2 Then Exit Sub '修改第一行(标题)退出程序
    fj = Sheets("dict_sheet").Cells(Rows.Count, 1).End(xlUp).Row '读取dict_sheet中A列的数据,该列数据主要用来存放存在子级联的列数
    For Each Rng In Target
      For x = 1 To fj
      Z = Sheets("dict_sheet").Cells(x, 1).Value
        If Rng.Column = Z Then '判断是否存在子级联
            Rng.Offset(0, 1).ClearContents '清除列或F列
        End If
        Next x
    Next
End Sub

你可能感兴趣的:(poi-excel)