Infragistics.Documents.Excelで処理したStreamにはSeekが必要

IgniteUI のC#で使えるExcelライブラリ(Infragistics.Documents.Excel)でWorkbook.LoadにStreamを渡して処理すると、Stream内のPositionがファイルの途中の位置になりました。

発生した現象

ASP.NET MVCアプリケーションでExcelファイルをアップロード。

1.アップロードされたファイルのHttpPostedFileBase.InputStreamをInfragistics.Documents.Excelで処理

var workbook = Workbook.Load(stream);
// ロードしたworkbook内のいくつかのWorksheetを読み込んで処理

2.アップロードされたファイルをバイト列として全部読み込み

using (var reader = new BinaryReader(stream))
{
    // Lengthはlongだが、このケースではintの幅に収まるサイズ
    var bytes = reader.ReadBytes((int)stream.Length);
}

3.読み込んだbytesをCSOMでSharePointのドキュメントライブラリ上に履歴としてアップロード。

3.の後にライブラリ上で結果を確認すると、本来のサイズの1/3程度で、もちろんファイルとしては壊れていて、Excelでは開けません。

デバッガで確認してみてもstream.Lengthは本来のサイズであることが確認できます。

Infragistics.Documents.Excelで読み込んだ後はSeekで位置を先頭に戻す

原因は、Infragistics.Documents.ExcelでLoadされた後、Stream内のPositionが先頭のままであること。

CSOMで処理しているため、こっちのAPIの使い方が間違っているのかと思って遠回りしてしまいましたが、Streamでよくある現在位置の問題でした。

ファイルサイズが1/3になるのは、Infragistics.Documents.Excelで処理した後、Positionがファイルの先頭から1/3の位置にあったため。なぜそうなるのかはわかりませんが……。

よって解決策は、事前に

stream.Seek(0, SeekOrigin.Begin);

を読んで、Positionを先頭に戻しておくだけ。