Считать ячейку из excel - C#

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

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

Приветствую. Недавно начал юзать OpenXML сделал все как в справонике https://msdn.microsoft.com/ru-ru/library/office/hh298534.aspx Получилось вот что:
Листинг программы
  1. public static string GetCellValue(string fileName, string sheetName, string addressName)
  2. {
  3. string value = null;
  4. // открываем докумен только на чтение
  5. using (SpreadsheetDocument document = SpreadsheetDocument.Open(fileName, false))
  6. {
  7. // Retrieve a reference to the workbook part.
  8. WorkbookPart wbPart = document.WorkbookPart;
  9. // найти лист по имени
  10. Sheet theSheet = wbPart.Workbook.Descendants<Sheet>().Where(s => s.Name == sheetName).FirstOrDefault();
  11. // если нет листа
  12. if (theSheet == null)
  13. {
  14. throw new ArgumentException("sheetName");
  15. }
  16. // Retrieve a reference to the worksheet part.
  17. WorksheetPart wsPart = (WorksheetPart)(wbPart.GetPartById(theSheet.Id));
  18. // получаем ссылку на ячейку
  19. Cell theCell = wsPart.Worksheet.Descendants<Cell>().Where(c => c.CellReference == addressName).FirstOrDefault();
  20. if (theCell != null)
  21. {
  22. value = theCell.InnerText;
  23. if (theCell.DataType != null)
  24. {
  25. switch (theCell.DataType.Value)
  26. {
  27. case CellValues.SharedString:
  28. var stringTable = wbPart.GetPartsOfType<SharedStringTablePart>().FirstOrDefault();
  29. if (stringTable != null)
  30. {
  31. value = stringTable.SharedStringTable.ElementAt(int.Parse(value)).InnerText;
  32. }
  33. break;
  34. case CellValues.Boolean:
  35. switch (value)
  36. {
  37. case "0":
  38. value = "FALSE";
  39. break;
  40. default:
  41. value = "TRUE";
  42. break;
  43. }
  44. break;
  45. }
  46. }
  47. }
  48. }
  49. return value;
Считывание одной ячейки занимает 17 секунд . Я так понял больше всего времени отжирает
Листинг программы
  1. // получаем ссылку на ячейку
  2. Cell theCell = wsPart.Worksheet.Descendants<Cell>().Where(c => c.CellReference == addressName).FirstOrDefault();
Что делаю не так? PS файл xlsx весом примерно 30мб

Решение задачи: «Считать ячейку из excel»

textual
Листинг программы
  1. Excel.Application xlApp = new Excel.Application(); //Excel
  2. Excel.Workbook xlWB; //рабочая книга            
  3. Excel.Worksheet xlSht; //лист Excel            
  4. Excel.Range Rng; //диапазон ячеек            
  5.  
  6. xlWB = xlApp.Workbooks.Open(@"G:\C#\Test Excel.xlsx"); //название файла Excel                                
  7. xlSht = xlWB.Worksheets["Лист1"]; //название листа или 1-й лист в книге xlSht = xlWB.Worksheets[1];
  8. int iLastRow = xlSht.Cells[xlSht.Rows.Count, "A"].End[Excel.XlDirection.xlUp].Row;  //последняя заполненная строка в столбце А
  9. int iLastCol = xlSht.Cells[1, xlSht.Columns.Count].End[Excel.XlDirection.xlToLeft].Column; //последний заполненный столбец в 1-й строке
  10. //var arrData = (object[,])xlSht.Range["A1:M" + iLastRow].Value; //берём данные с листа Excel          
  11. var arrData = (object[,])xlSht.Range[xlSht.Range["A1"], xlSht.Cells[iLastRow, iLastCol]].Value; //берём данные с листа Excel в двумерный массив
  12.            
  13. int iTotalRows = arrData.GetUpperBound(0);
  14. int iTotalColumns = arrData.GetUpperBound(1);
  15.  
  16. //цикл по строкам и столбцам массива с данными с листа
  17. for (int iRow = 1; iRow <= iTotalRows; iRow++) //цикл по строкам
  18. {                
  19.         for (int iCol = 1; iCol <= iTotalColumns; iCol++) //цикл по столбцам
  20.         {
  21.             //что-то делаем с данными
  22.             //arrResult[iRowInResultArray, iCol-1] = arrData[iRow, iCol].ToString(); //перекладываем данные с общего массива в чистый массив
  23.         }            
  24. }

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


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

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

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

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

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

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