NPOI 无法访问已关闭的流

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

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

 

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

 

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

 

 

 

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

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

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

 

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

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

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

 

 

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

 

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

posted @ 2020-08-28 12:04  wuweimin  阅读(1080)  评论(4编辑  收藏  举报