使用C#将excel范围转换为数组

我想使用C#将excel范围转换为数组

System.Array MyRange = (System.Array)range.cells.value; for (int k = 0; k <= MyRange.Length; k++) { List<service_name> _ml = new List<service_name>(); for (int j = 1; j < dataitems.Count; j++) { // enter code here } } 

如何在循环中迭代,但此代码不起作用,并调用错误:

“无法投射types为”System.String“的对象来input”System.Array“。

根据我在这里提供的帮助,这就是我如何在Excel中读写数组。

 var xlApp=new Microsoft.Office.Interop.Excel.Application(); var wb=xlApp.Workbooks.Open(fn, ReadOnly: false); xlApp.Visible=true; var ws=wb.Worksheets[1] as Worksheet; var r=ws.Range["A2"].Resize[100, 1]; var array=r.Value; // array is object[1..100,1..1] for(int i=1; i<=100; i++) { var text=array[i, 1] as string; Debug.Print(text); } // to create an [1..100,1..1] array use var array2=Array.CreateInstance( typeof(object), new int[] {100, 1}, new int[] {1, 1}) as object[,]; // fill array2 for(int i=1; i<=100; i++) { array2[i, 1] = string.Format("Text{0}",i); } r.Value2=array2; wb.Close(SaveChanges: true); xlApp.Quit(); 

调试高强

该错误意味着该值是一个string,所以你不能直接将其转换为数组。

如果该值是例如逗号分隔的string,则可以使用Split来获取数组:

 string[] MyRange = (range.Cells.Value + "").Split(','); for (int k = 0; k < MyRange.Length; k++) { //...loop here... } 

还修复你的循环,你会得到索引超出界限错误。

原始post中的错误信息发生在范围恰好由一个单元格组成时,因为结果值的types是变体,实际上可以是数组,双string,date和空值。

一种解决scheme可以是检查细胞数量,并在一个细胞的情况下采取不同的行动。

我的解决scheme创build一个单元格数组。 即使一个或多个单元格为空,这可能会导致null对象。 (当范围内的所有单元都为空时,Range.Cells.Value为空。

 System.Array cellArray = range.Cells.Cast<Excel.Range>().ToArray<Excel.Range>(); 

如果你喜欢数组的列表(像我这样),你可以使用这个代码:

 List<Excel.Range> listOfCells = range.Cells.Cast<Excel.Range>().ToList<Excel.Range>(); 

范围可以是一维或二维的。

最后,如果你确实需要一个string数组,这里是:

 string[] strArray = range.Cells.Cast<Excel.Range>().Select(Selector).ToArray<string>(); 

其中Selector函数如下所示:

 public string Selector(Excel.Range cell) { if (cell.Value2 == null) return ""; if (cell.Value2.GetType().ToString() == "System.Double") return ((double)cell.Value2).ToString(); else if (cell.Value2.GetType().ToString() == "System.String") return ((string)cell.Value2); else if (cell.Value2.GetType().ToString() == "System.Boolean") return ((bool)cell.Value2).ToString(); else return "unknown"; } 

我包括“未知”的情况下,我不记得Value2可以返回的所有数据types。 如果您发现任何其他types,请改善此function。

谈话迟到,但这是一个方法来做到这一点:

 static string[][] GetStringArray(Object rangeValues) { string[][] stringArray = null; Array array = rangeValues as Array; if (null != array) { int rank = array.Rank; if (rank > 1) { int rowCount = array.GetLength(0); int columnCount = array.GetUpperBound(1); stringArray = new string[rowCount][]; for (int index = 0; index < rowCount; index++) { stringArray[index] = new string[columnCount-1]; for (int index2 = 0; index2 < columnCount; index2++) { Object obj = array.GetValue(index + 1, index2 + 1); if (null != obj) { string value = obj.ToString(); stringArray[index][index2] = value; } } } } } return stringArray; } 

所谓:

 string[][] rows = GetStringArray(range.Cells.Value2);