POI导出Excel时,下拉列表值长度过长会报错,解决代码如下:
1.多创建一个sheet存储下拉框的内容名为hidden,
2.从hidden表中加载数据并引用到下拉框
3.隐藏hidden
HSSFWorkbook workbook = new HSSFWorkbook();//从流内容创建Workbook对象 ISheet sheet = workbook.CreateSheet("Sheet1");//创建工作表 #region 所属分级 //设置生成下拉框的行和列 CellRangeAddressList cellRegionsLevel = new CellRangeAddressList(1, 60000, 12, 12); //设置 下拉框内容 DVConstraint constraintcLevel = DVConstraint.CreateExplicitListConstraint( levelNames.ToArray()); ISheet hidden = workbook.CreateSheet("hidden"); string[] productNameArray = levelNames.ToArray(); //创建单元格对象 ICell cell = null; //遍历我们上面的数组,将数据取出来放到新sheet的单元格中 for (int i = 0, length = productNameArray.Length; i < length; i++) { //取出数组中的每个元素 String name = productNameArray[i]; //根据i创建相应的行对象(说明我们将会把每个元素单独放一行) IRow row1 = hidden.CreateRow(i); //创建每一行中的第一个单元格 cell = row1.CreateCell(0); //然后将数组中的元素赋值给这个单元格 cell.SetCellValue(name); } IName namedCell = workbook.CreateName(); namedCell.NameName = "hidden"; // 设置名称引用的公式 namedCell.RefersToFormula = "hidden!$A$1:$A$" + productNameArray.Length; //加载数据,将名称为hidden的sheet中的数据转换为List形式 DVConstraint constraintlever = DVConstraint.CreateFormulaListConstraint("hidden"); // 设置第一列的3-65534行为下拉列表 // (3, 65534, 0, 0) ====> (起始行,结束行,起始列,结束列) CellRangeAddressList regions = new CellRangeAddressList(1, 60000, 12, 12); // 将设置下拉选的位置和数据的对应关系 绑定到一起 HSSFDataValidation dataValidation = new HSSFDataValidation(regions, constraintlever); //将第二个sheet设置为隐藏 workbook.SetSheetHidden(1, true); //将数据赋给下拉列表 sheet.AddValidationData(dataValidation);