不幸的是,目前无法从 使用它ExcelDataReader
,因为即使在源代码中我们也只能得到:
public string GetName(int i) => throw new NotSupportedException();
public int GetOrdinal(string name) => throw new NotSupportedException();
正如您所说,.NET Core 1 尚不支持 DataSet,但如果相信此链接应该在 .NET Core 2 中。也许会出现适用于 .NET Core 的 ExcelDataReader.DataSet 版本。现在,您应该编写自己的 GetOrdinal 实现,本讨论中也提到了它。您现在可以像这样编写简单的实现(不处理具有相同名称的 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");