DataRow:按给定列名选择单元格值

Vat*_*nUK 43 .net c# excel datarow

我遇到了一个我正在努力解决的DataRow问题.

使用OleDbConnection从Excel电子表格中读取数据行.

如果我尝试使用列名从DataRow中选择数据,即使存在数据,它也会返回DBNull.

但它并不那么简单.

datarow.Table.Columns[5].ColumnName返回"我的专栏".
datarow["my column"]返回DBNull.
datarow[5]返回500.
datarow[datarow.Table.Columns[5].ColumnName]返回DBNull.(只是为了确保它不是一个错字!)

我可以使用列号从数据行中选择一些东西,但我不喜欢这样做,因为如果列顺序改变,软件将会中断.

Has*_*san 59

您使用的是哪个版本的.NET?从.NET 3.5开始,有一个程序集System.Data.DataSetExtensions,它包含dataTables,dataRows等各种有用的扩展.

你可以尝试使用

row.Field<type>("fieldName");
Run Code Online (Sandbox Code Playgroud)

如果这不起作用,你可以这样做:

DataTable table = new DataTable();
var myColumn = table.Columns.Cast<DataColumn>().SingleOrDefault(col => col.ColumnName == "myColumnName");
if (myColumn != null)
{
    // just some roww
    var tableRow = table.AsEnumerable().First();
    var myData = tableRow.Field<string>(myColumn);
    // or if above does not work
    myData = tableRow.Field<string>(table.Columns.IndexOf(myColumn));
}
Run Code Online (Sandbox Code Playgroud)

  • 看看吉米的回答。它更容易并且可以完成工作。我使用 .NET Framework 4.7.2 时没有运气。 (2认同)

Jim*_*mmy 50

这必须是一个新功能或其他东西,否则我不确定为什么没有提到它.

您可以使用以下方法访问DataRow对象中列中的值row["ColumnName"]:

DataRow row = table.Rows[0];
string rowValue = row["ColumnName"].ToString();
Run Code Online (Sandbox Code Playgroud)

  • 如果数据条目为 NULL,我相信调用 ToString 时会抛出错误。 (2认同)

Gab*_*l G 9

我发现通过执行以下操作更容易访问它:

        for (int i = 0; i < Table.Rows.Count-1; i++) //Looping through rows
        {
            var myValue = Table.Rows[i]["MyFieldName"]; //Getting my field value

        }
Run Code Online (Sandbox Code Playgroud)


sll*_*sll 6

暗示

DataTable table = new DataTable();
table.Columns.Add("Column#1", typeof(int));
table.Columns.Add("Column#2", typeof(string));
table.Rows.Add(5, "Cell1-1");
table.Rows.Add(130, "Cell2-2");
Run Code Online (Sandbox Code Playgroud)

编辑:添加更多

string cellValue = table.Rows[0].GetCellValueByName<string>("Column#2");

public static class DataRowExtensions
{
    public static T GetCellValueByName<T>(this DataRow row, string columnName)
    {
        int index = row.Table.Columns.IndexOf(columnName);
        return (index < 0 || index > row.ItemArray.Count()) 
                  ? default(T) 
                  : (T) row[index];        
    }
}
Run Code Online (Sandbox Code Playgroud)