-
导出excel报错:A valid formula or a list of values must be less than or
equal to 255 characters (including separators).
报错信息
-
报错原因:
Excel导出下拉字符超出255字符
-
解决思路:
通过创建新的sheet,然后从新的sheet读取数据,可以实现多个下拉框参数
-
详细代码:
/**
* 在给定的 sheet 上新建 sheet 页并设置下拉框数据。
*
* @param sheet 表格对象
* @param hiddenSheetName 下拉框 sheet 名称
* @param values 下拉框的值
* @param firstCol 起始列号
* @param lastCol 终止列号
*/
public static void setDropDownBox(XSSFSheet sheet, String hiddenSheetName, String[] values, Integer firstCol, Integer lastCol) {
// 获取所有 sheet 页个数
int sheetTotal = sheet.getWorkbook().getNumberOfSheets();
if (values != null && values.length != 0) {
// 新建一个 sheet 页
XSSFSheet hiddenSheet = sheet.getWorkbook().getSheet(hiddenSheetName);
if (hiddenSheet == null) {
hiddenSheet = sheet.getWorkbook().createSheet(hiddenSheetName);
// 写入下拉数据到新的 sheet 页中
for (int i = 0; i < values.length; i++) {
XSSFRow row = hiddenSheet.createRow(i);
XSSFCell cell = row.createCell(0);
cell.setCellValue(values[i]);
}
// 将新建的 sheet 页隐藏掉
sheet.getWorkbook().setSheetHidden(sheetTotal, true);
log.info("已创建并隐藏下拉框 sheet '{}'", hiddenSheetName);
}
// 获取新 sheet 页内容
String strFormula = hiddenSheetName + "!$A$1:$A$65535";
XSSFDataValidationConstraint constraint = new XSSFDataValidationConstraint(DataValidationConstraint.ValidationType.LIST, strFormula);
// 设置数据有效性加载在哪个单元格上,四个参数分别是:起始行、终止行、起始列、终止列
CellRangeAddressList regions = new CellRangeAddressList(1, 65535, firstCol, lastCol);
// 数据有效性对象
DataValidationHelper help = new XSSFDataValidationHelper(hiddenSheet);
DataValidation validation = help.createValidation(constraint, regions);
// 适配 xlsx(用于设置是否显示下拉箭头)
validation.setSuppressDropDownArrow(true);
//(如果设置为 true,则会在用户输入不符合数据有效性规则的数据时弹出错误提示框)
validation.setShowErrorBox(true);
// 将数据有效性添加到指定的工作表
sheet.addValidationData(validation);
log.info("已向 sheet '{}' 的列 {} 到 {} 添加下拉框验证。", sheet.getSheetName(), firstCol, lastCol);
} else {
log.warn("下拉框的值为 null 或为空。未向 sheet '{}' 添加验证。", sheet.getSheetName());
}
}