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 = ;
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.问题的解决的更多相关文章
- C#图像处理:Stream 与 byte[] 相互转换,byte[]与string,Stream 与 File 相互转换等
C# Stream 和 byte[] 之间的转换 一. 二进制转换成图片 MemoryStream ms = new MemoryStream(bytes); ms.Position = 0; Ima ...
- 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 ...
- Java 8函数编程轻松入门(二)Stream的使用
在C#中,微软基于IEnumerable接口,提供许多便捷的扩展方法,便于实际的开发.在Java 1.8中,Collection接口新增了default stream方法.我们可以针对java集合,在 ...
- 《Kafka Stream》调研:一种轻量级流计算模式
原文链接:https://yq.aliyun.com/articles/58382 摘要: 流计算,已经有Storm.Spark,Samza,包括最近新起的Flink,Kafka为什么再自己做一套流计 ...
- C++ I/O stream
C++ I/O stream Ø The first, you should understand following: ... Ø Text: Ø Version: Visual studio 20 ...
- webservice wsdl axis2报错 Provider com.bea.xml.stream.MXParserFactory not found
错误信息: Exception in thread "main" javax.xml.stream.FactoryConfigurationError: Provider com. ...
- C#学习之Stream
上节课老师主要讲了stream及其一些运用和实例,下面我们就来讨论讨论Stream. 我们知道,C#中常用的stream有文件流(FileSteam),内存流(MemoryStream),压缩流(GZ ...
- Stream Player control
In this article you will find an implementation of a stream player control. Download WPF demo - 11 M ...
- Stream/Bytes[]/Image对象相互转化
Stream/Bytes[]/Image对象相互转化 Stream转Byte数组.Image转Byte数组.文件转Stream等 /// <summary> /// 将 Stream 转成 ...
随机推荐
- 转-IE浏览器自动配置代理脚本-Proxy.PAC文件及PAC相关语法
用笔记本上网时,往返家里和单位,因为单位是用的代理上网,家里是直接连接.因此每次都要修改IE的代理设置,虽然是个小事,但是每次都要修改总是有点烦 ,于是参考GOOGLE,写了一个自动配置代理的脚本.这 ...
- visual studio code 安装python扩展
Ctrl+P 调出控制台,在控制台里输入ext install python,点击第一个安装 如果出现: visual studio code connect ETIMEDOUT 191.238.17 ...
- JavaScript—赋值表达式
赋值表达式的运算顺序是从右到左的,因此,可以通过以下方法对多个变量赋值 1 i=j=k=0;//也就是把三个变量初始化为0 赋值表达式中的递增和递减 n++和++n的区别: 简单来说,根据 ...
- adb shell
1.获取进程ID adb shell ps |findstr packagename 2.获取cpu的值 adb shell dumpsys cpuinfo |findstr packagename ...
- C++与Java的语法区别
C++与Java的语法区别 首先,两个大的不同是主函数和怎样编译的不同,接下来是许多小的区别. main 函数C++//自由浮动的函数int main( int argc, char* argv[]) ...
- CSS之立方体绘画步骤
附上总的代码: <!DOCTYPE html><html><head> <title>立方体</title> <meta charse ...
- 搭建测试环境——针对S3C6410开发板
(一)前言 目前市面上的开发板型号和种类很多,但目前最流行的是基于三星S3C6410 ARM11架构的开发板.国内很多厂商在S3C6410 ARM11架构的开发板的基础上进行了扩展,开发了扩展板,本博 ...
- DOM扩展之 HTML5
11.3.1 与类相关的扩充 2. classList属性 在操作类名时,需要通过className属性添加,删除和替换类名.因为className是一个字符串,所以即使只修改一部分内容也要设置整个字 ...
- 安全协议系列(四)----SSL与TLS
当今社会,电子商务大行其道,作为网络安全 infrastructure 之一的 -- SSL/TLS 协议的重要性已不用多说.OpenSSL 则是基于该协议的目前应用最广泛的开源实现,其影响之大,以至 ...
- Integrating AngularJS with RequireJS
Integrating AngularJS with RequireJS When I first started developing with AngularJS keeping my contr ...