需求
给指定列添加下拉列表。如下图:
思路
- NPOI的文档网站不能访问了,这里参考的POI文档。
- 加下拉列表有两种方式,一种直接写字符串,例如
new String[]{"10", "20", "30"})
。这种方式限制最大长度255. - 第二种引用其他单元格。本例中采取的这种方式。新建一个Sheet,将所有选项填入其中。如图中第一行是客户信息,第二行为付款方式信息等等。
代码
/// <summary>
/// The add validation.
/// </summary>
/// <param name="sheet">
/// 要加入列表的sheet
/// </param>
/// <param name="itemSheet">
/// 选项 sheet.
/// </param>
/// <param name="headerCell">
/// 标题单元格
/// </param>
/// <param name="items">
/// 列表项
/// </param>
private static void AddValidation(ISheet sheet, ISheet itemSheet, ICell headerCell, List<string> items)
{
// 新建行
var row = itemSheet.CreateRow(itemSheet.PhysicalNumberOfRows);
// 新行中写入选项
for (int i = 0; i < items.Count; i++)
{
var cell = row.CreateCell(i);
cell.SetCellValue(items[i]);
}
// 要加下拉列表的范围
var addressList = new CellRangeAddressList(
headerCell.RowIndex + 1,
65535,
headerCell.ColumnIndex,
headerCell.ColumnIndex);
var dvHelper = sheet.GetDataValidationHelper();
// 格式 Sheet2!$A$1:$E$1
var dvConstraint = dvHelper.CreateFormulaListConstraint(
$"{itemSheet.SheetName}!$A${row.RowNum + 1}:${Common.Util.NumberToLetter(items.Count)}${row.RowNum + 1}");
var validation = dvHelper.CreateValidation(dvConstraint, addressList);
// 强制必须填下拉列表给出的值
// validation.ShowErrorBox = true;
sheet.AddValidationData(validation);
}
调用以客户列举例
// 获取客户列表
var list = new CustomerBll().GetModelList("dr = 0");
var items = list.Select(c => c.cusname).ToList();
// 添加下拉
AddValidation(sheet, itemsSheet, headerRow.Cells.First(c => c.StringCellValue == "客户名称"), items);
参考资料: