无法读取 XLSX 文件 - 流异常"无法访问关闭的文件"

  • 本文关键字:文件 访问 读取 XLSX 异常 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. '句柄"抛出了类型为‘System’的异常"。ObjectDisposedException '

Length = 'stream. '抛出类型为"System"的异常。ObjectDisposedException '

对于FileStream的其他成员也有相同的例外。当我进一步研究这些异常时,我看到:

{基础系统。InvalidOperationException} = {"无法访问已关闭的文件。"}

作为消息。这是什么意思?我假设这是阻止我从这个文件读取。还有别的办法吗?为什么它适用于XLS文件而不是XLSX文件?

为Eric编辑:

不行。我收到"无法访问已关闭的流"的提示。MemoryStream对象上的异常。我设置MemoryStream如下(per [http://justtwoshare.blogspot.com/2010/04/how-to-convert-filestream-to.html](本网站):

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文件…

我以前使用过相同的库-尝试省略您创建的FileStream周围的using块。ExcelReader应该为你关闭和处理流。

另一种选择是读到FileStream的末尾,将结果放入MemoryStream。然后将MemoryStream传递到ExcelReader。这样,您就可以处理FileStream,而不必担心MemoryStream是否被正确处理。

我意识到这是超级旧的,但事实证明,我只是在一个项目中遇到了同样的问题,并且不得不解决ExcelReaderFactory.CreateOpenXmlReader(stream);自动关闭流的事实。因为我需要在代码的后面对同一个流进行处理,所以我基本上只是在方法调用后将流重新初始化为打开状态。

stream = New MemoryStream(stream.ToArray());

正如我在这里的另一个线程中发现的(MemoryStream,不能访问关闭的流),在流关闭后调用ToArray不会导致任何问题,然后我有一个新的,打开的流来工作。

希望这可以帮助任何人在这里绊倒在未来!

差异可能在于方法:

excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);

你能给我们看一下这段代码并验证你没有意外地过早关闭流吗?

最新更新