C#使用NPOI设置Excel下拉选项
作者:风萧萧萧兮 发布时间:2022-11-28 07:05:39
标签:C#,Excel,下拉选项
本文实例为大家分享了C#使用NPOI设置Excel下拉选项的具体代码,供大家参考,具体内容如下
最近在做一个导出模板的功能,需要限制用户的某些单元格输入的内容。
期望达到的效果:单元格中出现下拉选择,或输入错误时提示。
翻阅了许多资料,终于得到了答案。
然后自己整理下边一些方法,记录下来方便以后使用。
第一种
· 直接设置下拉值,不超过255个字符(优点:逻辑简单 ;缺点:有字符限制)
· 适用于下拉值为固定值,例如:状态、性别等
方法块:
public static void SetCellDropdownList(ISheet sheet, int firstcol, int lastcol, string[] vals)
{
//设置生成下拉框的行和列
var cellRegions = new CellRangeAddressList(1, 65535, firstcol, lastcol);
//设置 下拉框内容
DVConstraint constraint = DVConstraint.CreateExplicitListConstraint(vals);
//绑定下拉框和作用区域,并设置错误提示信息
HSSFDataValidation dataValidate = new HSSFDataValidation(cellRegions, constraint);
dataValidate.CreateErrorBox("输入不合法", "请输入或选择下拉列表中的值。");
dataValidate.ShowPromptBox = true;
sheet.AddValidationData(dataValidate);
}
调用:
HSSFWorkbook workbook = new HSSFWorkbook();
ISheet sheet = workbook.CreateSheet("sheet1");
ExcelHelper.SetCellDropdownList(sheet, 1, 1, new List<string>() { "男", "女", "保密" }.ToArray());
第二种
· 通过绑定值到sheet中设置下拉
· 适用于数据较多,或灵活控制的值,例如:城市区域、数据表信息等。
方法块:
public static void SetCellDropdownList(HSSFWorkbook workbook, ISheet sheet, string name, int firstcol, int lastcol, string[] vals, int sheetindex = 1)
{
//先创建一个Sheet专门用于存储下拉项的值
ISheet sheet2 = workbook.CreateSheet(name);
//隐藏
workbook.SetSheetHidden(sheetindex, true);
int index = 0;
foreach (var item in vals)
{
sheet2.CreateRow(index).CreateCell(0).SetCellValue(item);
index++;
}
//创建的下拉项的区域:
var rangeName = name + "Range";
IName range = workbook.CreateName();
range.RefersToFormula = name + "!$A$1:$A$" + index;
range.NameName = rangeName;
CellRangeAddressList regions = new CellRangeAddressList(0, 65535, firstcol, lastcol);
DVConstraint constraint = DVConstraint.CreateFormulaListConstraint(rangeName);
HSSFDataValidation dataValidate = new HSSFDataValidation(regions, constraint);
dataValidate.CreateErrorBox("输入不合法", "请输入或选择下拉列表中的值。");
dataValidate.ShowPromptBox = true;
sheet.AddValidationData(dataValidate);
}
调用:
HSSFWorkbook workbook = new HSSFWorkbook();
ISheet sheet = workbook.CreateSheet("sheet1");
var roomTypeList = GetRoomTypeNameList();
ExcelHelper.SetCellDropdownList(workbook, sheet, "RoomTypeDictionary", 1, 1, roomTypeList.ToArray());
另外,延伸联动下拉(直接贴源码了)
方法块:
private void SetCityCellDropdownList(HSSFWorkbook workbook, ISheet sheet, string dictionaryName, int citycol, int areacol, int sheetIndex)
{
var citylist = GetCityList();
int citycount = citylist.Count;
ISheet sheet2 = workbook.CreateSheet(dictionaryName);
//隐藏
workbook.SetSheetHidden(sheetIndex, true);
#region 城市区域数据构造
//城市
int rowIndex = 0;
foreach (var item in citylist)
{
IRow row = sheet2.CreateRow(rowIndex);
row.CreateCell(0).SetCellValue(item.Name);
rowIndex++;
}
//区域
int n_rowIndex = 0;
foreach (var item in citylist)
{
int areaIndex = 0;
foreach (var area in item.AreaList)
{
IRow row = sheet2.GetRow(areaIndex);
if (row == null)
{
row = sheet2.CreateRow(areaIndex);
}
row.CreateCell(n_rowIndex + 1).SetCellValue(area.Name);
areaIndex++;
}
n_rowIndex++;
}
#endregion
#region 设置数据字段范围
//定义城市
int columnIndex = 1;
IName range_Country = workbook.CreateName();
range_Country.RefersToFormula = string.Format("{0}!${1}$1:${1}${2}", dictionaryName, GetExcelColumnName(columnIndex), citycount);
range_Country.NameName = "城市";
//定义区
foreach (var item in citylist)
{
int areacount = item.AreaList.Count;
columnIndex++;
IName range_area = workbook.CreateName();
range_area.RefersToFormula = string.Format("{0}!${1}$1:${1}${2}", dictionaryName, GetExcelColumnName(columnIndex), areacount);
range_area.NameName = item.Name;
}
//城市列表下拉绑定
ExcelHelper.SetCellDropdownList(sheet, 1, 65535, citycol, citycol, "城市");
//第二列,跟随第一列联动
string colName = GetExcelColumnName(areacol);
for (int j = 1; j < 500; j++)
{
ExcelHelper.SetCellDropdownList(sheet, j, j, areacol, areacol, string.Format("INDIRECT(${0}${1})", colName, j + 1));
}
#endregion
}
private string GetExcelColumnName(int columnNumber)
{
int dividend = columnNumber;
string columnName = String.Empty;
int modulo;
while (dividend > 0)
{
modulo = (dividend - 1) % 26;
columnName = Convert.ToChar(65 + modulo).ToString() + columnName;
dividend = (int)((dividend - modulo) / 26);
}
return columnName;
}
public static void SetCellDropdownList(ISheet sheet, int firstRow, int lastRow, int firstCol, int lastCol, string name)
{
CellRangeAddressList regions = new CellRangeAddressList(firstRow, lastRow, firstCol, lastCol);
DVConstraint constraint = DVConstraint.CreateFormulaListConstraint(name);
HSSFDataValidation dataValidate = new HSSFDataValidation(regions, constraint);
dataValidate.CreateErrorBox("输入不合法", "请输入或选择下拉列表中的值。");
sheet.AddValidationData(dataValidate);
}
调用:
HSSFWorkbook workbook = new HSSFWorkbook();
ISheet sheet = workbook.CreateSheet("sheet1");
SetCityCellDropdownList(workbook, sheet, "CityDictionary", 1, 2, 1);
来源:https://blog.csdn.net/u011958513/article/details/78624036


猜你喜欢
- 今天使用jenkins构建时,报以下错误[ERROR] Failed to execute goal on project saas20:
- 本文为大家汇总了Android Studio ADB网络调试的使用方法,供大家参考,具体内容如下随着技术的发展,现在的安卓手机大部分开始使用
- 文件上传下载前台:1. 提交方式:post2. 表单中有文件上传的表单项: <input type=”file” />3. 指定
- design包的出现,Android界面发生了巨大变化,各种滑动配合的效果,下面我就粘性滑动中的一种进行自定义,效果图如下: 大家看到效果了
- 一、什么是状态管理大到整个app的状态,用户使用app是登录状态,还是游客状态;小到一个按钮的状态,按钮是点击选中状态还是未点击状态等等,这
- 本文所要介绍的简易天气App主要用RxAndroid、MVP、Retrofit实现,首先来看看效果:主页内容:右侧栏天气列表:左侧栏城市列表
- SpeSqliteManager4Android改动日志2023.2.14 完成SQLiteOpenHelper 2023.2.23 完成r
- 本来就是基础知识,不能丢的太干净,今天竟然花了那么长的时间才写出来,记一下。有如下的一颗完全二叉树:先序遍历结果应该为:1 2&
- 前言Java8新特性java.time.*包学习。 自从java发布模式变更就发现自己有些跟不上他们的速度,java8还有不少没有用透而9、
- 重新认识 Java 的 System.in以前也写过不少命令行的程序,处理文件时总需要通过参数指定路径,直到今天看资料时发现了一种我自己从来
- 前言我们在上一篇文章 中以实例讲解如何定义和使用 lambda 表达式,以及与其它语言相比,lambda 表达式在 Java 中的特殊规范。
- 在项目开发中,经常碰到map转实体对象或者对象转map的场景,工作中,很多时候我们可能比较喜欢使用第三方jar包的API对他们进行转化,而且
- 为了提升编译速度,这几天用上了 AS 3.0 和 Gradle 3.0 插件,不得不说不论是 AS 3.0,还是 Gradle 3.0 都变
- 上一次说了如何收集我们已经发布的应用程序的错误信息,方便我们调试完善程序。上次说的收集方法主要是把收集的信息通过Http的post请求把相关
- 过滤器实现过滤器需要实现 javax.servlet.Filter 接口。重写三个方法。其中 init()&n
- 直接进入主题先来看一个栗子,假设现在有一个第三方dllnamespace TestLibrary1{ p
- 本文研究的主要是优化MyBatis配置文件中的配置的相关内容,具体介绍如下。一、连接数据库的配置单独放在一个properties文件中之前,
- 有时候,根据业务逻辑的需求,我们想要获取到某个接口的所有实现类。在这里大致介绍两种方式:1.借助Spring容器实现Spring作为一个容器
- 0 写在前面相信用过相机的同学都知道虚化特效,这是一种使焦点聚集在拍摄主题上,让背景变得朦胧的效果,例如本文最后实现的背景虚化效果相机虚化特
- 公司app要求做一个扭蛋功能,其实就是一个可拖动层叠卡片列表,原理还是由一个自定义Recyclerview和LayoutManager来实现