使用C#将数组读入Excel列

我试图读入数组中的第一列的值。 什么是最好的方式来做到这一点? 以下是我到目前为止的代码。 基本上我试图得到该列的数据范围,所以我可以拉单元格值到一个系统数组。

Microsoft.Office.Interop.Excel.Application xlsApp = new Microsoft.Office.Interop.Excel.Application(); if (xlsApp == null) { Console.WriteLine("EXCEL could not be started. Check that your office installation and project references are correct."); return null; } //xlsApp.Visible = true; Workbook wb = xlsApp.Workbooks.Open(filename, 0, true, 5, "", "", true, XlPlatform.xlWindows, "\t", false, false, 0, true); Sheets sheets = wb.Worksheets; Worksheet ws = (Worksheet)sheets.get_Item(1); //***Breaks Here*** ListColumn column = ws.ListObjects[1].ListColumns[1]; Range range = column.DataBodyRange; System.Array myvalues = (System.Array)range.Cells.Value; 

这是我最终使用它来工作。 一旦你知道列实际上返回一个范围,这样存储似乎编译和运行良好。 这是我的ExcelReader类中的工作方法。 我打算在WebDriver上使用这个testing驱动的数据。

  public static string[] FirstColumn(string filename) { Microsoft.Office.Interop.Excel.Application xlsApp = new Microsoft.Office.Interop.Excel.Application(); if (xlsApp == null) { Console.WriteLine("EXCEL could not be started. Check that your office installation and project references are correct."); return null; } //Displays Excel so you can see what is happening //xlsApp.Visible = true; Workbook wb = xlsApp.Workbooks.Open(filename, 0, true, 5, "", "", true, XlPlatform.xlWindows, "\t", false, false, 0, true); Sheets sheets = wb.Worksheets; Worksheet ws = (Worksheet)sheets.get_Item(1); Range firstColumn = ws.UsedRange.Columns[1]; System.Array myvalues = (System.Array)firstColumn.Cells.Value; string[] strArray = myvalues.OfType<object>().Select(o => o.ToString()).ToArray(); return strArray; } 

首先,我会计算出实际使用的行数。

 Excel.Range allCellsInColumn = xlWorksheet.Range["A:A"]; Excel.Range usedCells = allCellsInColumn.Find("*", Missing.Value, Missing.Value, Missing.Value, Excel.XlSearchOrder.xlByRows, Excel.XlSearchDirection.xlPrevious, false, Missing.Value, Missing.Value); 

一旦你有了,你可以检索值:

 System.Array values = usedCells.Values; 

一旦你在数组中的值,你可以跳过没有任何内容的元素。 我不认为有一种方法可以仅仅检索其中的某些单元,而不一次一个地循环它们,这在Interop中非常耗时。

你的数据在列表中? 您的代码似乎正在寻找一个可能不存在的Excel列表。 如果不是的话,你可以把整个第一列( A:A )放到一个范围内并得到它的值:

 Range firstCol = ws.Range("A:A"); System.Array values = range.Value as System.Array;