原理
- 同样是将数据源放到一个新建的隐藏的sheet中,第一行是第一个列表的数据,第二行是每一个有下级菜单的菜单,他下面的行就是他下级菜单的每一值
- 使用MATCH函数从第二行找到上级菜单对应的列
- 根据OFFSET函数从2中获取的列,取得下级菜单值列表
这样就解决了上一篇中的所有缺点,不过因为用了大量的函数,所以带下拉功能的行数(CascadeCellBO的rowNum)不要太多否则会卡。获取上级菜单用相对定位,数据源用绝对定位,这样复制单元格也可用级联下拉
代码
@Data
public class CellDataSourceBO implements Serializable {
private static final long serialVersionUID = 8264756992270137029L;
/**
* 有子菜单的选项的个数(第二行的列数)对应的字母
*/
private String selectMaxColStr;
/**
* 最大的选项行数
*/
private int maxSelectRow;
/**
* 数据源名称(sheet名)
*/
private String name;
}
public class CascadeWriteHandler implements SheetWriteHandler {
private final AtomicInteger dataSourceIndex;
private final List<CascadeCellBO> cascadeCellList;
private final Map<List<NameCascadeBO>, CellDataSourceBO> dataSourceCache;
public CascadeWriteHandler(List<CascadeCellBO> cascadeCellList) {
this.cascadeCellList = cascadeCellList;
this.dataSourceCache = new HashMap<>();
this.dataSourceIndex = new AtomicInteger();
}
@Override
public void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
}
@Override
public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
//获取工作簿
Sheet sheet = writeSheetHolder.getSheet();
Workbook book = writeWorkbookHolder.getWorkbook();
DataValidationHelper dvHelper = sheet.getDataValidationHelper();
cascadeCellList.stream().filter(c -> c.getMaxLevel() > 0).forEach(cascadeCellBO -> {
int maxLevel = cascadeCellBO.getMaxLevel();
int colIndex = cascadeCellBO.getColIndex();
int firstRowIndex = cascadeCellBO.getRowIndex();
int lastRowIndex = firstRowIndex + cascadeCellBO.getRowNum();
List<NameCascadeBO> nameCascadeList = cascadeCellBO.getNameCascadeList();
//如果大类都没有,就渲染maxLevel个空的下拉列表
if (nameCascadeList == null || nameCascadeList.isEmpty()) {
DataValidationConstraint expConstraint = dvHelper.createExplicitListConstraint(new String[]{""});
CellRangeAddressList expRangeAddressList = new CellRangeAddressList(firstRowIndex, lastRowIndex, colIndex, colIndex + maxLevel - 1);
setValidation(sheet, dvHelper, expConstraint, expRangeAddressList, "提示", "你输入的值未在备选列表中,请下拉选择合适的值");
} else {
CellDataSourceBO cellDataSourceBO = buildOrGetDataSource(book

2万+

被折叠的 条评论
为什么被折叠?



