C# LinqToExcel未解析日期

C# LinqToExcel未解析日期,c#,linq-to-excel,C#,Linq To Excel,我正在与一个客户机合作,将一个相当大的Excel文件(超过37K行)导入到一个自定义系统中,并利用优秀的LinqToExcel库来实现这一点。在阅读中的所有数据时,我注意到其中80%的数据打破了记录,并进一步挖掘。它失败的原因是大多数记录(相关日期范围为2011-2015)都是正常的,例如,1/3/2015,但是从2016年开始,结构变化如下:'1/4/2016(注意日期开头的“勾号”),LinqToExcel开始为该列返回DBNull 有没有关于它为什么会这样做的想法和解决方法?请注意,这不是

我正在与一个客户机合作,将一个相当大的Excel文件(超过37K行)导入到一个自定义系统中,并利用优秀的LinqToExcel库来实现这一点。在阅读中的所有数据时,我注意到其中80%的数据打破了记录,并进一步挖掘。它失败的原因是大多数记录(相关日期范围为2011-2015)都是正常的,例如,
1/3/2015
,但是从2016年开始,结构变化如下:
'1/4/2016
(注意日期开头的“勾号”),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中的原始数据。
中的值全部对齐,日期列除外,该列为空

**编辑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();
    }
private IEnumerable GetRowResults(IDataReader数据,IEnumerable列)
{
var results=新列表();
var columnIndexMapping=新字典();
对于(var i=0;i

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

找到了!一旦我发现失败的是
OleDbDataReader
,而不是LinqToExcel库本身,它就让我走上另一条路四处看看。显然,当一个Excel文件被一个
OleDbDataReader
读取时(实际上所有的实用程序都是这样做的),最初的几条记录会被扫描以确定与该列相关的内容类型。在我的场景中,超过2万条记录有“正常”日期,因此它假设所有内容都是日期。一旦到达“坏”记录,日期前面的
意味着无法将其解析为日期,因此该值为空

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


来源:

是否可以选择清理Excel电子表格以使日期有效?我现在正试图从客户端获取一个正确的日期,否则手动编辑将是唯一的选择,并且它位于5K记录的北部。我更惊讶的是,这个值一般来说不能被读取,它不是我的代码,而是LinqToExcel库本身的一部分。这就是无法正确读取值的原因。您正在调用LinqToExcel库吗?你能给我们看看那个密码吗?在没有看到代码的情况下给出建议是非常困难的。尽可能多地向我们展示(调用LinqToExcel的代码、映射、数据映射到的类等)。完成!我添加了示例代码,但对于这个库,我不确定这是否有帮助。我认为LinqToExcel默认情况下忽略了第一行(标题行)。我错了吗?这是一个可选设置,是的。这方面的数据太差了,我不认为这是LinqToExcel的错误——这是因为我提供的数据有多差。