NPOI 导出xlsx 出现的问题解决方案
出现的问题
在使用NPOI 导出 Excel为 xlsx 格式的文件时候。使用 stream 流来输出,会出现 “Can not access a closed Stream” 的报错。
这是因为:XSSF类在 workbook.write(ms) 后,就会自动关闭这个 MemoryStream. 所以导致了这个错误
解决方案:不导出xlsx文件,导出xls就好
因为 2000版本的 Excel文件最多支持的行数有限,而且现在大多都是 2007版本,所以我们就要导出 2007版本的 Excel (也就是文件后缀为 xlsx 的)
那么,要怎么办?
解决思路如下:
- 创建一个类,继承自MemoryStream
- 重写 Close 方法
- 给上属性,控制其关闭方式,不让它被自动关闭
具体代码如下:
public class MemoryStreamHelper : MemoryStream
{
public MemoryStreamHelper()
{
AllowClose = true;
}
public bool AllowClose { get; set; }
public override void Close()
{
if (AllowClose)
base.Close();
}
}
在使用的时候,我们创建的不是 MemoryStream ,而是这个就可以了。
例如:
using (MemoryStreamHelper ms = MemoryStreamHelper())
{
ms.AllowClose = false;
workbook.Write(ms);
workbook.Close();
ms.Flush();
ms.Position = 0;
ms.AllowClose = true;
return ms;
}
使用 using 是为了更好的回收资源,避免资源过多,导致出意外