先说说问题的来源 ,使用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. keep the bar green to keep the code clean——Junit详解(二)

    测试用例&测试套件 举个栗子: 编写MyStack类模拟栈,并对其进行测试用例编写测试: 编写文件删除方法,并对其删除测试. 不再做演示,戳此获取代码 MyStack类: public cla ...

  2. gif显示

    public void gifplay(string path,ref Panel panel) { try{ Bitmap animatedGif = new Bitmap(path ); Grap ...

  3. what is service?

    SERVICE n.服务,服侍:服务业:维修服务:服役 vt.检修,维修:向…提供服务:保养:满足需要 adj.服务性的:耐用的:服现役的 更多详情:http://dict.baidu.com/s?w ...

  4. SVN使用说明

    一,安装客户端SVN 1.下载 "svn小乌龟"后,进行安装.如下图: 安装完成后,右键项目文件夹就可以看到如下: 2:checkout项目文件. 新建或者进入目录下(比如qian ...

  5. DotNetBar for Windows Forms 12.9.0.0_冰河之刃重打包版及制作Visual Studio C#项目模板文件详解

    关于 DotNetBar for Windows Forms 12.9.0.0_冰河之刃重打包版 --------------------11.8.0.8_冰河之刃重打包版-------------- ...

  6. tail 显示文件最后若干行内容

    功能:tail命令可以输出文件的尾部内容,默认情况下它显示文件的最后十行.显示每个指定文件的最后10 行到标准输出.若指定了多于一个文件,程序会在每段输出的开始添加相应文件名作为头.如果不指定文件或文 ...

  7. 用JAVA写查询一个字符串中是否包含另外一个字符串以及出现的次数

    package JAVA; import java.awt.List;import java.util.ArrayList;/** *  * @author 梁小鱼 * */public class ...

  8. php+js实现分页

    使用onclick传递参数时,参数为空分页无效.因此无刷新页面时可利用js重新获取input的值同样通过get地址传递到分页显示的php页面.page参数接收和传递方式必须一致为post或get. j ...

  9. Linux下PHP的完全卸载

    如果想把PHP彻底的卸载干净,直接用yum的remove命令是不行的,而需要查看有多少rpm包,然后按照依赖顺序逐一卸载,在网上查了好多,都是通过  "rpm -qa | grep php& ...

  10. centos6虚拟机复制后修改网卡

    方法1: 使用vmware创建centos6.4虚拟机, 创建完成后复制该虚拟机, 打开复制的虚拟机发现网卡名字是eth1,而网卡配置文件为eth0,mac地址变了 这时修改网卡配置文件, 删除uui ...