无法读取XLSX文件 - 使用Stream的异常“无法访问已关闭的文件

时间:2013-06-13 18:59:43

标签: c#

我无法从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文件......

3 个答案:

答案 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);

您能否向我们展示该代码并确认您不会意外过早地关闭该流?