解决C# NPOI 无法访问已关闭的流 的问题

时间:2024-03-31 20:23:56

最近都在参与公司的狐小E项目(https://www.hixiaoe.com/),一天到晚都是Mysql相关的知识,弄多了难免乏味,正好其他兄弟团队碰到了一个 C#用NPOI生成Excel模板的小问题,帮助解决了一下,换一下脑子还是不错的。

兄弟团队是想用NPOI生成一个下载模板,让用户能把在系统里配置好的模板模板,生成Excel下载下来,并且在填Excel的时候有一些限制,比如产品分类,只能选定固定一些值,这些值是系统里提前配置好的。如下图。

 

解决C# NPOI 无法访问已关闭的流 的问题

基本功能是实现了,但是保存的时候会提醒“显著功能损失”,如下图。

 

解决C# NPOI 无法访问已关闭的流 的问题

这样保存过后,再打开,产品分类的选择控制就没有了。

 

解决C# NPOI 无法访问已关闭的流 的问题

看了一下他们的代码,发现哥们用的是HSSFWorkbook,建议他们换成了XSSFWorkbook。

HSSFWorkbook是解析出来excel 2007 以前版本的,后缀名为xls的。XSSFWorkbook是解析excel 2007 版的,后缀名为xlsx。

       换成XSSFWorkbook,又出一个问题,“无法访问已关闭的流“,如下图。      

解决C# NPOI 无法访问已关闭的流 的问题

完整的错误信息 System.ObjectDisposedException类型的异常在 mscorlib.dll 中发生,但未在用户代码中进行处理,其他信息: 无法访问已关闭的流。

出现这个错误,是因为在使用book.Write方法后,会关闭流,这样导致再次使用Respons输出流的时候就出错了。

为了解决这个问题,需要从MemoryStream派生一个新类,专给NPOI用,解决流关闭的问题。这个方法是从网络上搜来了的,实测可用。具体内容如下图。

 

解决C# NPOI 无法访问已关闭的流 的问题

 

建好新的类以后,该造相关的代码,总是解决了。

解决C# NPOI 无法访问已关闭的流 的问题

 

在公司狐小Ehttps://www.hixiaoe.com/)的项目里不断的成长,学习Mysql的更多知识,偶尔切出去做点别的事情也挺好,换换脑子。这个MemoryStream的派生类也是从网络上找来的,谢谢大家的帮助,让我能够解决这个问题也希望这个小文章能帮到碰到一样问题的朋友们。