【问题标题】:Find the min and max value in every month in excel using c#使用c#在excel中查找每个月的最小值和最大值
【发布时间】:2018-12-21 22:43:35
【问题描述】:

我有一个包含全年数据的 excel。我想使用 c# 中的一些公式或代码找到每个月的低点和高点。我可以通过简单地将 MIN 和 MAX 公式应用于每个月的值来实现这一点从日期 1 到 31 或 30 的列中选择值。但我不想每个月都重复相同的值。正在寻找解决方案。

【问题讨论】:

  • 我们不知道您的文件的结构。您必须向我们展示您拥有什么、需要什么、尝试了什么以及获得了什么。
  • 如果您真的要求 C#,那么请向我们展示您到目前为止所获得的代码(从工作表中读取 - epplus、oledb、excel interop? - 在 C# 中表示 Excel 数据数据结构)。 excel-formula 标记会建议在 Excel 公式表达式语法或 VBA 中寻找答案。

标签: c# excel excel-formula


【解决方案1】:

您可以通过使用 OleDB 读取数据来做到这一点,您可能正在寻找类似这样的东西...

    static void Main(string[] args)
    {
        string filepath = @"C:\temp\Data.xlsx"; //Location and name of the .xlsx? file
        string connectioninfo = $@"Provider =Microsoft.ACE.OLEDB.12.0;Data Source={ filepath };
                                   Extended Properties = 'Excel 12.0;HDR=YES;IMEX=1;';";

        string query = @"SELECT * FROM [Data$]"; //Worksheet name, if more than one year add a where clause

        List<ExcelDataModel> entries = new List<ExcelDataModel>();

        using (OleDbConnection conn = new OleDbConnection(connectioninfo))
        {
            OleDbCommand command = new OleDbCommand(query, conn);

            conn.Open();

            OleDbDataReader reader = command.ExecuteReader();

            if (reader.HasRows)
                while (reader.Read())
                    entries.Add(new ExcelDataModel { DT = Convert.ToDateTime(reader[0]),
                                                High = double.Parse(reader[1].ToString()),
                                                Low = double.Parse(reader[2].ToString()) });

            conn.Close();
        }

        var values = entries.GroupBy(x => x.DT.Month).Select(i => new { dt = i.Key, High = i.Max(y => y.High), Low = i.Min(y => y.Low) }).ToList();

        //Do whatever you need with the records
        values.ForEach(month => { Console.WriteLine($"Month: { month.dt } \t Highest: { month.High } \t Lowest: { month.Low }"); });

        Console.ReadLine();
    }

我还添加了一个类来临时存储 Excel 工作表中的所有行:

public class ExcelDataModel
{
    public DateTime DT { get; set; }
    public double High { get; set; }
    public double Low { get; set; }
}

【讨论】:

  • Thankzz Suppe...这正是我想要的✌️?
【解决方案2】:

您可以使用MAXIFS function。它的参数是搜索最大值的范围,然后是具有标准的值集。一些示例数据:

A             B     
01/01/2018    1
21/01/2018    2
10/02/2018    3
02/03/2018    4
22/03/2018    5
11/04/2018    6

然后你可以使用这些公式来计算每月的最大值:

C             D
01/01/2018    =MAXIFS(B:B;A:A;">= " & D2;A:A;"<" & EDATE(D2;1))
=EDATE(C2;1)  =MAXIFS(B:B;A:A;">= " & D3;A:A;"<" & EDATE(D3;1))
=EDATE(C3;1)  =MAXIFS(B:B;A:A;">= " & D4;A:A;"<" & EDATE(D4;1))

B:B 是搜索最大值的范围。 A:A;"&gt; " &amp; D4 是第一个表明日期必须在月初之后的条件。 A:A;"&lt;" &amp; EDATE(D4;1) 是第二个条件,表示日期必须在月底之前。这计算为:

C             D
01/01/2018    2
01/02/2018    3
01/03/2018    5

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 2017-08-18
    • 1970-01-01
    • 2023-04-10
    • 2021-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多