2009-07-03 12 views
2

私はC#でユーザーが選択したワークブックを調べ、 にストックデータを含むシートを探すようにしようとしています。具体的には、これは、「閉じる」、「閉じる」、または 「閉じる」のセル範囲(r < 6、c < 10)を調べることを意味します。Excelシートのコレクションを検索する#

次のコードは、ユーザーが.xlsファイルを選択した時点を示しています。

ブック内のシートをループして目的のテキストを探す方法がわかりません。

私は、シートのコレクションを作成し、それを 現在のブックにあるものに割り当てることを前提にしていますが、これまでの試みは機能しませんでした。

private void button1_Click(object sender, System.EventArgs e) 
{ 
    try 
    { 
    OpenFileDialog dlg = new OpenFileDialog(); 
    dlg.Filter = "Excel Files (*.xls)|*.XLS"; 

    if (dlg.ShowDialog() == DialogResult.OK) 
    { 

     // MessageBox.Show(dlg.FileName, "My Application", MessageBoxButtons.OKCancel, MessageBoxIcon.Asterisk); 
     Excel.Application xlApp = new Excel.ApplicationClass(); 
     xlApp.Visible = true; 
     Excel.Workbook xlWorkbook = xlApp.Workbooks.Open(dlg.FileName, 
       0, false, 5, "", "", false, Excel.XlPlatform.xlWindows, "", 
       true, false, 0, true, false, false); 

    } 

    } 
    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"); 
    } 
} 

ありがとうございます。

ジェフ

答えて

2

Interopライブラリの使用時には、常に細心の注意を払ってください。そうしないと、デバッグ中(またはユーザーがエラーを起こしたとき)にバックグラウンドで実行されている数十個のEXCEL.EXEプロセスが終了する可能性が高くなります。

private static bool IsStockDataWorkbook(string fileName) 
{ 
    Excel.Application application = null; 
    Excel.Workbook workbook = null; 
    try 
    { 
     application = new Excel.ApplicationClass(); 
     application.Visible = true; 
     workbook = application.Workbooks.Open(fileName, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value); 

     foreach (Excel.Worksheet sheet in workbook.Worksheets) 
     { 
      if (IsStockWorksheet(sheet)) 
      { 
       return true; 
      } 
     } 

     return false; 
    } 
    finally 
    { 
     if (workbook != null) 
     { 
      workbook.Close(false, Missing.Value, Missing.Value); 
     } 
     if (application != null) 
     { 
      application.Quit(); 
     } 
    } 
} 
private static bool IsStockWorksheet(Excel.Worksheet workSheet) 
{ 
    Excel.Range testRange = workSheet.get_Range("C10", Missing.Value); 
    string value = testRange.get_Value(Missing.Value).ToString(); 

    return value.Equals("close", StringComparison.InvariantCultureIgnoreCase); 
} 
+0

「Missing.Value」は、なぜ人々がVB.NET for Office interopを好んでいるのか、C#4に動的キーワードがある理由です。 –

+0

はい、クリーンアップする必要があります。私は下の私のちょっとした答えでそれを言及しなかった。私の理解は、Marshal.FinalReleaseComObject(オブジェクト)はCOMオブジェクトに割り当てられたすべての変数に対して呼び出されるべきです。私はあなたがここに示すようにforeachループを使うことができないということも意味すると思います。 – Jay

+0

クリキー。そして、 "application.Workbooks.Open()"はエラーを引き起こします。 http://stackoverflow.com/questions/158706/how-to-properly-clean-up-excel-interop-objects-in-c/159419 –

0
Workbooks workbooks = xlApp.Workbooks; 
foreach(Workbook wb in workbooks) 
{ 
    Worksheets worksheets = wb.Worksheets; 
    foreach(Worksheet ws in worksheets) 
    { 
     Range range = ws.get_Range(ws.Cells[1,1], ws.Cells[5,9]); 
     Range match = range.Find("close", ws.Cells[1,1], 
      xlFindLookIn.xlValues, xlLookAt.xlPart, 
      xlSearchOrder.xlByColumns, xlSearchDirection.xlNext, 
      false, false, false); //that first false means ignore case 
     // do something with your match here 
     // this will only return the first match; to return all 
     // you'll need to run the match in a while loop 
    } 
} 
+0

ありがとう、ジェイ。 私の問題は、ワークシートのコレクションが正しく機能するようになっているようです。何らかの理由でforeach文でハングアップします。試したことのすべてが赤で表示されます。おそらくネームスペースや参照がありませんか? 私はこれを見続けるでしょう。 ありがとう、 Jeff –

2

あなたは最も可能性の高い、何かにobjSheetsを割り当てる必要があります:

Excel.Sheets objSheets = xlWorkbook.Sheets; 

あなたforeach文がws変数の事前の宣言で(もっとこのようになります):

foreach(Excel.Worksheet ws in objSheets) 
{ 
    rng = ws.get_Range(ws.Cells[1,1], ws.Cells[5,9]); 
} 

明らかに、このループの中でもっと重要なことをしたいと思うでしょう。