我已经在这几天苦苦挣扎了,我很难过。我希望有人可以提供替代建议。 基本上,我正在使用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();
我对你可能有的任何其他建议持开放态度,因为我完全被难倒了。非常感谢你。
答案 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;