16

サーバーに投稿されたばかりのExcelスプレッドシートを読み取るにはどうすればよいですか?何かを検索しましたが、ファイル名パスを使用してExcelスプレッドシートを読み取る方法しか見つかりませんでした。これは私の場合ではありません。

私はそのようなものが必要です:

public ActionResult Import(HttpPostedFileBase file)
{
     var excel = new ExcelQueryFactory(file); //using linq to excel
}
4

4 に答える 4

22

私はあなたの同じ問題に遭遇していましたが、有料サービスに切り替えたくなかったので、これが私がしたことです。

public class DataImportHelper : IDisposable
{
    private readonly string _fileName;
    private readonly string _tempFilePath;

    public DataImportHelper(HttpPostedFileBase file, string tempFilePath)
    {
        _fileName = file.FileName;
        _tempFilePath = Path.Combine(tempFilePath, _fileName);
        (new FileInfo(_tempFilePath)).Directory.Create();
        file.SaveAs(_tempFilePath);
    }

    public IQueryable<T> All<T>(string sheetName = "")
    {
        if (string.IsNullOrEmpty(sheetName))
        {
            sheetName = (typeof (T)).Name;
        }

        var excelSheet = new ExcelQueryFactory(_tempFilePath);

        return from t in excelSheet.Worksheet<T>(sheetName)
               select t;
    }

    public void Dispose()
    {
        File.Delete(_tempFilePath);
    }

}

これがテストです

[Fact]
    public void AcceptsAMemoryStream()
    {
        MemoryFile file;

        using (var f = File.OpenRead("SampleData.xlsx"))
        {
            file = new MemoryFile(f, "multipart/form-data", "SampleData.xlsx");

            using (var importer = new DataImportHelper(file, "Temp/"))
            {
                var products = importer.All<Product>();

                Assert.NotEmpty(products);

            }
        }
    }

これがMemoryFile.csです。このファイルはテストにのみ使用されます。これはHttpPostedFileBaseの単なる実装であるため、コントローラーと私の小さなヘルパーをテストできます。これは別のポストから借りたものです。

 public class MemoryFile : HttpPostedFileBase
    {
        Stream stream;
        string contentType;
        string fileName;

        public MemoryFile(Stream stream, string contentType, string fileName)
        {
            this.stream = stream;
            this.contentType = contentType;
            this.fileName = fileName;
        }

        public override int ContentLength
        {
            get { return (int)stream.Length; }
        }

        public override string ContentType
        {
            get { return contentType; }
        }

        public override string FileName
        {
            get { return fileName; }
        }

        public override Stream InputStream
        {
            get { return stream; }
        }

        public override void SaveAs(string filename)
        {
            using (var file = File.Open(filename, FileMode.Create))
                stream.CopyTo(file);
        }
    }
于 2012-12-20T18:41:53.560 に答える
14

残念ながら、LinqToExcelを使用してストリームからスプレッドシートを読み取ることはできません。

これは、OLEDBを使用してスプレッドシートから読み取ることができ、ストリームから読み取ることができないためです。

于 2012-12-20T04:15:16.453 に答える
1

InputStreamのプロパティを使用してHttpPostedFileBase、メモリ内のExcelスプレッドシートを読み取ることができます。

私はClosedXMLnugetパッケージを使用して、あなたのケースで利用可能なストリームからExcelコンテンツを読み取ります。これには、Excelファイル(別名ワークブック)のストリームを指すストリームを取得する単純なオーバーロードがあります。

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

using ClosedXML.Excel;

ソースコード:

public ActionResult Import(HttpPostedFileBase file)
{
    //HttpPostedFileBase directly is of no use so commented your code
    //var excel = new ExcelQueryFactory(file); //using linq to excel
    var stream = file.InputStream;
    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);
        }
    }
}
于 2017-11-30T11:19:11.120 に答える
-2

OfficeInteropsアセンブリが必要です。参照用にExcelオブジェクトモデルを確認してください。

于 2012-12-18T11:22:58.473 に答える