2016-07-13 20 views
0

Webアプリケーションに機能を追加して、ユーザーがこのようなExcelファイルをアップロードできるようにしたいと考えています。ASP.NET MVC - データベースへのExcelコンテンツの保存

Name  Address  Phone 
John  California 000-111 
Matt  Seattle  000-222 
... 

見出しの後の各行を登録コントローラーまたはサービスに渡します。今私の質問は、これを行うには、(ユーザーの経験のために、スピードが重要な)最善の方法は何ですか?

私は完全な作業用コードを探しているわけではありません。スピードに関して最も効率的なアプローチを探しています。

+1

DBがある場合はADOを使用し、DB_TABLE SELECT * FROM SOURCEに挿入します。そうでない場合は、行に関連するクラスを提案するので、clsExcelImportRow {Name、Address、Phone}とADOを使用してデータを選択し、行ごとにクラスを追加するレコードセットをループします。 –

答えて

1

あなたは、ユーザーがExcelはあなたが、Excelの相互運用機能を使用して、それを開いてキャプチャしたデータを取得し、あなたがさらに速く必要procedure.If保存され、インサートを呼び出すことができますファイルのアップロード挿入logic.Onceを保持しているストアドプロシージャを作成する必要がありますあなたは常にSQL Bulk Copyを使用することができます挿入速度。あなたのMVCプロジェクト1.In

Microsoft.Office.Interop.Excel.dll

2.Create Excelファイルをアップロードを促すビューへの参照を追加します。

@using (Html.BeginForm("Import", "Home", FormMethod.Post, new { enctype = "multipart/form-data" })) 
{ 
    @Html.Raw(ViewBag.Error) 
    <span>Excel File </span><input type="file" name="excelfile" /> 
    <br /> 
    <input type="submit" value="Import" /> 
} 

3.Create Excelファイルを開き、コントローラのアクション - >行をループ - > SQL

にデータを挿入し
[HttpPost] 
public ActionResult Import(HttpPostedFileBase excelFile) 
{ 
    //Add this to the using statements after adding a refrence to Microsoft.Office.Interop.Excel.dll - using Excel = Microsoft.Office.Interop.Excel; 
    if ((excelFile.ContentLength != 0) && (excelFile.FileName.EndsWith("xls") || excelFile.FileName.EndsWith("xlsx"))) 
    { 
     string path = Server.MapPath("~/Files/" + excelFile.FileName); 
     if (!System.IO.File.Exists(path)) 
     { 
      excelFile.SaveAs(path); 
      Excel.Application application = new Excel.Application(); 
      Excel.Workbook workbook = application.Workbooks.Open(path); 
      Excel.Worksheet worksheet = (Excel.Worksheet)workbook.ActiveSheet; 
      Excel.Range range = worksheet.UsedRange; 

      for (int i = 2; i < range.Rows.Count + 1; i++) 
      { 
       string name = ((Excel.Range)range.Cells[i,1]).Text; 
       string address = ((Excel.Range)range.Cells[i,2]).Text; 
       string phone = ((Excel.Range)range.Cells[i,3]).Text; 
       //Write the logic to add the values to the database 
      } 
     } 
    } 
    return View(); 
} 

また、アクションを非同期に作ることができるが、それはdoesnのデータベースへの書き込みはIO操作なので、asyncは何もしません。

1

OleDbを使用してExcelファイルに接続することができます。接続が成功したら、Excelファイルの行をDataTableに入力し、各行をコントローラに渡すためにforeachを実行できます。

void Process(string path) 
    { 
     try 
     { 

      string connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path + ";Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1\";"; 

      using (var connection = new OleDbConnection(connString)) 
      { 
       using (var command = new OleDbCommand("select * from [SheetName$]", connection)) 
       { 
        connection.Open(); 
        using (var adapter = new OleDbDataAdapter(command)) 
        { 
         DataTable dataTable = new DataTable(); 
         adapter.Fill(dataTable); 

         foreach (DataRow row in dataTable.Rows) 
         { 
          string Name, Address, Phone = string.Empty; 
          try 
          { 
           Name = row["Name"].ToString(); 
           Address = row["Address"].ToString(); 
           Phone = row["Phone"].ToString(); 

           //new RegistrationController(Name, Address, Phone); 

          } 

          catch (Exception ex) 
          { 
           // Handle exceptions 
          } 
         } 

        } 
       } 
      } 
     } 

     // Might be possibly thrown when opening connection 
     catch (OleDbException ex) 
     { 
      // Handle exceptions 
     } 

     // Might be possibly thrown when filling datatable 
     catch (InvalidOperationException ex) 
     { 
      // Handle exceptions 
     } 

    } 
+0

列数を動的にする方法はありますか?私は3を持っている私の最初のシナリオとは異なり、エクセルに4つのカラムがあるかどうかを意味します。 –

関連する問題