我无法从XLSX文件中读取(对于XLS文件没有任何问题),我相信它与FileStream对象有关。这是我的代码:
string extention = Path.GetExtension(fileName);
using (FileStream stream = File.Open(fileName, FileMode.Open, FileAccess.Read))
{
IExcelDataReader excelReader = null;
try
{
switch (extention.ToLower())
{
case ".xls":
excelReader = ExcelReaderFactory.CreateBinaryReader(stream);
break;
case ".xlsx":
excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
break;
....
同样,当我从XLS文件中读取时,它可以工作,但是对于XLSX文件,当我深入了解流变量时,我看到以下内容
Handle ='stream.Handle'抛出了'System.ObjectDisposedException'类型的异常
Length ='stream.Length'引发了'System.ObjectDisposedException'类型的异常
...
对于FileStream的其他成员也有相同的例外。当我进一步深入研究这些例外时,我看到:
base {System.InvalidOperationException} = {“无法访问已关闭的文件。”}
作为消息。这是什么意思?我假设这阻止我从这个文件中读取。有没有办法解决?为什么它适用于XLS而不适用于XLSX文件?
编辑Eric:
没有骰子。我在MemoryStream对象上遇到“无法访问封闭流”异常。我正在设置MemoryStream如下([http://justtwoshare.blogspot.com/2010/04/how-to-convert-filestream-to.html](this site):
FileStream stream = File.Open(fileName, FileMode.Open, FileAccess.Read);
MemoryStream memStream = new MemoryStream();
memStream.SetLength(stream.Length);
stream.Read(memStream.GetBuffer(), 0, (int)stream.Length);
memStream.Flush();
最终编辑:
在找不到与此有关的问题之后没有运气,我试图将程序限制为仅接受xls文件......
答案 0 :(得分:2)
之前我使用过相同的库 - 尝试省略您创建的using
周围的FileStream
块。 ExcelReader应该为您关闭和处理流。
另一种选择是读取FileStream的结尾,将结果放在MemoryStream中。然后将MemoryStream传递给ExcelReader。这样你可以处理FileStream而不必担心MemoryStream被正确处理。
答案 1 :(得分:1)
我意识到这是超级旧的,但事实证明我在一个项目中遇到了同样的问题并且不得不解决 ExcelReaderFactory.CreateOpenXmlReader(stream); 自动关闭的事实流。由于我需要在代码中进一步处理相同的流,所以我只是在方法调用之后将流重新初始化为打开状态。
stream = New MemoryStream(stream.ToArray());
正如我在此处的另一个帖子(MemoryStream, Cannot access a closed stream)中找到的那样,在流关闭后调用ToArray不会导致任何问题,然后我有一个全新的,开放的流来处理。
希望将来可以帮助任何人在这里磕磕绊绊!
答案 2 :(得分:0)
差异可能在于方法:
excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
您能否向我们展示该代码并确认您不会意外过早地关闭该流?