基础的创建 以及将数据存入其中就不写了 直接开始正文
string[] Nunarry = dt2.AsEnumerable().Select(d => d.Field<string>("Text")).ToArray();
//下拉框数据源 这里我是从一个datatable取到的
NPOI.SS.Util.CellRangeAddressList regions = new NPOI.SS.Util.CellRangeAddressList(1, 65535, 1, 1);
//行.最大数量 列,控制你要的下拉框位置。
DVConstraint constraint = DVConstraint.CreateFormulaListConstraint("Nunarry");
HSSFDataValidation dataValidate = new HSSFDataValidation(regions, constraint);
sheet1.AddValidationData(dataValidate);
//绑定数据源 并且填充。 这样便完成了一个下拉框的创建
如果是xssf的话格式会有些变动 不过设置约束还是一样的 如下
//XSSFDataValidationHelper helper = new XSSFDataValidationHelper((XSSFSheet)sheet1); //XSSFDataValidationConstraint constraint = new XSSFDataValidationConstraint(Nunarry); //IDataValidation dataValidate = helper.CreateValidation(constraint, regions); //sheet1.AddValidationData(dataValidate);
然后如果你用的xssf格式那么最后在导出时 最好重写一个文件流 如下
public class NpoiMemoryStream : MemoryStream { public NpoiMemoryStream() { AllowClose = true; } public bool AllowClose { get; set; } public override void Close() { if (AllowClose) base.Close(); } }
不然可能会出现无法访问已经被关闭的文件流的错误
hssf导出为
System.IO.MemoryStream ms = new System.IO.MemoryStream();
//var ms = new NpoiMemoryStream(); //ms.AllowClose = false; book.Write(ms); //ms.Flush(); ms.Seek(0, SeekOrigin.Begin); //ms.AllowClose = true; //return File(ms, "application/vnd.ms-excel", strdate + "aaa.xlsx"); return File(ms, "application/octet-stream", strdate + "aaa.xls");
注释掉的则是xssf下应该写的 。导出xlsx需要手动控制。
然后就是重点 下拉框超过255的解决方法 也是从网上大神借鉴的
新建一个sheet
NPOI.SS.UserModel.ISheet sheet2 =book.CreateSheet("sheet2");
NPOI.SS.UserModel.IRow row2 = sheet2.CreateRow(0);
将想要展示的数据写入sheet2中 记得弄成list或者在取的时候让其只有一列 虽然后面指定数据源时也能指定 但是当 数据过多的时候会很慢。
然后操纵如下
IName range=book.CreateName();
range.RefersToFormula = "sheet2!$A$1:$A$"+dt2.Rows.Count;
//dt2是我的取到的数据 然后我的下拉框的数据自然是从第一行到数据的最后一行
range.NameName = "dicRange";//方便后面指定数据源
之后的步骤则都与之前相同 不过讲我之前绑定的 数据中的数组改为重新命名的name。
之前在网上找资料时发现大部分都是 HSSFNAME range = 。。。如此 然后我这么写后遇到了 无法将iname转换的情况 看了下可能是npoi版本造成的差异
如果你的是高版本的npoi 那么可以如下
HSSFName range=book.CreateName();range.Refence="sheet2!$A$1:$A$"+dt2.Rows.Count;
完
第一篇博客 排版问题很大 用的不是很习惯请谅解 .net 新人一枚 同时也会一点js