• 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的派生类也是从网络上找来的,谢谢大家的帮助,让我能够解决这个问题,也希望这个小文章能帮到碰到一样问题的朋友们。

  • 相关阅读:
    CentOS6配置清华大学yum源
    Nginx转发导致请求头丢失
    驾驶本到期换新,要想照片拍的好看,办理不耽误时间请按照以下步骤进行
    Postman生成测试报告
    删除Cookie工具Cookie Manager
    datax dataxweb 安装教程
    Qt 窗口标志(Qt WindowFlags)
    Qt QPalette 使用总结
    Qt License分析、开源版与商业版的区别
    notepad++替换 为回退符,如何操作?
  • 原文地址:https://www.cnblogs.com/wuweimin999/p/13576707.html
Copyright © 2020-2023  润新知