先说说问题的来源 ,使用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 = ;
byte[] buffer = new byte[bufferSize]; while (true)
{
int read = input.Read(buffer, , buffer.Length);
if (read <= )
{
return;
}
output.Write(buffer, , 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:这种问题,对呀大神来说,兴许很容易找到思路,找到正确的解决办法。

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

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

Your stream was neither an OLE2 stream, nor an OOXML stream.问题的解决的更多相关文章

  1. C#图像处理:Stream 与 byte[] 相互转换,byte[]与string,Stream 与 File 相互转换等

    C# Stream 和 byte[] 之间的转换 一. 二进制转换成图片 MemoryStream ms = new MemoryStream(bytes); ms.Position = 0; Ima ...

  2. android studio 解析Excel数据格式导入poi-3.17.jar时的一系列报错及处理Failed resolution of: Ljavax/xml/stream/XMLEventFactory,duplicate entry: org/apache/xmlbeans/xml/stream/Location.class,GC overhead limit exceeded

    在org官网下载的poi jar包,导入到studio compile files('libs/poi-3.17.jar') compile files('libs/poi-ooxml-3.17.ja ...

  3. Java 8函数编程轻松入门(二)Stream的使用

    在C#中,微软基于IEnumerable接口,提供许多便捷的扩展方法,便于实际的开发.在Java 1.8中,Collection接口新增了default stream方法.我们可以针对java集合,在 ...

  4. 《Kafka Stream》调研:一种轻量级流计算模式

    原文链接:https://yq.aliyun.com/articles/58382 摘要: 流计算,已经有Storm.Spark,Samza,包括最近新起的Flink,Kafka为什么再自己做一套流计 ...

  5. C++ I/O stream

    C++ I/O stream Ø The first, you should understand following: ... Ø Text: Ø Version: Visual studio 20 ...

  6. webservice wsdl axis2报错 Provider com.bea.xml.stream.MXParserFactory not found

    错误信息: Exception in thread "main" javax.xml.stream.FactoryConfigurationError: Provider com. ...

  7. C#学习之Stream

    上节课老师主要讲了stream及其一些运用和实例,下面我们就来讨论讨论Stream. 我们知道,C#中常用的stream有文件流(FileSteam),内存流(MemoryStream),压缩流(GZ ...

  8. Stream Player control

    In this article you will find an implementation of a stream player control. Download WPF demo - 11 M ...

  9. Stream/Bytes[]/Image对象相互转化

    Stream/Bytes[]/Image对象相互转化 Stream转Byte数组.Image转Byte数组.文件转Stream等 /// <summary> /// 将 Stream 转成 ...

随机推荐

  1. 转-IE浏览器自动配置代理脚本-Proxy.PAC文件及PAC相关语法

    用笔记本上网时,往返家里和单位,因为单位是用的代理上网,家里是直接连接.因此每次都要修改IE的代理设置,虽然是个小事,但是每次都要修改总是有点烦 ,于是参考GOOGLE,写了一个自动配置代理的脚本.这 ...

  2. visual studio code 安装python扩展

    Ctrl+P 调出控制台,在控制台里输入ext install python,点击第一个安装 如果出现: visual studio code connect ETIMEDOUT 191.238.17 ...

  3. JavaScript—赋值表达式

      赋值表达式的运算顺序是从右到左的,因此,可以通过以下方法对多个变量赋值 1 i=j=k=0;//也就是把三个变量初始化为0 赋值表达式中的递增和递减 n++和++n的区别:     简单来说,根据 ...

  4. adb shell

    1.获取进程ID adb shell ps |findstr packagename 2.获取cpu的值 adb shell dumpsys cpuinfo |findstr packagename ...

  5. C++与Java的语法区别

    C++与Java的语法区别 首先,两个大的不同是主函数和怎样编译的不同,接下来是许多小的区别. main 函数C++//自由浮动的函数int main( int argc, char* argv[]) ...

  6. CSS之立方体绘画步骤

    附上总的代码: <!DOCTYPE html><html><head> <title>立方体</title> <meta charse ...

  7. 搭建测试环境——针对S3C6410开发板

    (一)前言 目前市面上的开发板型号和种类很多,但目前最流行的是基于三星S3C6410 ARM11架构的开发板.国内很多厂商在S3C6410 ARM11架构的开发板的基础上进行了扩展,开发了扩展板,本博 ...

  8. DOM扩展之 HTML5

    11.3.1 与类相关的扩充 2. classList属性 在操作类名时,需要通过className属性添加,删除和替换类名.因为className是一个字符串,所以即使只修改一部分内容也要设置整个字 ...

  9. 安全协议系列(四)----SSL与TLS

    当今社会,电子商务大行其道,作为网络安全 infrastructure 之一的 -- SSL/TLS 协议的重要性已不用多说.OpenSSL 则是基于该协议的目前应用最广泛的开源实现,其影响之大,以至 ...

  10. Integrating AngularJS with RequireJS

    Integrating AngularJS with RequireJS When I first started developing with AngularJS keeping my contr ...