LinqToExcel不解析日期

时间:2017-07-25 23:22:28

标签: c# linq-to-excel

我正在与客户合作,将一个相当大的Excel文件(超过37K行)导入自定义系统,并利用优秀的LinqToExcel库来实现这一目标。在阅读所有数据时,我注意到它打破了大约80%的记录并进一步挖掘。它失败的原因是大多数记录(相关日期范围为2011年至2015年)是正常的,例如1/3/2015,但是从2016年开始,结构更改为:'1/4/2016(注意日期开头的“tick”),LinqToExcel开始返回该列的DBNull。

关于它为什么会这样做以及解决方法的任何想法?请注意,这不是一个强制转换问题 - 我可以使用立即窗口查看LinqToExcel.Row值的所有值以及该列索引的位置,它是空的。

修改

以下是我在文件中使用的代码:

var excel = new LinqToExcel.ExcelQueryFactory(Path.Combine(this.FilePath, this.CurrentFilename));
foreach (var row in excel.Worksheet(file.WorksheetName))
{
    data.Add(this.FillEntity(row));
}

我所指的问题是row变量,它是一个LinqToExcel.Row实例,包含来自Excel的原始数据。 row内的值都排成一行,但日期列为空。

** 编辑2 **

我从GitHub下载了LinqToExcel代码并将其连接到我的项目,看起来问题比这个库更深。它使用IDataReader读取所有值,并且那些未被读取的单元格从该级别为空。这是来自的代码块  失败的LinqToExcel.ExcelQueryExecutor类:

private IEnumerable<object> GetRowResults(IDataReader data, IEnumerable<string> columns)
    {
        var results = new List<object>();
        var columnIndexMapping = new Dictionary<string, int>();
        for (var i = 0; i < columns.Count(); i++)
            columnIndexMapping[columns.ElementAt(i)] = i;

        while (data.Read())
        {
            IList<Cell> cells = new List<Cell>();
            for (var i = 0; i < columns.Count(); i++)
            {
                var value = data[i];

                //I added this in, since the worksheet has over 37K rows and 
                //I needed to snag right before it hit the values I was looking for
                //to see what the IDataReader was exposing. The row inside the
                //IDataReader relevant to the column I'm referencing is null,
                //even though the data definitely exists in the Excel file
                if (value.GetType() == typeof(DateTime) && value.Cast<DateTime>() == new DateTime(2015, 12, 31))
                {
                }



                value = TrimStringValue(value);
                cells.Add(new Cell(value));
            }
            results.CallMethod("Add", new Row(cells, columnIndexMapping));
        }
        return results.AsEnumerable();
    }

由于他们的班级使用OleDbDataReader来检索结果,我认为这是找不到相关单元格的值。我甚至不知道从哪里去。

1 个答案:

答案 0 :(得分:0)

发现它!一旦我追溯到OleDbDataReader失败而不是LinqToExcel库本身,它就会让我沿着不同的路径环顾四周。显然,当OleDbDataReader读取Excel文件时(几乎所有实用程序都在封面下),扫描前几条记录以确定与该列关联的内容类型。在我的场景中,超过20K的记录有#34;正常&#34;日期,所以它假设一切都是约会。一旦它到了&#34;坏&#34;记录,日期前面的'意味着它无法解析为日期,因此该值为空。

为了避免这种情况,我加载文件并告诉它忽略列标题。由于此列的标题是一个字符串,并且大多数值是日期,因为类型不匹配并且正确加载了我需要的值,所以它使所有内容成为字符串。从那里,我可以相应地解析并使其工作。

来源:What is IMEX in the OLEDB connection string?