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 转成 ...
随机推荐
- iOS -- 处理推送消息
简介 很多应用都会实现推送功能,我们可以集成第三方框架实现推送功能,比如: JPush推送:https://www.jpush.cn 个推:http://www.getui.com 下面来说说收到推送 ...
- java读取大文件
1 多线程 2 java内存映射读取大文件
- ByteArrayBuilder
public class ByteArrayBuilder : IDisposable { #region Constants /// <summary> /// True in a by ...
- leetcode 日记 4sum java
整体思路同之前的一样,依然采取降低维度的方式进行 public List<List<Integer>> solution(int nums[], int target) { L ...
- Ext JS 4 老特征:statics 静态的变量和方法
l 一.静态的变量和静态的方法 [译文原创Learning Ext JS 4 第51页] Statics的方法只属于类本身,而不属于任何一个实例,这就决定了我们是在定义类的内部来用statics方 ...
- 在VBA中新建工作簿
用程序计算数据,得到不同公司.不同项目的数据结果,最终还要将每个公司的数据结果放在各自的单独文件中.这就需要在vba中新建.保存excel文件.掌握几个东西就能很熟练了:1.要想保存在当前目录下,需要 ...
- 谈谈黑客攻防技术的成长规律(aullik5)
黑莓末路 昨晚听FM里谈到了RIM这家公司,有分析师认为它需要很悲催的裁员90%,才能保证活下去.这是一个意料之中,但又有点兔死狐悲的消息.可能在不久的将来,RIM这家公司就会走到尽头,或被收购,或申 ...
- linux下crontab命令的使用
1.crond crond是Linux下的一个守护进程,与windows下的计划任务类似,当操作系统安装完成后,默认会安装并启动进程,Linux下的任务调度分为两类,系统任务调度和用户任务调度. 系统 ...
- hdu 1002
ps:wa了好多次,然后才发现是输入的时候%s和%s要隔开一个空格,我想当然了... 代码: #include "stdio.h" #include "string.h& ...
- std::vector<bool>中的坑
http://www.cplusplus.com/reference/vector/vector/?kw=vector C++中,vector<bool>为了达到节省内存的目的,专门做了特 ...