ExcelDataReader
不支持GetOrdinal
。调用GetOrdinal
方法会导致异常:
'不支持方法'
while (reader.Read())
{
var id = reader.GetOrdinal("id");
...
}
我认为意图是使用ExcelDataReader.DataSet
包,但这与.NetCore不兼容。
是否有任何已知的工作是按名称而不是按索引来获取列?
如下所示,但依赖于按特定顺序排列的列:
while (reader.Read())
{
var id = reader.GetValue(0);
...
}
答案 0 :(得分:0)
不幸的是,目前无法在ExcelDataReader
中使用它,因为即使在source code我们也可以获得:
public string GetName(int i) => throw new NotSupportedException();
public int GetOrdinal(string name) => throw new NotSupportedException();
正如你所说,.NET Core 1还不支持DataSet,但如果相信这个link它应该在.NET Core 2中。也许那时将出现.NET Core的ExcelDataReader.DataSet版本。现在你应该编写自己的GetOrdinal实现,它也提到了in this discussion。您可以编写简单的实现(不能处理具有相同名称的2个或更多列的情况,如果您的工作表的第1行上的列名称有效),就像现在这样:
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");