6

我正在尝试将第一列的值读入数组。最好的方法是什么?以下是我到目前为止的代码。基本上我正在尝试获取该列的数据范围,以便可以将单元格值拉入系统数组。

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;
4

3 回答 3

9

这是我最终用来让它工作的东西。一旦您知道 Columns 实际上返回了一个范围,那么以这种方式存储它似乎可以编译并运行良好。这是我的 ExcelReader 类中的工作方法。我计划将其用于 WebDriver 上的测试驱动数据。

    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;
    }
于 2012-12-14T21:42:49.937 回答
2

首先,我会计算出实际使用了多少行:

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 中非常耗时。

于 2012-12-14T21:43:02.393 回答
0

您的数据在列表中吗?您的代码似乎正在寻找一个可能不存在的 Excel 列表。如果不是,您可以将整个第一列 ( A:A) 放入 Range 中并获取它的值:

Range firstCol = ws.Range("A:A");
System.Array values = range.Value as System.Array;   
于 2012-12-14T21:29:28.157 回答