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

一:生成课程列表,并放置在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. C++编程优化心得(持续更新)

    1. 对齐原则.比如64位总线,每次寻址读取8B.编程时注意变量地址,尽量消耗总线最少的寻址次数.堆内存申请时,系统严格按照对齐原则分配,故而使用时候也尽量不要跨寻址边界. 2. 需要的时候,可为了效 ...

  2. const 放在函数后

    const 放在函数后表示这个函数是常成员函数, 常成员函数是不能改变成员变量值的函数.const 限定符,它把一个对象转换成一个常量.举例:为了使成员函数的意义更加清楚,我们可在不改变对象的成员函数 ...

  3. 关于oracle的rowid

    oracle数据库中表的每一行(元组)均有一个rowid,它是数据的详细地址,通过rowid,oracle可以快速的定位某行具体的数据的位置. ROWID可以分为物理rowid和逻辑rowid两种.普 ...

  4. iOS流量精灵完结版

    从一开始的激动,到现在的三期完结持续了将近三个半月时间,心态也开始变的坦然. 开发期间没有兑现自己的若言,没有写下所有的感悟和困难.我没有借口可言,唯一能说的只能说自己太懒....哈哈 总体来说流量监 ...

  5. php dirname(__FILE__) 获取当前文件的绝对路径 (转)

    比如当前文件是放在(d:\www\)下,文件名是test.php. 测试的代码如下: 复制代码 代码如下: <?php echo __FILE__ ; // 取得当前文件的绝对地址,结果:D:\ ...

  6. HDU 4734 F(x)

    这题可能非递归版好写? #include<iostream> #include<cstdio> #include<cstring> #include<algo ...

  7. 寻找研究基于NS2研究覆盖网络的小伙伴:)

    如题,本人菜鸟刚刚入门,想找些基于NS2研究覆盖网络方面的小伙伴,具体点是关于覆盖网络中QoS服务调度方法方面的,有的小伙伴可以留下联系方式,或者加我QQ:245939069  :P:P:P

  8. Nice Sequence_线段树***

    Description Let us consider the sequence a1, a2,..., an of non-negative integer numbers. Denote as c ...

  9. 【转】精心推荐几款超实用的 CSS 开发工具

    原文转自:http://www.html5cn.org/article-5741-1.html 摘要: 当你开发一个网站或 Web 应用程序的时候,有合适的工具,绝对可以帮助您节省大量的时间.在这篇文 ...

  10. HTML的总结

    一.Html简介    HTML 是一种标记语言       忽略大小写,语法宽松    使用 HTML 标记和元素,可以:       控制页面和内容的外观       发布联机文档       使 ...