C#Interop将数组数组写入工作表

我想写一个2d数组到工作表,我得到以下错误:

指定的数组不是预期的types。

这是我的代码:

string[][] allEvars = new string[evars.Count][]; for (var i = 0; i < evars.Count; i++) { var evarsList = new List<string>(); evarsList.Add(evars[i].id.Value); evarsList.Add(evars[i].name.Value); if (evars[i].enabled != null) evarsList.Add(evars[i].enabled.Value.ToString()); else evarsList.Add(""); if (evars[i].description != null) evarsList.Add(evars[i].description.Value); else evarsList.Add(""); string[] evarsArray = evarsList.ToArray(); //var range = (Excel.Range)wsEvars.Range[wsEvars.Cells[i + 5, 2], wsEvars.Cells[i + 5, evarsArray.Length]]; //range.Value = evarsArray; allEvars[i] = evarsList.ToArray(); } var range = (Excel.Range)wsEvars.Range[wsEvars.Cells[5, 2], wsEvars.Cells[allEvars.Length, 3]]; range.Value2 = allEvars; // This is the line with the exception 

从我的代码2注释行添加到工作表中的数组一个接一个,我试图一次添加它们,以节省一些时间。

你可以将数组的数组强制转换为2d数组。 从这个答案使用Jon Skeet方法

 static T[,] CreateRectangularArray<T>(T[][] arrays) { // TODO: Validation and special-casing for arrays.Count == 0 int minorLength = arrays[0].Length; T[,] ret = new T[arrays.Length, minorLength]; for (int i = 0; i < arrays.Length; i++) { var array = arrays[i]; if (array.Length != minorLength) { throw new ArgumentException ("All arrays must be the same length"); } for (int j = 0; j < minorLength; j++) { ret[i, j] = array[j]; } } return ret; } 

在你的代码中:

  string[][] allEvars = new string[evars.Count][]; for (var i = 0; i < evars.Count; i++) { var evarsList = new List<string>(); evarsList.Add(evars[i].id.Value); evarsList.Add(evars[i].name.Value); if (evars[i].enabled != null) evarsList.Add(evars[i].enabled.Value.ToString()); else evarsList.Add(""); if (evars[i].description != null) evarsList.Add(evars[i].description.Value); else evarsList.Add(""); string[] evarsArray = evarsList.ToArray(); //var range = (Excel.Range)wsEvars.Range[wsEvars.Cells[i + 5, 2], wsEvars.Cells[i + 5, evarsArray.Length]]; //range.Value = evarsArray; allEvars[i] = evarsList.ToArray(); } var range = (Excel.Range)wsEvars.Range[wsEvars.Cells[5, 2], wsEvars.Cells[allEvars.Length, 3]]; string[,] newallEvars = CreateRectangularArray<string>(allEvars); //added row range.Value2 = newallEvars; // changed row