Microsoft.Interop.Excel无法读取单元格值

问题描述

我写了一个方法,可以在excel中给表头:

private List<string> GetCurrentHeaders(int headerRow,Excel.Worksheet ws)
{
    //List where specific values get saved if they exist
    List<string> headers = new List<string>();
    //List of all the values that need to exist as headers
    var headerlist = columnName.GetAllValues();

    for (int i = 0; i < headerlist.Count; i++)
    {
        //GetData() is a Method that outputs the Data from a cell.
        //headerRow is defining one row under the row I actually need,therefore -1 )
        string header = GetData(i + 1,headerRow - 1,ws);

        if (headerlist.Contains(header) && !headers.Contains(header))
        {
            headers.Add(header);
        }
    }

    return headers;
}

现在我得到一个Excel表格,我需要的第一个值在单元格A11(或第11行,第1列)中。

当我在string header = GetData(i + 1,ws);之后设置断点,其中i+1 = 1headerRow - 1 = 11时,我可以看到他读取的值是空的,情况并非如此。

GetData-Method只做一件简单的事情:

public string GetData(int row,int col,Excel.Worksheet ws)
{
    string val = "";

    val = Convert.ToString(ws.Cells[row,col].Value) != null 
        ? ws.Cells[row,col].Value.ToString() :  "";

    val = val.Replace("\n"," ");

    return val;
}

我不明白为什么它不能为我提供所需的值,尽管它也适用于其他所有excel表。 excel本身与其他没有什么不同。文件扩展名为.xls,数据与其他表的布局相同,等等。

解决方法

有几个步骤可以解决这个问题。您需要知道表的尺寸才能知道标题在哪里。您的方法有两种了解方法:1)将表Range传递给该方法,或2)给出表中单元格的坐标(通常是左上角的单元格)并信任{{1} }属性来为您完成工作。最可靠的方法是第一种,因为您将明确告诉该方法在哪里看,但是这将要求使用者找出不总是很简单的地址。 CurrentRegion方法也可以很好地工作,但是请注意,如果表范围内有一个空列,那么它将只处理该空列。说了这么多,您可以拥有以下内容:

CurrentRegion

然后,您可以简单地测试是否缺少标题。以下代码假定List<string> GetHeaders(Worksheet worksheet,int row,int column) { Range currentRegion = worksheet.Cells[row,column].CurrentRegion; Range headersRow = currentRegion.Rows[1]; var headers = headersRow .Cast<Range>() // We cast so we can use LINQ .Select(c => c.Text is DBNull ? null : c.Text as string) //The null value of c.Text is not null but DBNull .ToList(); return headers; } 是表ActiveCell中的一个单元格,但是您可以轻松地更改它以寻址特定的单元格。

Range