Найти минимальное и максимальное значение в каждом месяце в excel с помощью c #

Я слышал, что DataTemplateSelectors не обновляют шаблон, если значение, на котором они основаны на изменениях, и из-за этого я обычно их не использую.

Мой предпочтительный метод на самом деле для использования DataTemplates.

<MyControl.Resources>
    <DataTemplate TargetType="{x:Type local:BooleanModel}">
        <local:BooleanView />
    </DataTemplate>
    <DataTemplate TargetType="{x:Type local:IntegerModel}">
        <local:IntegerView />
    </DataTemplate>
    ...
</MyControl.Resources>

Во-вторых, если я хочу изменить шаблон на основе свойства, а не типа объекта, я предпочитаю использовать DataTriggers. Это связано с тем, что если это свойство когда-либо изменено, уведомление PropertyChange будет автоматически сообщать пользовательскому интерфейсу, что он изменился, и обновить шаблон. Я не верю, что DataTemplateSelectors делает это автоматически. Я также предпочитаю видеть логику выбора шаблона в своем XAML, не скрывать его в файле TemplateSelector, но это только личное предпочтение.

И мой последний выбор - использовать DataTemplateSelector. Я почти никогда не использую его в приложении WPF, хотя часто делаю это в Silverlight, так как он не поддерживает мой предпочтительный метод использования неявного DataTemplates (пока)

. Я не знаю каких-либо существенных различий в производительности между ними, хотя мне было бы интересно, если кто-то скажет мне об этом.

0
задан Ankush Butole 13 July 2018 в 14:13
поделиться

2 ответа

Вы можете сделать это, читая данные с помощью 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
ответ дан Suppe 17 August 2018 в 12:39
поделиться

Вы можете использовать функцию MAXIFS . Его аргументами являются диапазон поиска максимума, а затем набор значений с критерием. Некоторые примерные данные:

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
0
ответ дан Andomar 17 August 2018 в 12:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: