先說說問題的來源 ,使用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:這種問題,對呀大神來說,興許很容易找到思路,找到正確的解決辦法。
但是對於新手來說,着實不易。解決問題的過程還是蠻有意思的,還有問題解決之后的成就感。
這也是一種成長,不是么?