Read Excel First Column using C# into Array

46,978

Solution 1

Here is what I ended up using to get it to work. Once you know that Columns actually returns a range, storing it that way seems to compile and run fine. Here is the working method in my ExcelReader class. I plan to use this for test driven data on 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;
    }

Solution 2

First, I'd work out how many rows are actually being used:

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

Once you have that you can retrieve the values:

System.Array values = usedCells.Values;

Once you have the values in the array you can skip over the elements with nothing in them. I don't think there is a way of retrieving just the cells with something in them without looping through them one at a time, which is very time consuming in Interop.

Share:
46,978
Brantley Blanchard
Author by

Brantley Blanchard

Updated on March 14, 2020

Comments

  • Brantley Blanchard
    Brantley Blanchard about 4 years

    I'm trying to read in the values of the first column into an array. What's the best way to do that? Below is the code I have so far. Basically I'm trying to get the range of data for that column so I can pull the cell values into a system array.

    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;