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:這種問題,對呀大神來說,興許很容易找到思路,找到正確的解決辦法。

但是對於新手來說,着實不易。解決問題的過程還是蠻有意思的,還有問題解決之後的成就感。

這也是一種成長,不是麼?

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章