Собрать средние значения из 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();