Собрать средние значения из Excel - C#
Формулировка задачи:
Доброго времени суток! Имеется лист Excel. Фрагмент листа:Лист Microsoft Excel.xlsx(Во всем файле ~ 3000 строк)
В столбце "B" имя станции, "L" - год, "S" - слой, и значения от "V" до "AW". Задача передо мной стоит следующая:
Вывести среднее значение столбцов от "V" до "AW" по слою "S" = поверхность, по всем или по конкретному году для станции "B". В столбцах от "V" до "AW", есть пустые ячейки.
Для теста попробовал считать один столбец со станциями:
Таким образом один столбец считывается около ~ 40 сек.
Если загонять все значения в модель:
То результат лучше, но всё равно очень плохой: ~30 сек.
Суть вопроса: Что мне лучше всего использовать, как поступить и в какую сторону смотреть в данной ситуации?
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();
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();
Решение задачи: «Собрать средние значения из 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();
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д