问题描述
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 = 1
和headerRow - 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