Usarsef Ответов: 3

Как вычислить сумму datatable с условиями C#


У меня есть dataTable, где я получаю данные из импортированного файла excel с помощью Microsoft Office Interop Excel, а затем показываю их в datagridview

Поэтому ищу фильтр и вычислять данные из DataTable и показать его 2-й элемент
Вот как создается datatable
xlRange = xlWorlSheet.UsedRange;
                   dt.Columns.Add("ID", typeof(string));
                   dt.Columns.Add("NA", typeof(string));
                   dt.Columns.Add("ACC", typeof(decimal));
                   dt.Columns.Add("DEP", typeof(string));
                   dt.Columns.Add("AMOUNT", typeof(string));

for (xlRow = 2; xlRow <= xlRange.Rows.Count; xlRow++)
                   {
                           if (xlRange.Cells[xlRow, 2].Text != "")
                       {
                           dt.Rows.Add(new object[] {
                       xlRange.Cells[xlRow, 1].Text,xlRange.Cells[xlRow, 2].Text, xlRange.Cells[xlRow, 3].Text, xlRange.Cells[xlRow, 4].Text,
                       xlRange.Cells[xlRow, 5].Text});


Теперь у меня есть где работать нормально но сумма из условия select всегда получает 0 в качестве суммы

Что я уже пробовал:

  decimal SumAmnt = (from DataGridViewRow row in dataGridView1.Rows
where row.Cells[0].FormattedValue.ToString() == xlRange.Cells[xlRow, 1].Text
select Convert.ToDecimal(row.Cells["AMOUNT"].FormattedValue, new CultureInfo("en-US"))).Sum();

3 Ответов

Рейтинг:
1

Usarsef

System.Data.DataTable table = new System.Data.DataTable();

                  table.Columns.Add("NA", typeof(decimal));
                  table.Columns.Add("AMOUNT", typeof(decimal));
                  table = dt.AsEnumerable()
                 .GroupBy(r => r["NA"])
                 .Select(g =>
                 {
                     var row = table.NewRow();

                     row["NA"] = g.Key;
                     row["AMOUNT"] = g.Sum(r => (decimal)r["AMOUNT"]);

                     return row;
                 }).CopyToDataTable();

                  dataGridView2.DataSource = table;

                  }


Рейтинг:
0

Garth J Lancaster

Ваша проблема говорит мне, что вам нужно научиться использовать отладчик или изучить другие методы отладки. В вашем заявлении LINQ есть 2 области, вызывающие озабоченность.
1)

Цитата:
строка.ячейки[0].FormattedValue.ToString() == xlRange.Ячейки[xlRow, 1].Текст
никогда не бывает истинным и/или


2) это
Цитата:
Преобразовать.ToDecimal(row.Cells["AMOUNT"].FormattedValue, new CultureInfo("en-US"))
никогда не создает значения, которое можно суммировать, хотя я ожидаю, что компилятор скажет вам: "нет, не могу".

Итак, я бы сначала исключил (1) - если вы по какой - то причине не можете проверить данные с помощью точки останова и проверить соответствующие элементы, прежде чем ваша сумма LINQ, поместите foreach и цикл через данные и запишите его-например, в консоль
foreach (DataGridViewRow row in dataGridView1.Rows)
{
    Console.WriteLine("row.Cells[0].FormattedValue.ToString() : {0}", row.Cells[0].FormattedValue.ToString());
    Console.WriteLine("xlRange.Cells[xlRow, 1].Text : {0}", xlRange.Cells[xlRow, 1].Text);
    Console.WriteLine("Convert.ToDecimal...: {0}", Convert.ToDecimal(row.Cells["AMOUNT"].FormattedValue, new CultureInfo("en-US")));
    Console.WriteLine("--");
}


Если первые два элемента в каждой строке не "совпадают", то это первая проблема, а если вторая не дает представления "числа", то это вторая проблема


Maciej Los

5ed!

Рейтинг:
0

Maciej Los

Прежде всего: используйте правильный тип данных для каждого столбца!

dt.Columns.Add("ID", typeof(string));
dt.Columns.Add("NA", typeof(string));
dt.Columns.Add("ACC", typeof(decimal));
dt.Columns.Add("DEP", typeof(string));
dt.Columns.Add("AMOUNT", typeof(string)); //?!? double or decimal


Затем, вместо того, чтобы
dt.Rows.Add(new object[] {xlRange.Cells[xlRow, 1].Text, ...});

использовать:
dt.Rows.Add(new object[] {xlRange.Cells[xlRow, 1].Value, ...});


Наконец, получите сумму с помощью объекта datatable:
DataTable dt = (DataTable)dataGridView1.DataSource;
double SumAmnt = dt.AsEnumerable()
    .Where(x=> x.Field<string>("NA")== "sometextvalue")
    .Sum(x=> x.Field<string>("AMOUNT"));
//now, you can display sum whethever you want


Usarsef

Спасибо я решил ее по другому но она выглядит очень близко к вашей