先说说问题的来源 ,使用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:这种问题,对呀大神来说,兴许很容易找到思路,找到正确的解决办法。
但是对于新手来说,着实不易。解决问题的过程还是蛮有意思的,还有问题解决之后的成就感。
这也是一种成长,不是么?