因为直接使用excel的序列生成的下拉框,对数据长度有限制,所以这里记录另外一种生成下拉框的方式
1 excel是怎么添加下拉候选框的
- 在sheet2页中选择一列添加数据
- 选中这些数据,选择公式->名称管理器->新建,新建一个名称管理器,名称随意,但是不要有特殊字符,可以看到引用位置会自动填充为选中的数据
- 在sheet1页中选择某一个单元格,选中,然后选择数据验证->序列,在来源处输入=名称管理器的名字
- 在将sheet2页隐藏
2 java代码怎么添加下拉候选框
先说下参数
1.constraint 是下拉框的数据,因为可能有多个,所以是List。map里存储的数据分别是col 表示在第几列上加下拉框,list表示下拉数据
2.workbook
3.sheet,需要加校验的sheet
4. 起始行
5. 结束行
这个方法大概就是将你要在sheet1页中加的下拉框,在sheet2页中创建出来,并且在sheet1页你要在第1列加,那么在sheet2页相应的列创建数据,并且创建名称管理器,在赋值给sheet1页中需要下拉框的列,其实就是上边动图的过程。
public static void setConstraint(final List<Map<String, Object>> constraint, final Workbook workbook, Sheet sheet,
final int startRow,
final int lastRow) {
//创建一个专门用来存储下拉列表信息的隐藏sheet页,
String hideSheetName = "sheet2";
//这一步用来确保没有与hideSheetName重名的sheet
while (workbook.getSheet(hideSheetName) != null) {
hideSheetName = hideSheetName + new Random().nextInt(100);
}
final Sheet hidden = workbook.createSheet(hideSheetName);
Cell cell = null;
for (final Map<String, Object> map : constraint) {
final Integer col = (Integer) map.get("col");
final List<String> everyConstraint = (List<String>) map.get("list");
if (everyConstraint.size() > 0) {
//遍历,将数据取出来放到新sheet的单元格中
for (int i = 0, length = everyConstraint.size(); i < length; i++) {
//取出数组中的每个元素
final String name = everyConstraint.get(i);
//根据i创建相应的行对象
final Row row = hidden.getRow(i) == null ? hidden.createRow(i) : hidden.getRow(i);
//创建每一行中的第col个单元格
cell = row.createCell(col);
//然后将元素赋值给这个单元格
cell.setCellValue(name);
}
// 设置名称引用的公式
final String a = EasyPoiDropDownUtil.getColumn(col);
// 创建名称,可被其他单元格引用
final Name namedCell = workbook.createName();
namedCell.setNameName(hideSheetName + col);
namedCell.setRefersToFormula(
hideSheetName + "!$" + a + "$1:$" + String.valueOf(a) + "$"
+ everyConstraint.size());
final CellRangeAddressList regions = new CellRangeAddressList(startRow,
lastRow, col, col);
//给sheet页加下拉框校验
if (sheet.getSheetName().equals(hideSheetName)) {
break;
}
final XSSFDataValidationHelper dvHelper =
new XSSFDataValidationHelper((XSSFSheet) sheet);
//加载数据,将名称为hidden的sheet中的数据转换为List形式
final XSSFDataValidationConstraint dvConstraint =
(XSSFDataValidationConstraint) dvHelper.createFormulaListConstraint(hideSheetName + col);
final XSSFDataValidation validation =
(XSSFDataValidation) dvHelper.createValidation(dvConstraint, regions);
validation.setShowErrorBox(true);
//将数据赋给下拉列表
sheet.addValidationData(validation);
}
}
//将hidden sheet设置为隐藏 调试时可以注释掉
workbook.setSheetHidden(workbook.getSheetIndex(hideSheetName), true);
}
public static String getColumn(int col) {
if (col < 0) {
return null;
}
String columnStr = "";
do {
if (columnStr.length() > 0) {
col--;
}
columnStr = ((char) ((col % 26) + 'A')) + columnStr;
col = col / 26;
} while (col > 0);
return columnStr;
}
3 一个完整的例子
完整的代码在github上,这个工程的dropdown包
https://github.com/ws378894183/hope/tree/master/easypoi-validation