Собрать средние значения из Excel - C#

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток! Имеется лист Excel. Фрагмент листа:Лист Microsoft Excel.xlsx(Во всем файле ~ 3000 строк) В столбце "B" имя станции, "L" - год, "S" - слой, и значения от "V" до "AW". Задача передо мной стоит следующая: Вывести среднее значение столбцов от "V" до "AW" по слою "S" = поверхность, по всем или по конкретному году для станции "B". В столбцах от "V" до "AW", есть пустые ячейки. Для теста попробовал считать один столбец со станциями:
            string path = @" Путь к файлу";
            Excel.Application xlApp = new Excel.Application();
            xlApp.DisplayAlerts = false;
            Excel.Workbook xlWb = xlApp.Workbooks.Open(path, 0, true,5, "", "", false,
                          Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "", true, false, 0, true, false, false);
            Excel.Worksheet xlWs = xlWb.Worksheets[1];

            foreach (Excel.Range item in xlWs.Range["B1:B3000"])
            {
                
                if (item.Text != null)
                {
                    Console.WriteLine(item.Text);
                } 
                else continue;
             }
 
            xlApp.Quit();
            Console.Read();
Таким образом один столбец считывается около ~ 40 сек. Если загонять все значения в модель:
 public class Point
    {
        public string Name { get; set; }
    }
string path = @"путь к файлу";
            Excel.Application xlApp = new Excel.Application();
            xlApp.DisplayAlerts = false;
            Excel.Workbook xlWb = xlApp.Workbooks.Open(path, 0, true,5, "", "", false,
                          Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "", true, false, 0, true, false, false);
            Excel.Worksheet xlWs = xlWb.Worksheets[1];
 
            ICollection<Point> Points = new List<Point>();
            foreach (Excel.Range item in xlWs.Range["B1:B3000"])
            {
                
                if (item.Text != null)
                {
                    Point p = new Point();
                    p.Name = Convert.ToString(item.Text);
                    Points.Add(p);
                    
                } 
                else continue;

            }
 
            foreach (var item in Points)
            {
                Console.WriteLine(item.Name);
            }

            xlApp.Quit();
            Console.Read();
То результат лучше, но всё равно очень плохой: ~30 сек. Суть вопроса: Что мне лучше всего использовать, как поступить и в какую сторону смотреть в данной ситуации?

Решение задачи: «Собрать средние значения из Excel»

textual
Листинг программы
Excel.Application app = new Excel.Application() { Visible = true };
Excel.Workbook wb = app.Workbooks.Open(@"p:\Лист Microsoft Excel.xlsx");
Excel.Worksheet ws = wb.Worksheets[1];
 
var range = ws.Range["B1", ws.Cells[ws.UsedRange.Rows.Count, "AV"]];
var value = (object[,])range.Value;
 
var points = new List<Dictionary<string, object>>();
for (int i = value.GetLowerBound(0) + 1; i < value.GetUpperBound(0); i++)
{
    var point = new Dictionary<string, object>();
    for (int j = value.GetLowerBound(1); j < value.GetUpperBound(1); j++)
        point[(string)value[value.GetLowerBound(0), j]] = value[i, j];
 
    points.Add(point);
}
 
var c = points
    .Where(p => Convert.ToString(p["Слой"]) == "поверхность")
    .Where(p => Convert.ToInt32(p["Year"]) == 2011)
    // группировка и вычисление значений, например:
    .Select(p => (double?)p["O2, ml/l"])
    .Where(p => p.HasValue)
    .Average();

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 3.8 из 5
Похожие ответы