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数组,这些均可以做,脑筋太固化可不太好,虽然我经常如此。。。