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

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

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

Приветствую. Недавно начал юзать OpenXML сделал все как в справонике https://msdn.microsoft.com/ru-ru/library/office/hh298534.aspx Получилось вот что:
        public static string GetCellValue(string fileName, string sheetName, string addressName)
        { 
            string value = null;
        
            // открываем докумен только на чтение
            using (SpreadsheetDocument document = SpreadsheetDocument.Open(fileName, false))
            {
                // Retrieve a reference to the workbook part.
                WorkbookPart wbPart = document.WorkbookPart;
 
                // найти лист по имени
                Sheet theSheet = wbPart.Workbook.Descendants<Sheet>().Where(s => s.Name == sheetName).FirstOrDefault();
 
                // если нет листа
                if (theSheet == null)
                {
                    throw new ArgumentException("sheetName");
                }
 
                // Retrieve a reference to the worksheet part.
                WorksheetPart wsPart = (WorksheetPart)(wbPart.GetPartById(theSheet.Id));
 
                // получаем ссылку на ячейку
                Cell theCell = wsPart.Worksheet.Descendants<Cell>().Where(c => c.CellReference == addressName).FirstOrDefault();
 
                if (theCell != null)
                {
                    value = theCell.InnerText;
                    
                    if (theCell.DataType != null)
                    {
                        switch (theCell.DataType.Value)
                        {
                            case CellValues.SharedString:
                                var stringTable = wbPart.GetPartsOfType<SharedStringTablePart>().FirstOrDefault();
                                if (stringTable != null)
                                {
                                    value = stringTable.SharedStringTable.ElementAt(int.Parse(value)).InnerText;
                                }
                                break;
                            case CellValues.Boolean:
                                switch (value)
                                {
                                    case "0":
                                        value = "FALSE";
                                        break;
                                    default:
                                        value = "TRUE";
                                        break;
                                }
                                break;
                        }
                    }
                }
            }
            return value;
Считывание одной ячейки занимает 17 секунд . Я так понял больше всего времени отжирает
                // получаем ссылку на ячейку
                Cell theCell = wsPart.Worksheet.Descendants<Cell>().Where(c => c.CellReference == addressName).FirstOrDefault();
Что делаю не так? PS файл xlsx весом примерно 30мб

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

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

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


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

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

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