2017-01-17 16 views
0

私はExcelテンプレートにダンプするストアドプロシージャを実行します。Excelに直接データテーブルC#

現在動作していますが、時間がかかりすぎます。 SQL Server Management Studioでは、クエリはうまく動作しますが、テンプレートに書き込むときには、実際には遅いです。

誰も同じ結果を達成するためのより効率的な方法を提案できますか?ここで

は、私のコードの一部です:

sdate = StartDate.Value.ToString(); 
edate = EndDate.Value.ToString(); 

Excel.Application oXL; 
Excel._Workbook oWB; 
Excel._Worksheet aSheet; 

try 
{ 
//Start Excel and get Application object. 
oXL = new Excel.Application(); 
oXL.Visible = true; 

//open the excel template 
oWB = oXL.Workbooks.Open("C:\\TEMP\\template.xlsm"); 

//oWB = (Excel._Workbook)(oXL.Workbooks.Add(Missing.Value)); 

//Call to service 
//aSheet = (Excel._Worksheet)oWB.Worksheets.get_Item(1); 
aSheet = (Excel._Worksheet)oWB.ActiveSheet; 
//backgroundWorker1.ReportProgress(i++); 
writedata_from_proc(aSheet, "dbo.CODE_RED_2017"); 
//backgroundWorker1.ReportProgress(i++); 


//Make sure Excel is visible and give the user control 
//of Microsoft Excel's lifetime. 
//backgroundWorker1.ReportProgress(i++); 
MessageBox.Show("Data extraction complete"); 
oXL.Visible = true; 
oXL.UserControl = true; 
//SaveExcel(oWB); 

//clean up the COM objects to remove them from the memory 
Marshal.FinalReleaseComObject(aSheet); 
Marshal.FinalReleaseComObject(oWB); 
Marshal.FinalReleaseComObject(oXL); 
} 
catch (Exception theException) 
{ 
String errorMessage; 
errorMessage = "Error: "; 
errorMessage = String.Concat(errorMessage, theException.Message); 
errorMessage = String.Concat(errorMessage, " Line: "); 
errorMessage = String.Concat(errorMessage, theException.Source); 

MessageBox.Show(errorMessage, "Error"); 
} 
    } 

ここで私が最初に逃したコードです:

public void writedata_from_proc(Excel._Worksheet oWS,string sentproc) 
     { 
      int rowCount = 0; 
      SqlCommand cmd = new SqlCommand(sentproc.ToString()); 
      cmd.CommandType = CommandType.StoredProcedure; 
      cmd.Parameters.Add("@start_date", SqlDbType.DateTime).Value = getsdate(); 
      cmd.Parameters.Add("@end_date",SqlDbType.DateTime).Value=getedate(); 
      cmd.CommandTimeout = 0; 

      DataTable dt = GetData(cmd); 
      oWS.UsedRange.Rows.Count.ToString(); 
      if (sentproc.Contains("CODE_RED")) 
      { 
       rowCount = 1; 
      } 
      else 
      { 
       rowCount = oWS.UsedRange.Rows.Count; 
     } 
     foreach (DataRow dr in dt.Rows) 
     { 
      rowCount += 1; 
      for (int i = 1; i < dt.Columns.Count + 1; i++) 
      { 
       // Add the header the first time through 
       if (rowCount == 2) 
       { 
        oWS.Cells[1, i] = dt.Columns[i - 1].ColumnName; 
       } 
       oWS.Cells[rowCount, i] = dr[i - 1]; 
      } 
     } 

    } 
+1

このwritedata_from_procメソッドは何ですか?それのソースコードは何ですか? –

+0

** 'writedata_from_proc' **のメインコードは含まれていません。 – ManishChristian

+1

「あまりにも長くかかる」と定義します。 –

答えて

1

Excelが既に正確にこれを行うツールに組み込まれていない、そしてそれは時間がかかりますが、クエリを実行して結果をフェッチするよりも効率的です。 MSクエリと呼ばれています。一言で言えば、あなたの希望:

  • は、「外部データの取り込み」を選択エクセルのリボン上の「データ」タブ(リボングループ)へ
    1. ゴー - 「他のソースからの」> - >「SQLからサーバ。"私はこれがSQL Serverだと仮定します。あなたの構文から、それはSybaseの可能性があります。その場合でもODBC経由でこれを行うことができます(SQL Serverの下のいくつかのオプション)
    2. すべてのデザイナーをバイパスし、MS Query Windowに着陸します。ここから、SQLを直接編集してSQLを入力することができます。exec dbo.CODE_RED_2017
    3. MS Queryを閉じると、データの入力先を尋ねられます。セルを選択します。
    4. 出来上がり、それがリフレッシュする時間ですすべてのベスト

    は、あなたがテーブルの上で右クリックし、「更新」を選択し、それはあなたの手順(またはクエリ)を再実行します。私の経験上、Excelは実際にはのデータをほとんどのデータベースブラウザよりも速くレンダリングします。ここで

    は、より詳細で、Microsoftのリンクです:

    https://support.office.com/en-us/article/Use-Microsoft-Query-to-retrieve-external-data-42a2ea18-44d9-40b3-9c38-4c62f252da2e?ui=en-US&rs=en-US&ad=US&fromAR=1

    だから、あなたは全くのC#を必要としません。つまり、C#で何とかこれを自動化しているのであれば、これも同様に行うことができます。ここに例があります:

    string sql = "exec dbo.CODE_RED_2017"; 
    string source = "your connection string here"; 
    Excel.Range r = activeSheet.Range["A1"]; 
    
    Excel.ListObject lo = sheet.ListObjects.AddEx(Excel.XlListObjectSourceType.xlSrcQuery, 
        source, true, Excel.XlYesNoGuess.xlGuess, r); 
    
    lo.QueryTable.CommandText = sql; 
    lo.Refresh(); 
    
  • 関連する問題