检索“;行对”;来自Excel
本文关键字:来自 Excel 行对 检索 | 更新日期: 2023-09-27 18:00:37
我正在尝试使用C#从Excel电子表格中检索数据。电子表格中的数据具有以下特征:
-
没有分配列名
-
行可以具有不同的列长度
-
有些行是元数据,这些行标记下一行中列的内容
因此,我需要构造的对象的名称总是在第一列中,其参数包含在下一列中。从上面的行中检索参数名称是很重要的。一个例子:
row1|---------|FirstName|Surname|
row2|---Person|Bob------|Bloggs-|
row3|---------|---------|-------|
row4|---------|Make-----|Model--|
row5|------Car|Toyota---|Prius--|
因此,不幸的是,数据是异构的,确定哪些行"属于一起"的唯一方法是检查行中的第一列是否为空。如果是,则读取该行中的所有数据,并通过检查上面的行来检查应用了哪些参数名称。起初,我认为直接的方法是简单地循环通过
1) 包含所有工作表的数据集,然后
2) 数据表(即工作表)和
3) 行。
然而,我发现试图用嵌套循环和if语句提取这些数据会导致糟糕、不可读和不灵活的代码。在LINQ中有办法做到这一点吗?我看了这篇文章,从过滤数据之间的空行开始,但并没有真正取得进展。有人能用一些代码片段为我指明正确的方向吗?
提前感谢!hiro
我知道您已经接受了答案,但我认为更通用的解决方案是可能的——使用反射。
假设您获得的数据是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);
}
}