2017-08-10 90 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");