1

サーバーにアップロードするために、特定の形式のテスト ケースのリストから Excel シートを作成する必要があります。ファイルに「予想」と「実際」の2次元範囲を入力するのに苦労しました。同じメソッドを使用して、ヘッダー (1 次元配列) とステップ (2 次元配列) を設定します。

フローは次のとおりです。

  1. TestCase 範囲 (いくつかのヘッダー + ステップ) の資金を回収します。たとえば、最初の反復では A1 から E14 です。
  2. ヘッダーの testCase 範囲内のサブ (ローカル) 範囲を削除します (例: A1 から C1)。
  3. ヘッダーの testCase 範囲内の別のサブ (ローカル) 範囲を削除します (私の場合: D1 から E14)。
  4. 2 つのサブ範囲にテスト ケースの値 (ヘッダーとステップ) を設定します。
  5. 次のスプレッドシートの範囲 (私の場合は A14 から E28) を同じローカルの範囲 (ステップ 2 ~ 3) で払い戻すことで繰り返し、それらを入力します。

ソース値は、テストケースのステップを表す Dictionary です (キー = 予期され、値 = 実際)。

私が使用するコードは次のとおりです。

public class TestCase
{
    public Dictionary<string, string> steps;
}

Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application();
Workbooks workBooks = excelApp.Workbooks;
Workbook workbook = workBooks.Add(XlWBATemplate.xlWBATWorksheet);
Worksheet worksheet = (Worksheet)workbook.Worksheets[1];
excelApp.Visible = true;

foreach (TestCase testCase in TestCaseList.Items.GetList())
{
    Range worksheetRange = GetRangeForTestCase(worksheet);
    //The step above is equivalent to:
    //    Range worksheetRange = worksheet.get_Range("A1", "E14");
    //for the first foreach iteration.

    Range stepsRange = worksheetRange.get_Range("D1", "E14");
    //This is a local range within the worksheetRange, not the worksheet,
    //so it is always have to be between D1 to E14 for a 14th steps test case.
    //Anyway, it should work at least for the 1st iteration.

    //for test evaluation only. All cells between D1 to E14 are filled with "ccc"
    test.Value = "ccc";

    //This list of pairs which are converted to Array[,] is about to be converted to a two dimensional array
    list = new List<object>();
    foreach (KeyValuePair<string, string> item in testCase.Steps)
    {
        //Here I build the inside Array[,]
        object[] tempArgs = {item.Key, item.Value};
        list.Add(tempArgs);
    }
    object[] args = { Type.Missing, list.ToArray() };

    test.GetType().InvokeMember("Value", System.Reflection.BindingFlags.SetProperty, null, test, args);

    //Now, all the "ccc" within the Excel worksheet are disapeared, so the Range is correct, but the value of args[] are not set!!
}

このコードを実行した実際の結果は、範囲が定義されている (おそらく正しく) ことですが、その値は null に設定されていますが、実行時に args 配列に正しい値が表示されます。また、より広い範囲を設定して range.Value = "Pake value" を入力しようとしましたが、コードの平和を実行した後、ステップの正しい範囲が空白になることがわかりました! したがって、範囲は正しく、配列には値が入力され、InvokeMember メソッドは正しく呼び出されます :) しかし、すべての値が null に設定されています..

ヘルプ...

4

2 に答える 2

2

1 つのセルまたは 1dim 配列は、次のいずれかを介して設定できます。

Range range = SetRange();//Let's say range is set between A1 to D1
object[] args = {1, 2, 3, 4 }; 

//Directly
range.Value = args;

//By Reflection
range.GetType().InvokeMember("Value", System.Reflection.BindingFlags.SetProperty, null, range, args);

2dim 配列は直接設定できないため、リフレクション フローを使用して値のマトリックスを設定する必要があります。このマトリックスは、次のようにセットの前に構築する必要があります。

Range range = SetRange();//Let's say range is set between A1 to C5
int rows = 5;
int columns = 3;
object[,] data = new object[rows, columns];
for (int i = 0; i < rows; i++)
{
    for (int j = 0; j < columns; j++)
    {
        //Here I build the inside Array[,]
        string uniqueValue = (i + j).ToString();
        data[i, j] = "Insert your string value here, e.g: " + uniqueValue;
    }
}
object[] args = { data };
range.GetType().InvokeMember("Value", System.Reflection.BindingFlags.SetProperty, null, range, args);
于 2013-06-17T08:41:47.247 に答える