NPOI —— 开发问题
看不透你蒙着的面纱
一:发现不可读取内容是否恢复此工作簿内容?如果信任此工作簿的内容?请单击是:
1.很纳闷这个错误,因为得到的内容一看,没啥特别的,在不修改原来EXECL文件在这样操作,还是这种错误,网上说的是利用这段代码,即可解决,如下代码:
//此处会触发问题二,故需要改动,这就为何需要ms.Length
response.AddHeader("Content-Length", ms.Length.ToString());
//改动版本如下
response.AddHeader("Content-Length", ms.GetBuffer().Length.ToString());
2.如此依然没法解决,直到MemoryStream的另一个导出byte数组方法进入眼帘,问题得到解决,即使没有标明 Content-Length 也可,感觉网上这种答案过于儿戏,代码如下:
var bytes = ms.ToArray();
二:无法访问已关闭的流:
1.其实解决问题一,问题二根本不复存在,但是还是要提到一点NPOI所做的事,或许真有遇到这样使用的
2.本着写进内存流,然后和平常那样操作内存流,怎知NPOI好心多做一步,如下代码:
string path = "";
FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);
XSSFWorkbook workbook = new XSSFWorkbook(fs);
using (var ms = new MemoryStream())
{
workbook.Write(ms);
//此处报错
var size = ms.Length;
}
3.从断点看ms,除了已经装有字节外,workbook.Write前ms.CanRead这些均为true,Write后,可明显看到这些均为false,且ms.Length已报错,继续执行这个语句必然不可以,故此,NPOI已经‘好心’帮咱们关了这个流,为了获取这个Length,其实ms本就可以导出byte数组,当然你还可以new一个MemoryStream去装ms流,但是我倒是觉得能获取到byte数组,这些均可以做,脑筋太固化可不太好,虽然我经常如此。。。
三:索引超出范围异常(NPOI / POI Excel Lib ISheet.ShiftRows Index Out of Range Exception) :
1.实际出错情况未知,故暂升级版本解决,出错版本,目前已知为NPOI 2.2.0.0以及2.2.1.0,升级到2.3.0.0以上则无此情况,若非使用移动row这个方法,其实还有其他方法可用,看当前是否愿意升级版本,不愿意亦可使用其他方式移动row,比如拷贝row并使用CreateRow来覆盖原来的row,个人更倾向于升级,就当前变动成本来说,此为上策
四:Excel无法打开文件xxx.xlsx,因为文件格式或文件扩展名无效。请确定文件未损坏,并且文件扩展名与文件的格式匹配:
1.此问题跟网上普遍的不一致,是由问题三造成,可看到生成后的文件相对之前正常的大了不小,故不是这种情况请参考网上已存在的,皆因运行时能通过,普通调试便会报问题三的错误,当打开execl时,提示本问题这个错误,按问题三方法解决即可