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を先頭に戻しておくだけ。