LinqToExcel:如何排除某些行?

时间:2012-09-28 14:02:09

标签: c# linq c#-4.0 linq-to-excel

我已经在这几天苦苦挣扎了,我很难过。我希望有人可以提供替代建议。 基本上,我正在使用LinqToExcel从excel读取数据。但我想排除“评级”为“NR”的所有行。以下是我的数据示例:

CompanyName Rating  SalesMan
Apple       2       Steve
Google      NR      Steve
Microsoft   3       John
Dell        1       Steve
Pepsi       3       John

我只是想找到所有属于史蒂夫但没有“NR”等级的公司。我的最终名单应该是:

CompanyName SalesMan
Apple       Steve
Dell        Steve

我尝试过以下代码,但不起作用:

1)

var masterList = masterDataXL.Worksheet("data_all").Where(d => !d["Rating"].Equals("NR"));

2)

var masterList = masterDataXL.Worksheet("data_all")
    .Where(m =>
        !m["Rating"].Equals("NR")
        &&
        m["SalesMan"].ToString().Contains(resAnLastName)) // check for last name
    .Select(m => new ResAnTicksDataClass
    {
        Company = m["CompanyName"],
        Rating = m["Rating"],
        Seller = m["SalesMan"]
    }).AsEnumerable();

3)为评级创建了一个属性并执行以下操作:

var masterList = masterDataXL.Worksheet("data_all")
.Where(m =>
    m["Analyst"].ToString().Contains(resAnLastName)) // check for last name
.Select(m => new ResAnTicksDataClass
{
    Company = m["CompanyName"],
    Rating = m["Rating"],
    Seller = m["SalesMan"]
}).AsEnumerable();
var dataList = (from m in masterList
where m.Rating != "NR"
select new ResAnTicksDataClass
{
    ResAnName = m.ResAnName,
    DescrTick = m.DescrTick
}).AsEnumerable();

我对你可能有的任何其他建议持开放态度,因为我完全被难倒了。非常感谢你。

2 个答案:

答案 0 :(得分:4)

我建议您在Excel文件中选择“评级”列并进行搜索&替换选择(CHange'NR'为'0')然后过滤。应该有助于使用单一数据类型。

正如phoog所说,将Excel文件转换为表格,该表格需要指定每个列的类型。为此,它只会查看Excel文件的前10行。因此,如果您的文件在前10行中没有“NR”值,则会将列类型设置为INT,因此无法转换值“NR”。 解决此问题的一个简单方法是在Excel文件中添加一行,就在第一个数据行之前,使用您要使用的数据类型的数据。

例如,如果列使用文本值,有时文本使用超过255个caracters,请确保前10行至少有1个文本值,使用256个caracters。否则,一旦创建表格,该列将设置为VARCHAR(255)而不是VARCHAR(MAX),然后在转换长度超过255个字符的文本时崩溃。

结论:始终确保前10行使用正确的类型和大小以适合Excel文件的所有行!

答案 1 :(得分:0)

在您的第一个样本中,您应该更改此内容:

d => !d["Rating"].Equals("NR")

到此:

d => d["Rating"] != "NR"

它也可以用更清洁的方式编写:

var masterList = 
    from d in masterDataXL.Worksheet("data_all")
    where d["Rating"] != "NR"
    select d;