web-dev-qa-db-ja.com

ストリームからExcelファイルを読み取る

ストリームからExcelファイルを読み取る方法が必要です。 ADO.NETの方法では機能しないようです。

シナリオは、ユーザーがFileUploadを介してファイルをアップロードし、ファイルからいくつかの値を読み取ってデータベースにインポートする必要があるというものです。

いくつかの理由で、私はできませんファイルをディスクに保存しますが、そうする理由もありません。

それで、FileUploadストリームからExcelファイルを読み取る方法を知っている人はいますか?

15
Kristian

私は自分で問題の解決策を見つけたようです。

http://www.codeplex.com/ExcelDataReader

このライブラリはうまく機能しているようで、Excelファイルを読み取るにはストリームが必要です。

ExcelDataReader reader = new ExcelDataReader(ExcelFileUpload.PostedFile.InputStream);
14
Kristian

SpreadsheetGear それを行うことができます:

SpreadsheetGear.IWorkbook workbook = SpreadsheetGear.Factory.GetWorkbookSet().Workbooks.OpenFromStream(stream);

無料評価 で自分で試すことができます。

免責事項:私はSpreadsheetGearLLCを所有しています

4
Joe Erickson

これは EPPlus で簡単に行うことができます。

//the Excel sheet as byte array (as example from a FileUpload Control)
byte[] bin = FileUpload1.FileBytes;

//gen the byte array into the memorystream
using (MemoryStream ms = new MemoryStream(bin))
using (ExcelPackage package = new ExcelPackage(ms))
{
    //get the first sheet from the Excel file
    ExcelWorksheet sheet = package.Workbook.Worksheets[1];

    //loop all rows in the sheet
    for (int i = sheet.Dimension.Start.Row; i <= sheet.Dimension.End.Row; i++)
    {
        //loop all columns in a row
        for (int j = sheet.Dimension.Start.Column; j <= sheet.Dimension.End.Column; j++)
        {
            //do something with the current cell value
            string currentCellValue = sheet.Cells[i, j].Value.ToString();
        }
    }
}
4
VDWWD

Infragistics には Excelコンポーネント があり、ストリームからExcelファイルを読み取ることができます。

私はここのプロジェクトでそれを使用しています、そしてそれはうまくいきます。

また、オープンソース myXls component は、これをサポートするように簡単に変更できます。 XlsDocumentコンストラクターは、ファイル名で指定されたファイルからのロードのみをサポートしますが、FileStreamを作成してからストリームを読み取ることで機能するため、ストリームからのロードをサポートするように変更するのは簡単です。

編集:解決策が見つかったようですが、コンポーネントのソースコードを更新して、ストリームから直接Excelファイルを読み取れるようにしたことに注意してください。 :-)

0
Rune Grimstad

ClosedXML nugetパッケージを使用して、ストリームからExcelコンテンツを読み取ります。 XLWorkbookクラスにコンストラクターのオーバーロードがあり、Excelファイル(別名ワークブック)を指すストリームを取得します。

コードファイルの先頭にインポートされた名前空間:

using ClosedXML.Excel;

ソースコード:

var stream = /*obtain the stream from your source*/;
if (stream.Length != 0)
{
    //handle the stream here
    using (XLWorkbook excelWorkbook = new XLWorkbook(stream))
    {
        var name = excelWorkbook.Worksheet(1).Name;
        //do more things whatever you like as you now have a handle to the entire workbook.
        var firstRow = excelWorkbook.Worksheet(1).Row(1);
    }
}
0
RBT