0

我在读取 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 文件?

为埃里克编辑:

没有骰子。我在 MemoryStream 对象上收到“无法访问关闭的流”异常。我正在按如下方式设置 MemoryStream(根据 [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 文件...

4

3 回答 3

2

我之前使用过同一个库 - 尝试省略您创建的using块。FileStreamExcelReader 应该为您关闭和处理流。

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

于 2013-06-13T19:06:56.430 回答
1

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

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

正如我在这里的另一个线程中发现的那样(MemoryStream,无法访问关闭的流),在流关闭后调用 ToArray 不会导致任何问题,然后我有一个全新的开放流可以使用。

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

于 2016-12-06T14:29:59.277 回答
0

区别大概在于方法:

excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);

您能否向我们展示该代码并验证您没有意外过早关闭流?

于 2013-06-13T19:02:08.977 回答