背景

导出Excel其实是很常见的,但以前就是很简单将数据导出到Excel,做的最多的就是文字居中、栏位自适应、设置数据类型,其实很少会有设置Excel下拉这种,但用户的需求,而且这也算是Excel比较常用的,所以只能百度啦!

环境

  • VS2019  .NET Core API

    • NPOI(2.5.3)

问题

由于我们导出的Excel是.xlsx格式,但参考的文章是.xls的,于是继续百度,后来找到了一个导出.xlsx的,然后把这两个文章的的精华综合了一下,于是我的两个格式的都可以用的方法出炉了!

核心代码

        #region Excel辅助导出public static void SetCellDropdownList(ISheet sheet, int firstcol, int lastcol, string[] vals){//設置生成下拉框的行和列var cellRegions = new CellRangeAddressList(1, 65535, firstcol, lastcol);IDataValidation validation = null;if (sheet.GetType().Name.Contains("XSSF")) // .xlsx{XSSFDataValidationHelper helper = new XSSFDataValidationHelper((XSSFSheet)sheet);//获得一个数据验证Helper  //IDataValidationvalidation = helper.CreateValidation(helper.CreateExplicitListConstraint(vals), cellRegions);//创建约束}else // HSSF .xls{//設置 下拉框內容DVConstraint constraint = DVConstraint.CreateExplicitListConstraint(vals);validation = new HSSFDataValidation(cellRegions, constraint);/*綁定下拉框和作用區域,並設置錯誤提示信息HSSFDataValidation dataValidate = new HSSFDataValidation(cellRegions, constraint);dataValidate.CreateErrorBox("輸入不合法", "請輸入或選擇下拉列表中的值。");dataValidate.ShowPromptBox = true;
*/}validation.CreateErrorBox("輸入不合法", "請輸入或選擇下拉列表中的值。");validation.ShowPromptBox = true;sheet.AddValidationData(validation);}#endregion

代码调用

我是对导出Excel的导出代码进行了自己的设置,所以我会构造一个Dictionary<int[], string[]> arrs 传入我的方法中,然后对它进行设置,你若是自己完整写的话,只需要用我屏蔽代码的那种写法就可以。


// 生成要传入的数据源
Dictionary<int[], string[]> arrs  = new Dictionary<int[], string[]>() {{ new[] { 2, 2 },  new[] { "深圳户籍", "广东省内非深户", "广东省外户籍" } },{ new[] { 5, 5 },  new[] { "布依族", "朝鲜族", "满族", "侗族", "瑶族", "白族", "土家族", "哈尼族", "哈萨克族", "傣族", "黎族", "傈僳族", "佤族", "畲族", "高山族", "拉祜族", "水族", "东乡族", "纳西族", "景颇族", "柯尔克孜族", "土族", "达斡尔族", "仫佬族", "羌族", "布朗族", "撒拉族", "毛南族", "仡佬族", "锡伯族", "阿昌族", "普米族", "塔吉克族", "怒族", "乌孜别克族", "俄罗斯族", "鄂温克族", "德昂族", "保安族", "裕固族", "京族", "塔塔尔族", "独龙族", "鄂伦春族", "赫哲族", "门巴族", "珞巴族", "基诺族", "其他" } }, { new[] { 13, 13 },  new[] { "一档医疗在职", "二档医疗", "三档医疗" } }};// 对数据源进行循环
if (arrs != null){foreach (var item in arrs){SetCellDropdownList(sheet, item.Key[0], item.Key[1], item.Value);//SetCellDropdownList(sheet, 1, 1, new[] { "深圳户籍", "广东省内非深户", "广东省外户籍" });//SetCellDropdownList(sheet, 1, 1, new List<string>() { "男", "女", "保密" }.ToArray());}}

Excel导出代码参考

其实之前打算优化一下导出的,后来还是没做。。。

#region  导出Excel/// <summary>/// 将DataTable转换成  Two dimensional Arrays二维数组[,];Jagged array交错数组[][]/// </summary>/// <param name="dt">数据源</param>/// <param name="filePath">@"D:\\TEMP\\EXCEL\\" + shhetName + ".xlsx";</param>public static string[,] DtToTwoDimensArr(DataTable dt){#region 填充数据string[,] dataArray = new string[1 + dt.Rows.Count, dt.Columns.Count];for (int i = 0; i < dt.Columns.Count; i++)//填写列名{dataArray[0, i] = dt.Columns[i].ColumnName;for (int j = 0; j < dt.Rows.Count; j++)//填入数据{dataArray[j + 1, i] = dt.Rows[j][i].ToString();}}return dataArray;#endregion通过NPOI组件写入Excel数据//TwoDimensArrToExcel(dataArray, "dataa.xlsx", dt.Rows.Count, dt.Columns.Count);}/// <summary>/// 将数据写入Excel/// </summary>/// <param name="dt"></param>/// <param name="filePath"></param>/// <param name="rowNum"></param>/// <param name="colNum"></param>/// <param name="arrs">设置下拉菜单</param>/// <returns></returns>public static byte[] TwoDimensArrToExcel(DataTable dt, string filePath, int rowNum, int colNum, Dictionary<int[], string[]> arrs = null){string[,] str = DtToTwoDimensArr(dt);//string sheetName = Path.GetFileNameWithoutExtension(filePath);IWorkbook workbook = null; //新建IWorkbook對象  if (filePath.IndexOf(".xlsx") > 0) // 2007版本 {workbook = new XSSFWorkbook(); //xlsx數據讀入workbook }else if (filePath.IndexOf(".xls") > 0) // 2003版本 {workbook = new HSSFWorkbook(); //xls數據讀入workbook }ISheet sheet = workbook.CreateSheet("Sheet1"); //创建第一個工作表 if (arrs != null){foreach (var item in arrs){SetCellDropdownList(sheet, item.Key[0], item.Key[1], item.Value);//SetCellDropdownList(sheet, 1, 1, new[] { "深圳户籍", "广东省内非深户", "广东省外户籍" });//SetCellDropdownList(sheet, 1, 1, new List<string>() { "男", "女", "保密" }.ToArray());}}for (int i = 0; i < str.GetLength(0); i++)// 行循环{IRow row = sheet.CreateRow(i);//创建一行数据for (int j = 0; j < str.GetLength(1); j++)// 列循环{row.CreateCell(j).SetCellValue(str[i, j]);}}byte[] buffer;using (MemoryStream ms = new MemoryStream()){workbook.Write(ms);buffer = ms.ToArray();ms.Close();}return buffer;}#endregion

参考文章

C#使用NPOI設置Excel下拉選項 – WalkonNet

Npoi导出Excel并设置下拉选择限制_unicorn_47的博客-CSDN博客_npoi.mapper 导出模板下拉列表

C#之NPOI设置Excel下拉相关推荐

  1. NPOI设置Excel下拉选项

    最近在做一个导出模板的功能,需要限制用户的某些单元格输入的内容. 期望达到的效果:单元格中出现下拉选择,或输入错误时提示. 翻阅了许多资料,终于得到了答案. 然后自己整理下边一些方法,记录下来方便以后 ...

  2. java实现设置Excel下拉框在使用Excel的时候用到了下拉框,实现的效果如下↓

    在使用Excel的时候用到了下拉框,实现的效果如下↓ 在生成excel文件时,需要根据给出的下拉框选项列表动态生成下拉框.实现代码如下: private void createSelect(XSSFW ...

  3. JAVA设置excel下拉框默认值,Java设置Excel数据验证(下拉列表)

    测试Excel表格设置数据下拉列表 /** * 功能描述: 测试Excel表格设置数据下拉列表 * * @author Jack_Liberty * @date 2021-02-21 16:30 */ ...

  4. WPS设置Excel下拉选项

    首先将鼠标移动需要设置下拉选项的列上,比如:下方红框圈起来的位置: 鼠标移动到此位置会出现向下的箭头,此时鼠标左键单击选中这一列,再按住Ctrl键同时鼠标左键点击题库类型这个单元格取消标题的选中,如下 ...

  5. 使用【宏】设置excel 下拉框可进行多选

    宏代码: Private Sub Worksheet_Change(ByVal Target As Range) ' Developed by Contextures Inc. ' www.conte ...

  6. Java17 POI5.2.0 Excel 下拉框 数据校验

    Java 设置Excel 下拉框.自定义数据校验 一.工具类 1.ExcelUtil 2.Pom 二.生成文件 1.下拉框 2.数据校验 三.Excel 命令 1.获取活动单元格:=INDIRECT( ...

  7. 解决POI的SXSSFSheet 创建excel下拉框,下拉框内容过多时不显示的问题

    1. 复现 :使用POI导出带下拉框的excel文件,如果下拉框内容过多,下拉框变为了空 2. 解决思路 : 导出时创建隐藏的sheet,下拉框的取值从隐藏的sheet中获取,下拉框显示正常 3. 记 ...

  8. Excel下拉框设置多选

    Excel下拉框一般只能单选,但有时候需要多选,多选的方法如下: 以office 2016中的excel为例: 1.数据验证入口 2.设置数据 3.sheet页右击查看代码 4.复制下面代码进去: 5 ...

  9. php下拉多选框,excel下拉框多选打勾的设置方法

    excel下拉框多选打勾的设置方法 一.显示"开发工具"选项卡.打开Excel2010,点击左上方"文件"图标.点击"选项",弹出" ...

最新文章

  1. linux tomcat apr安装,Linux下Tomcat安装并开启APR模式-Go语言中文社区
  2. 【转】Linux 命令行下的好东西:一些常用指令
  3. python9_Python9-前端基础知识-day47
  4. 一个U盘制作多个系统
  5. IDEA配置插件,插件使编程更快速
  6. Microsoft JScript提示‘DIRECT’未定义(2014-08-26记)
  7. fastboot下载慢的一种原因
  8. 微信棋牌平台开发架设HTML5手机端页面缩放搭建教程
  9. ubuntu进行apt-get时候出现Package xxx is not available, but is referred to by another package 错误
  10. 高级语言程序设计(c语言描述) 陆黎明 朱媛媛 练习答案,高级语言程序设计(c语言描述) 陆黎明 朱媛媛 练习答案...
  11. java mongo 条件查询_Java mongodb复杂多条件查询
  12. 使用 Windows XP 的外观风格
  13. (转载)最值得看的一维傅里叶分析(时域如何转频域)
  14. 【科软课程-信息安全】Lab7 Format String Vulnerability Lab
  15. Day 7(云计算-zsn)
  16. 探索AI实践最优解,AISummit全球人工智能技术大会完美落幕
  17. 数理统计10.15 | 幂律分布
  18. [Java 基础] 深入理解List的toArray()方法和toArray(T[] a)方法
  19. lol聊天服务器断开无法修复,英雄联盟无法聊天说话处理办法
  20. js siblings()处理选中高亮问题

热门文章

  1. easyUI中的linkbutton取文本及改变属性的方法
  2. 如何在Android中更改TextView的fontFamily
  3. c# xaml语言教程,c#学习之30分钟学会XAML
  4. 如何通过股票api接口l2获取股票数据?
  5. QT系统学习系列:1.2 PushButton(常规按钮)
  6. 计算机视觉与互动投影
  7. CorelDRAW VBA - 在图层上从文件创建一个新的OLE对象 Layer. CreateOLEObjectFromFile
  8. 社会责任审核-安全出口
  9. supports_CSS的@supports规则简介(功能查询)
  10. Java实现Excel文件读写