2016-06-15 2 views
0

Используя следующий блок кода, как я могу написать формулу суммы, когда количество строк может меняться каждый раз? У меня это жестко запрограммировано на сумму C11: C33 и D11: D33, но я пытаюсь отойти от этого. Я знаю, что могу назвать первые и последние значения и использовать их как диапазон, но я боюсь синтаксиса.
Очень новичок в этом, так извиняюсь/благодарю заранее!Как суммировать динамический список в C#?

using (FulfillmentEntities DB3 = new FulfillmentEntities()) 
          { 
           TotalRows = results5.Count(); 

           foreach (var d in results5) 
           { 
            int col = 2; 

            worksheet.Cells[row, col++].Value = d.Category; 
            worksheet.Cells[row, col++].Value = d.intA; 
            worksheet.Cells[row, col++].Value = d.intB; 

            row++; 

           } 
           int TotalCol = 2; 

           worksheet.Cells[row, TotalCol++].Value = "Total"; 
           worksheet.Cells[row, TotalCol++].Formula = "SUM(C11:C33)"; 
           worksheet.Cells[row, TotalCol++].Formula = "SUM(D11:D33)"; 
          } 
+0

Почему бы просто не сделать что-то вроде формулы worksheet.Cells [строка, TotalCol ++] Формула = "SUM (" + startColRow + ":" + endColRow + ")". –

+0

@AlexKrupka это именно то, что я ищу for, но я не знаю, как сохранить значения col/row в startColRow/endColRow. –

+0

Можете уточнить. Вы боретесь с назначением переменных (как передавать эти переменные) или выяснять, какие ячейки активны в документе excel? –

ответ

0

Просто передайте список методу GetRowMinAndMax. Этот метод предполагает, что список не является нулевым или пустым, и что Youre ищет диапазон в одном столбце

public Tuple<string,string> GetRowMinAndMax(List<string> colRows) 
{ 
    var rowLow = colRows.Min(ExtractRow); 
    var rowMax = colRows.Max(ExtractRow); 
    var col = ExtractCol(colRows.First()); 
    return Tuple.Create(col + rowLow, col + rowMax); 
} 

public int ExtractRow(string colRow) 
{ 
    return int.Parse(new string(colRow.Where(char.IsDigit).ToArray())); 
} 

public string ExtractCol(string colRow) 
{ 
    return new string(colRow.Where(char.IsLetter).ToArray()); 
} 

EDIT

На самом деле все это, вероятно, более осложнение, так как его не по столбцам. Причина, почему list.First() не работает потому, что список не упорядочен, поэтому вы вынимая первый элемент вы положили. Вы можете PROB просто упорядочить список по телефону

var orderedList = list.orderBy(s=> s); 

затем первым и последнее будет работать.

0

Только что видел ваш редактор Алекс, спасибо за вашу помощь. Решение кортежа было немного над моей головой. Ниже приводится то, что я сделал, работая отлично, и была очень кратким. Создал переменную для того, что я хотел, чтобы мой итог был, и увеличил его с каждой итерацией строк с помощью оператора + =. Затем просто вызвал его вне моей петли foreach.

      int? totalClientURL = 0; 
          int? totalHgURL = 0; 
           foreach (var d in results5) 
           { 
            int col = 6; 

            worksheet.Cells[row, col++].Value = d.employees_range; 
            worksheet.Cells[row, col].StyleName = styleData; 
            worksheet.Cells[row, col++].Value = d.client_url_count; 
            totalClientURL += d.client_url_count; 
            worksheet.Cells[row, col].StyleName = styleData; 
            worksheet.Cells[row, col++].Value = d.url_count; 
            totalHgURL += d.url_count; 


            row++; 

            ExportCount++; 
            if (ExportCount % 100 == 0) 
             Worker.ReportProgress(20, ExportCount + " rows exported of " + TotalRows); 
           } 

           int TotalCol = 6; 
           worksheet.Cells[row, TotalCol++].Value = "Total"; 
           worksheet.Cells[row, TotalCol].StyleName = styleData; 
           worksheet.Cells[row, TotalCol++].Value = totalClientURL; 
           worksheet.Cells[row, TotalCol].StyleName = styleData; 
           worksheet.Cells[row, TotalCol++].Value = totalHgURL;         
Смежные вопросы