• Your stream was neither an OLE2 stream, nor an OOXML stream.问题的解决


    先说说问题的来源 ,使用NPOI读取Except,先通过流来读取,如果符合要求,就将流保存为文件。

    众所周知,流只能读一次,所以在流读取之前需要将流拷贝一份,保存文件的时候使用。

            protected void Button7_Click(object sender, EventArgs e)
            {
                //FileUpload1是 一个FileUpload控件
                FileInfo fileInfo = new FileInfo(FileUpload1.FileName);
    
                IWorkbook workbook = null;
    
                MemoryStream m = new MemoryStream();
                //将文件的流拷贝一份,以内存流的格式保存
                CopyStream(FileUpload1.PostedFile.InputStream, m);
    
                workbook = WorkbookFactory.Create(FileUpload1.PostedFile.InputStream);
            }

    贴出流拷贝的代码

        private void CopyStream(Stream input, Stream output)
            {
                try
                {
                    int bufferSize = 4096;
                    byte[] buffer = new byte[bufferSize];
    
                    while (true)
                    {
                        int read = input.Read(buffer, 0, buffer.Length);
                        if (read <= 0)
                        {
                            return;
                        }
                        output.Write(buffer, 0, read);
                    }
                }
                catch (Exception)
                {
                    throw;
                }
            }

    当读取Excel文件是 .xlsx的时候一点问题没有,是.xls的时候就抛出了  Your stream was neither an OLE2 stream, nor an OOXML stream. 的异常

    但是去掉流拷贝就不会出这种问题

         protected void Button7_Click(object sender, EventArgs e)
            {
                //FileUpload1是 一个FileUpload控件
                FileInfo fileInfo = new FileInfo(FileUpload1.FileName);
    
                IWorkbook workbook = null;
    
                workbook = WorkbookFactory.Create(FileUpload1.PostedFile.InputStream);
            }

    然后就各种查各种试   分析可能是office2003与office2007以及以后的版本的读取方式不同  OLE2 stream  与 OOXML stream的方式读取

    按道理来说  WorkbookFactory.Create(FileUpload1.PostedFile.InputStream); 应该是支持任意版本的Excel的读取的,怎么拷贝了一下流就不行了呢?

    真的是好奇怪呢,难道流拷贝改变了流????

    困扰了我好几天,当这篇文章看到第三次的时候 POI - 读取Excel2003、Excel2007或更高级的兼容性问题 

    决定试一试流拷贝结束之后,根据后缀名不同,采取不同的方式进行读取

            protected void Button7_Click(object sender, EventArgs e)
            {
                //FileUpload1是 一个FileUpload控件
                FileInfo fileInfo = new FileInfo(FileUpload1.FileName);
    
                IWorkbook workbook = null;
    
                MemoryStream m = new MemoryStream();
                //将文件的流拷贝一份,以内存流的格式保存
                CopyStream(FileUpload1.PostedFile.InputStream, m);
    
                if (fileInfo.Extension.ToLower().Equals(".xls"))
                {
                    workbook = new HSSFWorkbook(FileUpload1.PostedFile.InputStream);
                }
                else
                {
                    workbook = WorkbookFactory.Create(FileUpload1.PostedFile.InputStream);
                }
            }

    然后问题就解决了。哈哈,真的好开心

    ----------------------------------------------------------------------------

    ps:这种问题,对呀大神来说,兴许很容易找到思路,找到正确的解决办法。

    但是对于新手来说,着实不易。解决问题的过程还是蛮有意思的,还有问题解决之后的成就感。

    这也是一种成长,不是么?

  • 相关阅读:
    python自动生成bean类
    CVPR2021 | SETR: 使用 Transformer 从序列到序列的角度重新思考语义分割
    经典论文系列 | 缩小Anchor-based和Anchor-free检测之间差距的方法:自适应训练样本选择
    单阶段实例分割综述
    CVPR2021提出的一些新数据集汇总
    使用 PyTorch Lightning 将深度学习管道速度提高 10 倍
    C#中使用ref和out传参的方法及区别
    读书笔记《重构 改善既有代码的设计》(第2版本)
    《大话设计模式》等读后感
    OOP、封装、继承、多态,真的懂了吗?
  • 原文地址:https://www.cnblogs.com/baobaodong/p/5829735.html
Copyright © 2020-2023  润新知