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ファイルの場合、ストリーム変数を掘り下げると、次のように表示されます

ハンドル = 'stream.Handle' がタイプ 'System.ObjectDisposedException' の例外をスローしました

長さ = '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ブロックの周りを省略してみてFileStreamください。ExcelReader は、ストリームを閉じて破棄する必要があります。

もう 1 つの方法は、FileStream の最後まで読み取り、結果を MemoryStream に格納することです。次に、MemoryStream を ExcelReader に渡します。そうすれば、FileStream を破棄でき、MemoryStream が適切に破棄されることを心配する必要がなくなります。

于 2013-06-13T19:06:56.430 に答える
0

違いはおそらく方法にあります:

excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);

そのコードを見せて、誤って途中でストリームを閉じていないことを確認できますか?

于 2013-06-13T19:02:08.977 に答える