LinqToExcel返回null

时间:2015-03-03 02:38:49

标签: c# linq import-from-excel linq-to-excel

我有一张xls格式的excel表,我使用LinqToExcel读取它,然后将其导入我的数据库。

此表包含约3K行和仅6列。我正在使用.addmapping将我的类属性映射到列名

我遇到的问题是:列的细胞"网络代码"虽然单元格中有数据,但有时会返回null。

以下是一个空值的示例数据! enter image description here

我的代码观看 enter image description here

以下是数据正确的示例数据: enter image description here

我的代码观察 enter image description here

我已尝试将ExcelColumn属性应用于映射,但没有运气!

代码:

        var factory = new ExcelQueryFactory(_excelFilePath);
        factory.AddMapping<ExcelPriceEntity>(x => x.WebCode, "WEB-CODE");
        factory.AddMapping<ExcelPriceEntity>(x => x.Type, "TYPE");
        factory.AddMapping<ExcelPriceEntity>(x => x.Style, "STYLE");
        factory.AddMapping<ExcelPriceEntity>(x => x.Qty, "QTY");
        factory.AddMapping<ExcelPriceEntity>(x => x.UnitPrice, "Unit Price");
        factory.AddMapping<ExcelPriceEntity>(x => x.Bucket, "WEBCODE W/BUCKET");

        factory.StrictMapping = StrictMappingType.ClassStrict;
        factory.TrimSpaces = TrimSpacesType.Both;
        factory.ReadOnly = true;
        var prices = factory.Worksheet<ExcelPriceEntity>(_allPricesSheetName).ToList();
        var priccerNP = prices.Where(p => p.Type.Contains("900 ARROW TAPE")).ToList();

我的PriceEntity类:

public class ExcelPriceEntity
{
    //[ExcelColumn("TYPE")] 
    public string Type { get; set; }
    public string WebCode { get; set; }
    //[ExcelColumn("STYLE")] 
    public string Style { get; set; }
    //[ExcelColumn("QTY")] 
    public string Qty { get; set; }
    //[ExcelColumn("Unit Price")] 
    public string UnitPrice { get; set; }
    //[ExcelColumn("WEBCODE W/BUCKET")] 
    public string Bucket { get; set; }
}

3 个答案:

答案 0 :(得分:7)

替代解决方案: 我最终将excel表保存为csv文件,然后导入到SQL表中。然后我使用linq-to-sql来读取数据。

根本原因: 在研究之后我发现问题是这个专栏的第一个单元格(网络代码)是整数,并且excel试图通过查看第一行来找出列的数据类型!

因此,下一行(网络代码)列是一些文本数据。因此excel无法将其解析为整数,并为其分配空值!

我能做的是,将文本值分配给第一个单元格,因此excel会将数据类型猜测为字符串。但我没有测试过。对于阅读此答案的任何人,如果您遇到同样的问题,请尝试在第一行中输入文本值

答案 1 :(得分:0)

这里,Contains不像字符串包含的那样。它将单元格值列表与contains方法中的精确值进行比较。只需尝试使用全文&#34; 900 AMMONIA STOCK或CUST ......)

答案 2 :(得分:0)

@alsafoo的另一个替代解决方案是从&#34; general&#34;转换列。 to&#34; text&#34;。

以下是这些步骤:  1.右键单击列中的任何单元格。  2.在“数字”选项卡中,选择文本。  3.选择格式化单元格  4.按确定。

之后,库会将所有值读为字符串。