导入的时候,一般会有模版下载,那么会涉及到下拉框的情况,此下拉框为动态生成,今天我们来看下
所用工具easypoi
@Override
public void downLoadTemplete(HttpServletResponse response) throws Exception {
// 模版下载,空数据,列对就可以了
List<ImportBasicPersonVo> importBasicPersonVos = new ArrayList<>();
// 文件保存路径
String tempZipFilePath = "zipTempPath";
// 创建xls文件
File tempXlsxFile = new File(tempZipFilePath + File.separator + "import_person.xls");
OutputStream xlsxOut = new FileOutputStream(tempXlsxFile);
Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), ImportBasicPersonVo.class,
importBasicPersonVos);
// 设置下拉
setSheetDropDown(workbook);
workbook.write(xlsxOut);
}设置下拉,即从数据库中查询要下拉的数据,然后设置,经过实践,当下拉中显示的字符总数超过255字节的时候,会报错,这里两种情况分别展示
// 显示的示例表格
Sheet sheetAt = workbook.getSheetAt(0);
// 下拉数据,绑定后就隐藏的表格
Sheet hidden = workbook.createSheet("hidden");
Cell cell = null;
//下拉数据
List<String> orgList = orgService.list().stream().map(org -> org.getName()).collect(Collectors.toList());
// 将数据都放入hidden中
for (int i = 0, length = orgList.size(); i < length; i++)
{
String name = orgList.get(i);
Row row = hidden.createRow(i);
cell = row.createCell(0);
cell.setCellValue(name);
}
Name namedCell = workbook.createName();
// 绑定name
namedCell.setNameName("hidden");
// 在hidden中数据要存放的位置
namedCell.setRefersToFormula("hidden!$A$1:$A$" + orgList.size());
DVConstraint constraint = DVConstraint.createFormulaListConstraint("hidden");
// 设置数据有效性加载在哪个单元格上,四个参数分别是:起始行、终止行、起始列、终止列
CellRangeAddressList addressList = new CellRangeAddressList(1, 100, 8, 8);
HSSFDataValidation validation = new HSSFDataValidation(addressList, constraint);
//将第二个sheet设置为隐藏
workbook.setSheetHidden(1, false);
if (null != validation)
{
sheetAt.addValidationData(validation);// 将数据加入到示例导出表格中 位置为1, 100, 8, 8
}
//=====================这是大数据量的下拉,下面是普通下拉===============================
// 准备下拉列表数据
List<DictGroupItemVo> dictGroupAndItemList = basicDictGroupMapper.getDictGroupAndItemList(Arrays.asList("person_type", "id_type", "degree", "nation"));
List<String> personTypeList = dictGroupAndItemList.stream().filter(dictGroupItemVo -> dictGroupItemVo.getGroupCode().equals("person_type")).map(dictGroupItemVo -> dictGroupItemVo.getName()).collect(Collectors.toList());
List<String> idTypeList = dictGroupAndItemList.stream().filter(dictGroupItemVo -> dictGroupItemVo.getGroupCode().equals("id_type")).map(dictGroupItemVo -> dictGroupItemVo.getName()).collect(Collectors.toList());
List<String> degreeList = dictGroupAndItemList.stream().filter(dictGroupItemVo -> dictGroupItemVo.getGroupCode().equals("degree")).map(dictGroupItemVo -> dictGroupItemVo.getName()).collect(Collectors.toList());
List<String> nationList = dictGroupAndItemList.stream().filter(dictGroupItemVo -> dictGroupItemVo.getGroupCode().equals("nation")).map(dictGroupItemVo -> dictGroupItemVo.getName()).collect(Collectors.toList());
// List<String> orgList = orgService.list(new QueryWrapper<Org>().select().eq(ColumnNameConstants.DELETE_STATUS, 0)).stream().map(org -> org.getName()).collect(Collectors.toList());
// 获取当前用户有权限的组织集合
// List<String> orgList = orgService.queryOrgListByUserId().stream().map(org -> org.getName()).collect(Collectors.toList());
// 类别 证件类型 组织 学历 民族 性别
// 设置第一列的1-100行为下拉列表
CellRangeAddressList personRegions = new CellRangeAddressList(1, 100, 5, 5);
CellRangeAddressList idTypeRegions = new CellRangeAddressList(1, 100, 6, 6);
CellRangeAddressList degreeRegions = new CellRangeAddressList(1, 100, 11, 11);
CellRangeAddressList nationRegions = new CellRangeAddressList(1, 100, 12, 12);
CellRangeAddressList sexRegions = new CellRangeAddressList(1, 100, 4, 4);
// CellRangeAddressList orgRegions = new CellRangeAddressList(1, 100, 8, 8);
// 创建下拉列表数据
DVConstraint personConstraint = null;
DVConstraint idTypeConstraint = null;
DVConstraint degreeConstraint = null;
DVConstraint nationConstraint = null;
DVConstraint sexConstraint = null;
DVConstraint orgConstraint = null;
if (CollectionUtil.isNotEmpty(personTypeList)) {
personConstraint = DVConstraint.createExplicitListConstraint(personTypeList.toArray(new String[personTypeList.size()]));
idTypeConstraint = DVConstraint.createExplicitListConstraint(idTypeList.toArray(new String[idTypeList.size()]));
degreeConstraint = DVConstraint.createExplicitListConstraint(degreeList.toArray(new String[degreeList.size()]));
nationConstraint = DVConstraint.createExplicitListConstraint(nationList.toArray(new String[nationList.size()]));
sexConstraint = DVConstraint.createExplicitListConstraint(new String[]{"男", "女"});
// orgConstraint = DVConstraint.createExplicitListConstraint(orgList.toArray(new String[orgList.size()]));
}
// 绑定
HSSFDataValidation personValidation = new HSSFDataValidation(personRegions, personConstraint);
HSSFDataValidation idTypeValidation = new HSSFDataValidation(idTypeRegions, idTypeConstraint);
HSSFDataValidation degreeValidation = new HSSFDataValidation(degreeRegions, degreeConstraint);
HSSFDataValidation nationValidation = new HSSFDataValidation(nationRegions, nationConstraint);
HSSFDataValidation sexValidation = new HSSFDataValidation(sexRegions, sexConstraint);
// HSSFDataValidation orgValidation = new HSSFDataValidation(orgRegions, orgConstraint);
sheetAt.addValidationData(personValidation);
sheetAt.addValidationData(idTypeValidation);
sheetAt.addValidationData(degreeValidation);
sheetAt.addValidationData(nationValidation);
sheetAt.addValidationData(sexValidation);
// sheetAt.addValidationData(orgValidation);可以看到 其中orgValidation 开始也是用大多数普通下拉的,但是由于数据了较大,报错255,百度后,单独提出去了,位置都是(1,100,8,8)这样可以达到大数据下拉框的展示,并且不报错
















