Обработка больших объемов данных из Excel - C#
Формулировка задачи:
Здравствуйте!
Есть огромных размеров excel файл, пусть для простоты, в нем хранятся сведения о погоде: дата, температура в этот день (разница между измерениями 10 минут). Встала задача написания на C# программы которая будет:
1) считывать сведения из файла и представлять их в табличном виде;
2) оперировать данными: искать среднее значение в такой-то день и т.п. не важно;
3) создавать новую таблицу с обработанными данными и сохранять её в новом excel файле;
Опционально:
4) хранить обработанные данные в виде БД.
Прочёл где-то на форуме, что обращаться к excel можно с OLE (но сейчас с этой технологией напрямую мало кто работает). Мне не ясно с помощью какого аппарата можно добиться достойного результата.
Если получиться вытащить данные из файла, то каким образом хранить этот огромный набор информации в программе - как много памяти она будет поглощать? как оптимизировать работу? м.б. используя динамические списки, то какая структура оптимальна?
Как быть с БД? тут мне совсем не понятно что делать.
Надеюсь на вашу помощь! Спасибо!
Решение задачи: «Обработка больших объемов данных из Excel»
textual
Листинг программы
namespace ExcelRead_ver_0.1.8 { public static class ReadTZExcel { public static void XLReadTZ(FileStream fileStream, ref DataTable tableScenarios) { SLExcelData mExcelData = new SLExcelData(); mExcelData = ReadExcel(fileStream, ref tableScenarios); } private static string GetColumnName(string cellReference) { var regex = new Regex("[A-Za-z]+"); var match = regex.Match(cellReference); return match.Value; } private static int ConvertColumnNameToNumber(string columnName) { var alpha = new Regex("^[A-Z]+$"); if (!alpha.IsMatch(columnName)) throw new ArgumentException(); char[] colLetters = columnName.ToCharArray(); Array.Reverse(colLetters); var convertedValue = 0; for (int i = 0; i < colLetters.Length; i++) { char letter = colLetters[i]; int current = i == 0 ? letter - 65 : letter - 64; // ASCII 'A' = 65 convertedValue += current * (int)Math.Pow(26, i); } return convertedValue; } private static string ReadExcelCell(Cell cell, WorkbookPart workbookPart) { var cellValue = cell.CellValue; var text = (cellValue == null) ? cell.InnerText : cellValue.Text; if ((cell.DataType != null) && (cell.DataType == CellValues.SharedString)) { text = workbookPart.SharedStringTablePart.SharedStringTable.Elements<SharedStringItem>().ElementAt( Convert.ToInt32(cell.CellValue.Text)).InnerText; } return (text ?? string.Empty).Trim(); } private static IEnumerator<Cell> GetExcelCellEnumerator(Row row) { int currentCount = 0; foreach (Cell cell in row.Descendants<Cell>()) { string columnName = GetColumnName(cell.CellReference); int currentColumnIndex = ConvertColumnNameToNumber(columnName); for (; currentCount < currentColumnIndex; currentCount++) { var emptycell = new Cell() { DataType = null, CellValue = new CellValue(string.Empty) }; yield return emptycell; } yield return cell; currentCount++; } } public static SLExcelData ReadExcel(FileStream file, ref DataTable tableScenarios) { var data = new SLExcelData(); // Открыть excel документ WorkbookPart workbookPart; List<Row> rows; try { var document = SpreadsheetDocument.Open(file, false); workbookPart = document.WorkbookPart; var sheets = workbookPart.Workbook.Descendants<Sheet>(); var sheet = sheets.First(); data.SheetName = sheet.Name; var workSheet = ((WorksheetPart)workbookPart.GetPartById(sheet.Id)).Worksheet; var columns = workSheet.Descendants<Columns>().FirstOrDefault(); data.ColumnConfigurations = columns; var sheetData = workSheet.Elements<SheetData>().First(); rows = sheetData.Elements<Row>().ToList(); } catch (Exception e) { data.Status.Message = "Unable to open the file"; return data; } // Прочитать заголовок int columnsCount = 0; // Получили колонок в таблице if (rows.Count > 0) { var row = rows[0]; var cellEnumerator = GetExcelCellEnumerator(row); while (cellEnumerator.MoveNext()) { var cell = cellEnumerator.Current; var text = ReadExcelCell(cell, workbookPart).Trim(); if (text == "") continue; data.Headers.Add(text); tableScenarios.Columns.Add(text); columnsCount++; } } // Прочитать данные if (rows.Count > 1) { string[] rowText = new string[columnsCount]; for (var i = 1; i < rows.Count; i++) { var dataRow = new List<string>(); data.DataRows.Add(dataRow); var row = rows[i]; if (row.InnerText == "") break; var cellEnumerator = GetExcelCellEnumerator(row); int tmpCount = 0; while (cellEnumerator.MoveNext()) { var cell = cellEnumerator.Current; var text = ReadExcelCell(cell, workbookPart).Trim(); dataRow.Add(text); if (((text == "")&&(tmpCount==0))) continue; rowText[tmpCount] = text; tmpCount++; } tableScenarios.Rows.Add(rowText); Array.Clear(rowText, 0, rowText.Length); } } return data; } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д