2017-08-10 87 views
0

ExcelDataReader与.NetCore 1.1不支持GetOrdinal。调用GetOrdinal方法导致的异常:“不支持方法”ExcelDataReader .Net核心中的GetOrdinal方法

while (reader.Read()) 
{ 
    var id = reader.GetOrdinal("id"); 
    ... 
}  

我相信意图是使用ExcelDataReader.DataSet包代替,然而,是不是与.NetCore兼容。

是否有任何已知的通过名称而不是索引获取列的工作?

如下面的作品,但在列按照一定的顺序是依赖:

while (reader.Read()) 
{ 
    var id = reader.GetValue(0); 
    ... 
} 

回答

0

不幸的是,现在还没有办法从ExcelDataReader使用它,因为即使在source code,我们只是得到:

public string GetName(int i) => throw new NotSupportedException(); 
    public int GetOrdinal(string name) => throw new NotSupportedException(); 

正如你所说的DataSet不是.NET核心1尚不支持,但如果认为这link它应该是在.NET核心2.也许这样ExcelDataReader.DataSet for .NET的核心版本将会出现。现在你应该写你自己的GetOrdinal实现,其中也提到了in this discussion。你可以写你轻松实现(不与2个或多个列具有相同名称的审理,对您的工作表的第一行,如果你的列名工作)现在这个样子的:

public static class ExcelExtensionMethods 
    { 
     static Dictionary<int, string> _columns = new Dictionary<int, string>(); 

     public static int GetOrdinalCustom(this IExcelDataReader reader, string colName) 
     { 
      if (reader.Depth == 0 && _columns.Count<reader.FieldCount) 
       FillColumns(reader); 

      var columnIndex = _columns.Any(xx => xx.Value.Contains(colName.ToLower())) 
       ? _columns.FirstOrDefault(xx => xx.Value.Contains(colName.ToLower())).Key 
       : -1; 

      return columnIndex; 
     } 

     private static void FillColumns(IExcelDataReader reader) 
     { 
      for (int i = 0; i < reader.FieldCount; i++) 
      { 
       _columns.Add(i, reader.GetValue(i).ToString().ToLower()); 
      } 
     } 
    } 

和使用你的代码如下:

var author = reader.GetOrdinalCustom("Author"); 
    var mark = reader.GetOrdinalCustom("Mark");