Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用c中的excel数据读取器获取特定单元格的内容?_C#_Excel_Exceldatareader - Fatal编程技术网

C# 如何使用c中的excel数据读取器获取特定单元格的内容?

C# 如何使用c中的excel数据读取器获取特定单元格的内容?,c#,excel,exceldatareader,C#,Excel,Exceldatareader,我有一个xlsx文件,就像它是第一张纸一样 Postcode Sales_Rep_ID Sales_Rep_Name Year Value 2121 456 Jane 2011 $84,219 2092 789 Ashish 2012 $28,322 2128 456 Janet 2013

我有一个xlsx文件,就像它是第一张纸一样

Postcode    Sales_Rep_ID    Sales_Rep_Name  Year    Value
2121            456             Jane        2011    $84,219
2092            789             Ashish      2012    $28,322
2128            456             Janet       2013    $81,879
2073            123             John        2011    $44,491
如何获取名为Year的列的特定值,该列的Sales\u Rep\u Name值为Janet?我被下面的代码卡住了,不知道怎么做

FileStream stream = File.Open(@"C:\Users\Bumba\Downloads\Sample-Sales-Data.xlsx", FileMode.Open, FileAccess.Read);
IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);

DataSet result = excelReader.AsDataSet(new ExcelDataSetConfiguration() {
ConfigureDataTable = (_) => new ExcelDataTableConfiguration() {
    UseHeaderRow = true
}
});

foreach (DataTable element in result.Tables) {
    Console.WriteLine(element.Columns["Year"].ToString());
    //what to do??????
}

excelReader.Close();
Console.ReadLine();

有人帮助……

最简单的方法就是枚举表格行,并将Sales_Rep_Name列中的值与所需值Janet进行比较:

foreach (DataTable table in result.Tables)
{
    foreach (DataRow row in table.Rows)
    {
        var salesRepName = (string)row["Sales_Rep_Name"];
        if (String.Equals(salesRepName, "Janet"))
        {
            var year = (int)(double)row["Year"];
            Console.WriteLine($"Janet's year is {year}");
        }
    }
}
您还可以使用DataTable.Selectstring filterExpression方法来匹配所需的行:

foreach (DataTable table in result.Tables)
{
    foreach (DataRow row in table.Select("Sales_Rep_Name = 'Janet'"))
    {
        var year = (int)(double)row["Year"];
        Console.WriteLine($"Janet's year is {year}");
    }
}

当数据较大时,第二种选择会更快,但第一种选择更灵活,允许使用更复杂的过滤器。

也许找到Sales_Rep_Name作为搜索条件的行并从中找到所需的单元格值是一种有效的方法?@Wubbler我该怎么做?你能给我看一下吗?@谢谢你发布了一个答案……顺便说一句,如果Janet的名字在同一列中多次出现,我想得到第n个的值怎么办?在这两个变体中,行上都有一个循环。您只需添加计数器并对照n检查其当前值。附带的代码解释通常有助于提供完整答案,因为提问者可能不熟悉计数器,因此可能难以理解导致其不是可接受答案的原因。考虑一下你的答案并添加一些你所发布的代码的解释。
//Code to get an specific cell value
var asOfCell = "AB2";
var match = Regex.Match( asOfCell, @"(?<col>[A-Z]+)(?<row>\d+)" );
var colStr = match.Groups["col"].ToString();
//I rest 1 for colunm and row due to I will work with an array and it begins by zero.
var col = (int) ( colStr.Select( ( t, i ) => ( colStr[i] - 64 ) * Math.Pow( 26, colStr.Length - i - 1 ) ).Sum() ) - 1;
var rowSelected = int.Parse( match.Groups["row"].ToString() ) - 1;
var cellSelectedValue = table.Rows[rowSelected][col];