从Excel中检索“行对”

时间:2013-02-23 14:17:19

标签: c# linq excel grouping

我正在尝试使用C#从Excel电子表格中检索数据。电子表格中的数据具有以下特征:

  • 没有分配列名

  • 行可以有不同的列长

  • 某些行是元数据,这些行标记下一行中列的内容

因此,我需要构造的对象将始终在第一列中具有其名称,并且其参数包含在下一列中。从上面的行中检索参数名称非常重要。一个例子:

row1|---------|FirstName|Surname|

row2|---Person|Bob------|Bloggs-|

row3|---------|---------|-------|

row4|---------|Make-----|Model--|

row5|------Car|Toyota---|Prius--|

所以不幸的是,数据是异构的,确定哪些行“属于一起”的唯一方法是检查行中的第一列是否为空。如果是,则读取行中的所有数据,并通过检查上面的行检查应用哪些参数名称。 起初我认为直接的方法是简单地循环

1)包含所有纸张的数据集,然后是 2)数据表(即表格)和
3)排。

但是,我发现尝试使用嵌套循环和if语句提取此数据会导致可怕,不可读和不灵活的代码。 在LINQ中有没有办法做到这一点?我看一下this article开始,过滤数据之间的空行,但实际上并没有得到任何结果。有人可以用几个代码片段指出我正确的方向吗?

提前致谢! 纮

1 个答案:

答案 0 :(得分:3)

我看到你已经接受了答案,但我认为更通用的解决方案是可能的 - 使用反射。

假设您将数据作为List<string[]>,其中列表中的每个元素都是一个字符串数组,其中包含来自相应行的所有单元格。

List<string[]> data;
data = LoadData();

var results = new List<object>();
string[] headerRow;

var en = data.GetEnumerator();
while(en.MoveNext())
{
    var row = en.Current;
    if(string.IsNullOrEmpty(row[0]))
    {
        headerRow = row.Skip(1).ToArray();
    }
    else
    {
        Type objType = Type.GetType(row[0]);
        object newItem = Activator.CreateInstance(objType);

        for(int i = 0; i < headerRow.Length; i++)
        {
            objType.GetProperty(headerRow[i]).SetValue(newItem, row[i+1]);
        }
        results.Add(newItem);
    }
}