NPOI —— 开发问题

2020-07-03  本文已影响0人  潇潇剑_易水阁

看不透你蒙着的面纱

一:发现不可读取内容是否恢复此工作簿内容?如果信任此工作簿的内容?请单击是:

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时,提示本问题这个错误,按问题三方法解决即可

上一篇 下一篇

猜你喜欢

热点阅读