您的位置:首页 > 其它

npoi的下拉框操纵 以及数据读取 以及下拉框字符超过255的解决方法 不需要高版本excel

2018-01-18 11:39 417 查看
基础的创建 以及将数据存入其中就不写了  直接开始正文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

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  npoi excel 255
相关文章推荐