如何将值设置为二维Excel范围?

我需要从特定格式的testing用例列表中构build一个Excel表格,以便将其上传到服务器。 我很高兴在文件中填充“期望”和“实际”的二维范围。 我使用相同的方法来填充标题,这是一个一维数组,和步骤(这是两个dims)。

stream程是:

  1. 打破TestCase范围(一些标题+步骤)。 让我们说:第一次迭代A1到E14。
  2. 在头文件的testCase范围内(例如:A1到C1),删除一个子(本地)范围。
  3. 在头文件的testCase范围内放弃另一个sub(local)范围(在我的例子中:D1到E14)。
  4. 用testing用例值(标题和步骤)填充两个子范围。
  5. 重复取消下一个电子表格范围(在我的情况下是A14到E28),使用相同的本地范围(步骤2-3),并填充它们,等等。

源值是一个代表testing用例步骤的字典(key = expected和value = actual)。

这是我使用的代码:

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!! } 

运行此代码的实际结果是范围被定义(可能是正确的),但其值被设置为空,尽pipe – 我可以在运行时在args数组中看到正确的值。 我也尝试设置更广泛的范围,并使用range.Value =“Pake值”来填充它,并看到,在运行代码之后,正确的步骤范围变为空白! 所以,范围是正确的,数组是填充我的价值观,InvokeMember方法正确调用:)但是,所有值都设置为空..

帮帮我…

一个单元格或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数组不能直接设置,所以必须使用reflectionstream来设置数值matrix。 这个matrix必须在集合之前build立,像这样:

 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, eg: " + uniqueValue; } } object[] args = { data }; range.GetType().InvokeMember("Value", System.Reflection.BindingFlags.SetProperty, null, range, args); 

至于你的问题,所有的范围设置为空,我认为这是由于错误的论点。

确实为什么Type.Missing在参数列表中?

因此,这应该是朝着正确方向迈出的一步:

 object[] args = { list.ToArray() }; test.GetType().InvokeMember("Value", System.Reflection.BindingFlags.SetProperty, null, test, args); 

而且, list.ToArray只会生成一个不是matrix 的数组 ,所以你应该build立不同的matrix,例如:

 object[,] data = new object[14, 2]; int row = 0; foreach (KeyValuePair<string, string> item in testCase.Steps) { //Here I build the inside Array[,] data[row, 0] = item.Key; data[row, 1] = item.Value; ++row; } object[] args = { data }; 

InvokeMember使用的理由是什么,而不是简单的:

 test.Value = data; 

希望这可以帮助…