客户提出能否将导入模板中,课程一列添加下拉框方便选择,不用手输入,以减少输入错误的可能性。于是在网上找了点代码,稍加整理后,形成了以下方案,代码部分:

一:生成课程列表,并放置在excel的单独sheet中。

IList<CourseCodeInfo> list = StudentBus.GetSubjectInterface().GetList(0, "", "Name");

var CourseSheetName = "Course";
var RangeName = "dicRange"; ISheet CourseSheet = workbook.CreateSheet(CourseSheetName); CourseSheet.CreateRow(0).CreateCell(0).SetCellValue("课程列表(用于生成课程下拉框,请勿修改)"); for (var i = 1; i < list.Count; i++)
{
CourseSheet.CreateRow(i).CreateCell(0).SetCellValue(list[i-1].Name);
}

二:生成一个列表引用区域,方便需要的的地方加载这个引用区域。

IName range = workbook.CreateName();
range.RefersToFormula = string.Format("{0}!$A$2:$A${1}",CourseSheetName,list.Count.ToString());
range.NameName = RangeName;
三:引用以上生成的引用区域。
 
CellRangeAddressList regions = new CellRangeAddressList(1, 65535,4, 4);
DVConstraint constraint = DVConstraint.CreateFormulaListConstraint(RangeName);
HSSFDataValidation dataValidate = new HSSFDataValidation(regions, constraint);
sheet.AddValidationData(dataValidate);

备注:代码区域二和网上的代码略有不同,网上代码一般为:

HSSFName range = hssfworkbook.CreateName();
range.Reference = "ShtDictionary!$A1:$A3";
range.NameName = "dicRange";

但在实际编写代码过程中,发现Hssfworkbook.CreateName()生成的是IName,无法直接转换为HSSFName,于是改为:

IName range = workbook.CreateName();
 range.RefersToFormula = string.Format("{0}!$A$2:$A${1}",CourseSheetName,list.Count.ToString());
 range.NameName = RangeName;

运行也正常,奇怪为什么和网上代码不同呢?估计与NOPI版本有关吧。

后记:近期有园子里的朋友问有无源代码,我就将原来的代码找出来,贴在下面,供各位参考(代码写的久远,请勿见笑)。

        public ActionResult GetExcelTeacherClassTemplate()
{
HSSFWorkbook workbook = new HSSFWorkbook();
ISheet sheet = workbook.CreateSheet("sheet1"); IRow row = sheet.CreateRow();
row.CreateCell().SetCellValue("姓名");
row.CreateCell().SetCellValue("身份证号");
row.CreateCell().SetCellValue("年级");
row.CreateCell().SetCellValue("班级");
row.CreateCell().SetCellValue("课程");
row.CreateCell().SetCellValue("角色(班主任、单科老师)"); IRow row1 = sheet.CreateRow();
row1.CreateCell().SetCellValue("张峰");
row1.CreateCell().SetCellValue("");
row1.CreateCell().SetCellValue("小学六年级");
row1.CreateCell().SetCellValue("4班");
row1.CreateCell().SetCellValue("语文");
row1.CreateCell().SetCellValue("单科老师"); var ic = workbook.CreateCellStyle();
ic.DataFormat = HSSFDataFormat.GetBuiltinFormat("@"); sheet.SetDefaultColumnStyle(, ic); sheet.SetColumnWidth(, );
sheet.SetColumnWidth(, );
sheet.SetColumnWidth(, );
sheet.SetColumnWidth(, ); IList<CourseCodeInfo> list = StudentBus.GetSubjectInterface().GetList(, "", "Name");
var CourseSheetName = "Course";
var RangeName = "dicRange";
ISheet CourseSheet = workbook.CreateSheet(CourseSheetName);
CourseSheet.CreateRow().CreateCell().SetCellValue("课程列表(用于生成课程下拉框,请勿修改)");
for (var i = ; i < list.Count; i++)
{
CourseSheet.CreateRow(i).CreateCell().SetCellValue(list[i-].Name);
} IName range = workbook.CreateName();
range.RefersToFormula = string.Format("{0}!$A$2:$A${1}",CourseSheetName,list.Count.ToString());
range.NameName = RangeName;
//
CellRangeAddressList regions = new CellRangeAddressList(, ,, );
DVConstraint constraint = DVConstraint.CreateFormulaListConstraint(RangeName);
HSSFDataValidation dataValidate = new HSSFDataValidation(regions, constraint);
sheet.AddValidationData(dataValidate); System.IO.MemoryStream ms = new System.IO.MemoryStream();
workbook.Write(ms);
Response.AddHeader("Content-Disposition", "attachment; filename=" + Server.UrlEncode("教师授课模板.xls"));
Response.BinaryWrite(ms.ToArray());
workbook = null;
ms.Close();
ms.Dispose();
return null;
}

NPOI生成单元格(列)下拉框的更多相关文章

  1. NPOI 生成Excel (单元格合并、设置单元格样式:字段,颜色、设置单元格为下拉框并限制输入值、设置单元格只能输入数字等)

    NPIO源码地址:https://github.com/tonyqus/npoi NPIO使用参考:源码中的 NPOITest项目 下面代码包括: 1.包含多个Sheet的Excel 2.单元格合并 ...

  2. java swing 中JTable实现指定单元格为下拉框

    利用自定义的CellEditor实现第四列第二行为下拉框,本列其余行为文本框 利用默认的DefaultCellEditor设置第五列整列为下拉框   package mypackage; import ...

  3. 【Excel】单元格的下拉框是怎么做的?

    如果我们希望将产品这一列的每个单元格都能选择 左侧的产品就好了,就像这样 这里使用的是"验证数据有效性"功能 在这里: 点击F,选择F列后,打开“数据验证”,如图,选择序列,选择来 ...

  4. C# Winform 中DataGridView 实现单元格输入下拉框功能

    https://blog.csdn.net/ad13adsa/article/details/82108969 private void dataGridViewX1_EditingControlSh ...

  5. LibreOffice/Calc:单元格设置下拉菜单

     造冰箱的大熊猫,本文适用于LibreOffice Calc 5.1.6.2 + Ubuntu 16.04@cnblogs 2019/1/2 LibreOffice是一个类似Microsoft Off ...

  6. POI设置excel添加列下拉框

    POI在生成excel模板时需要为列添加下拉框,我写了两个方法. @ 方法一:适用任何情况,不受下拉框值数量限制.但是需要通过引用其它列值. 思路大概如下: 1.创建一个隐藏的sheet页,用于存放下 ...

  7. Java使用poi生成Excel,生成两种表格下拉框

    想要使用POI操作以xsl结尾的Excel,首先要下载poi相关的jar包,用到的jar有: poi-3.9.jar poi-ooxml-3.9.jar poi-ooxml-schemas-3.9.j ...

  8. js生成tree形组织机构下拉框

    1.首先我们正常数据是如下所示: [ { id: 1, pid: 0, name: '公司组织' }, { id: 2, pid: 1, name: '总经办' }, { id: 3, pid: 1, ...

  9. Excel的单元格设置下拉选项并填充颜色

    如何在Excel的单元格中加入下拉选项   方法/步骤     第一步:打开excel文档,选中需加入下拉选项的单元格.      第二步:点击菜单中的“数据”->“数据有效性”->“数据 ...

随机推荐

  1. 第一个Java web项目:员工管理系统

    要求: 做一个登陆页面,实现登录,用户名和密码都是admin,登录成功后,用session记录用户名,登录失败,请提示失败原因. 做一个简单的管理系统,实现注册,修改,查询,删除 员工的功能,注册内容 ...

  2. 学习Django

    1.安装 命令:pip install Django 安装慢且有异常:HTTPSConnectionPool(host='pypi.python.org', port=443): Read timed ...

  3. bzoj1211: prufer序列 | [HNOI2004]树的计数

    题目大意: 告诉你树上每个节点的度数,让你构建出这样一棵树,问能够构建出树的种树 这里注意数量为0的情况,就是 当 n=1时,节点度数>0 n>1时,所有节点度数相加-n!=n-2 可以通 ...

  4. golang——channel笔记

    1.for i := range channel { //... } 相当于 循环进行 i<-channel,直至close(channel) 2. · 给一个 nil channel 发送数据 ...

  5. 去掉安卓中activity的标题栏

    去掉所有Activity界面的标题栏 修改AndroidManifest.xml 在application 标签中添加android:theme="@android:style/Theme. ...

  6. ajax对象属性withCredentials

    默认情况下,ajax跨源请求不提供凭据(cookie.HTTP认证及客户端SSL证明等).通过将设置ajax的withCredentials属性设置为true,可以指定某个请求应该发送凭据.如果服务器 ...

  7. github的注册过程

    带着疑问打开了github.这是一个神奇的网站,因为它到处都是英语,对于我这种英语盲这简直太痛苦了.借助了百度翻译,我还是马马虎虎的完成了github的制作. 首先在它的登录界面下面有一个sign u ...

  8. 三部曲一(数据结构)-1024-Eqs

    解方程整数解的题,通过这道题我学会了这种题的一般做法,对于未知数较少.取值范围较小且解为整数的方程,把一半的未知数移到等式的另一边,然后对两边分别枚举,用哈希配对,如果有相同的结果就找到一组解.具体做 ...

  9. UVA 10801 Dij最短路(改模板)

    题意:有n个电梯,目的地是第K层(起点是第0层),给出每个电梯的速度,以及每个电梯能到达的层数,如果中途需要换电梯的话,时间需要+60,求到达目的地的最短时间: 思路:Dij求最短路.如果是另一条路比 ...

  10. 深入解析Javascript闭包

    首先给个例子: function PfnOuter(){ var num=999; function PfnInner(){ alert(num); } return PfnInner; } var ...