Обработка больших объемов данных из Excel - C#

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

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

Здравствуйте! Есть огромных размеров excel файл, пусть для простоты, в нем хранятся сведения о погоде: дата, температура в этот день (разница между измерениями 10 минут). Встала задача написания на C# программы которая будет: 1) считывать сведения из файла и представлять их в табличном виде; 2) оперировать данными: искать среднее значение в такой-то день и т.п. не важно; 3) создавать новую таблицу с обработанными данными и сохранять её в новом excel файле; Опционально: 4) хранить обработанные данные в виде БД. Прочёл где-то на форуме, что обращаться к excel можно с OLE (но сейчас с этой технологией напрямую мало кто работает). Мне не ясно с помощью какого аппарата можно добиться достойного результата. Если получиться вытащить данные из файла, то каким образом хранить этот огромный набор информации в программе - как много памяти она будет поглощать? как оптимизировать работу? м.б. используя динамические списки, то какая структура оптимальна? Как быть с БД? тут мне совсем не понятно что делать. Надеюсь на вашу помощь! Спасибо!

Решение задачи: «Обработка больших объемов данных из Excel»

textual
Листинг программы
  1. namespace ExcelRead_ver_0.1.8
  2. {
  3.     public static class ReadTZExcel
  4.     {
  5.         public static void XLReadTZ(FileStream fileStream, ref DataTable tableScenarios)
  6.         {
  7.             SLExcelData mExcelData = new SLExcelData();
  8.             mExcelData = ReadExcel(fileStream, ref tableScenarios);            
  9.         }
  10.  
  11.         private static string GetColumnName(string cellReference)
  12.         {
  13.             var regex = new Regex("[A-Za-z]+");
  14.             var match = regex.Match(cellReference);
  15.  
  16.             return match.Value;
  17.         }
  18.  
  19.         private static int ConvertColumnNameToNumber(string columnName)
  20.         {
  21.             var alpha = new Regex("^[A-Z]+$");
  22.             if (!alpha.IsMatch(columnName)) throw new ArgumentException();
  23.  
  24.             char[] colLetters = columnName.ToCharArray();
  25.             Array.Reverse(colLetters);
  26.  
  27.             var convertedValue = 0;
  28.             for (int i = 0; i < colLetters.Length; i++)
  29.             {
  30.                 char letter = colLetters[i];
  31.                 int current = i == 0 ? letter - 65 : letter - 64; // ASCII 'A' = 65
  32.                 convertedValue += current * (int)Math.Pow(26, i);
  33.             }
  34.  
  35.             return convertedValue;
  36.         }
  37.  
  38.         private static string ReadExcelCell(Cell cell, WorkbookPart workbookPart)
  39.         {
  40.             var cellValue = cell.CellValue;
  41.             var text = (cellValue == null) ? cell.InnerText : cellValue.Text;
  42.             if ((cell.DataType != null) && (cell.DataType == CellValues.SharedString))
  43.             {
  44.                 text = workbookPart.SharedStringTablePart.SharedStringTable.Elements<SharedStringItem>().ElementAt(
  45.                         Convert.ToInt32(cell.CellValue.Text)).InnerText;
  46.             }
  47.  
  48.             return (text ?? string.Empty).Trim();
  49.         }
  50.  
  51.         private static IEnumerator<Cell> GetExcelCellEnumerator(Row row)
  52.         {
  53.             int currentCount = 0;
  54.             foreach (Cell cell in row.Descendants<Cell>())
  55.             {
  56.                 string columnName = GetColumnName(cell.CellReference);
  57.  
  58.                 int currentColumnIndex = ConvertColumnNameToNumber(columnName);
  59.  
  60.                 for (; currentCount < currentColumnIndex; currentCount++)
  61.                 {
  62.                     var emptycell = new Cell() { DataType = null, CellValue = new CellValue(string.Empty) };
  63.                     yield return emptycell;
  64.                 }
  65.  
  66.                 yield return cell;
  67.                 currentCount++;
  68.             }
  69.         }
  70.  
  71.         public static SLExcelData ReadExcel(FileStream file, ref DataTable tableScenarios)
  72.         {
  73.             var data = new SLExcelData();
  74.  
  75.             // Открыть excel документ
  76.             WorkbookPart workbookPart; List<Row> rows;
  77.             try
  78.             {
  79.                 var document = SpreadsheetDocument.Open(file, false);
  80.                 workbookPart = document.WorkbookPart;
  81.  
  82.                 var sheets = workbookPart.Workbook.Descendants<Sheet>();
  83.                 var sheet = sheets.First();
  84.                 data.SheetName = sheet.Name;
  85.  
  86.                 var workSheet = ((WorksheetPart)workbookPart.GetPartById(sheet.Id)).Worksheet;
  87.                 var columns = workSheet.Descendants<Columns>().FirstOrDefault();
  88.                 data.ColumnConfigurations = columns;
  89.  
  90.                 var sheetData = workSheet.Elements<SheetData>().First();
  91.                 rows = sheetData.Elements<Row>().ToList();
  92.             }
  93.             catch (Exception e)
  94.             {
  95.                 data.Status.Message = "Unable to open the file";
  96.                 return data;
  97.             }
  98.  
  99.             // Прочитать заголовок
  100.             int columnsCount = 0; // Получили колонок в таблице
  101.             if (rows.Count > 0)
  102.             {
  103.                 var row = rows[0];
  104.                 var cellEnumerator = GetExcelCellEnumerator(row);
  105.                 while (cellEnumerator.MoveNext())
  106.                 {
  107.                     var cell = cellEnumerator.Current;
  108.                     var text = ReadExcelCell(cell, workbookPart).Trim();
  109.                     if (text == "") continue;
  110.                     data.Headers.Add(text);
  111.                     tableScenarios.Columns.Add(text);
  112.                     columnsCount++;
  113.                 }
  114.             }
  115.  
  116.             // Прочитать данные
  117.             if (rows.Count > 1)
  118.             {
  119.                 string[] rowText = new string[columnsCount];
  120.  
  121.                 for (var i = 1; i < rows.Count; i++)
  122.                 {
  123.                     var dataRow = new List<string>();
  124.                     data.DataRows.Add(dataRow);
  125.                     var row = rows[i];
  126.                     if (row.InnerText == "") break;
  127.  
  128.                     var cellEnumerator = GetExcelCellEnumerator(row);
  129.                     int tmpCount = 0;
  130.                     while (cellEnumerator.MoveNext())
  131.                     {
  132.                         var cell = cellEnumerator.Current;
  133.                         var text = ReadExcelCell(cell, workbookPart).Trim();
  134.                         dataRow.Add(text);
  135.                         if (((text == "")&&(tmpCount==0)))
  136.                             continue;
  137.  
  138.                         rowText[tmpCount] = text;
  139.                         tmpCount++;
  140.                     }
  141.                     tableScenarios.Rows.Add(rowText);
  142.                     Array.Clear(rowText, 0, rowText.Length);
  143.                 }
  144.             }
  145.             return data;
  146.         }
  147.  
  148.     }
  149. }

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


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

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

5   голосов , оценка 4.6 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут