我的Excel拥有全年的数据。我想使用c#中的某些公式或代码在每个月中找到最低价和最高价。我可以通过简单地将MIN和MAX公式应用于每个月来实现这一目标通过从日期1到31或30中选择列中的值来确定值。但是我不想每个月重复一次。寻找解决方案。
答案 0 :(得分: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; }
}
答案 1 :(得分:0)
您可以使用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;"> " & D4
是指出日期必须在月初之后的第一个条件。 A:A;"<" & EDATE(D4;1)
是表示日期必须在月底之前的第二个条件。计算公式为:
C D
01/01/2018 2
01/02/2018 3
01/03/2018 5