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);

转自https://chenhongliang.blog.csdn.net/article/details/103047523?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-103047523-blog-40505705.pc_relevant_paycolumn_v3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-103047523-blog-40505705.pc_relevant_paycolumn_v3&utm_relevant_index=1

posted on 2022-06-29 16:40  叶子牛牛  阅读(907)  评论(0编辑  收藏  举报