Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.70/64: Рейтинг темы: голосов - 64, средняя оценка - 4.70
21 / 19 / 4
Регистрация: 15.01.2015
Сообщений: 202

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

22.07.2017, 13:53. Показов 13258. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую. Недавно начал юзать OpenXML сделал все как в справонике https://msdn.microsoft.com/ru-... 98534.aspx
Получилось вот что:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
        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 секунд . Я так понял больше всего времени отжирает
C#
1
2
                // получаем ссылку на ячейку
                Cell theCell = wsPart.Worksheet.Descendants<Cell>().Where(c => c.CellReference == addressName).FirstOrDefault();
Что делаю не так?

PS файл xlsx весом примерно 30мб
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.07.2017, 13:53
Ответы с готовыми решениями:

Как считать данные из Excel используя ClosedXML.Excel?
Может кто помочь разобраться, как считать данные из таблицы Excel используя ClosedXML.Excel. Например есть таблица в Excel и из нее нужно...

Cpp builder-Ole-Excel. WideString пишет в ячейку Excel минус перед нулем
Здравствуйте! Посмотрите пожалуйста: Когда аргумент val == 0, в ячейку Excel пишется &quot;-0&quot;. Без WideString все нормально - в...

Работа с Excel. Суть: Если номер строки в Excel четный тогда объеденяем эту ячейку с последующей.
Здравствуйте. Помогите, пожалуйста .Я вот в Delphi осуществляю работу с документов в Excel, как я могу записать, чтобы выполнялся алгоритм:...

4
 Аватар для netBool
325 / 304 / 173
Регистрация: 16.11.2010
Сообщений: 1,069
Записей в блоге: 9
22.07.2017, 16:10
Цитата Сообщение от yagami2 Посмотреть сообщение
Считывание одной ячейки занимает 17 секунд . Я так понял больше всего времени отжирает
Я как-то делал перебор List<>.ForEach(). Тормозил сильно, заменил на обычный перебор в цикле for вручную, быстрее в 10 раз. Как оказалось Linq хорошопомогают сокращать код, но не всегда оптимизированы по скорости. 100% утверждать не могу, но может быть и тут ручной перебор лучше будет...

Да и файл 30мб - не маленький, нужно сказать. Обычный небольшой файл 1мб считался бы быстрее секунды, и никто бы не заметил...
1
21 / 19 / 4
Регистрация: 15.01.2015
Сообщений: 202
23.07.2017, 08:28  [ТС]
А можете подсказать как перевести это на цикл for? Не догоняю, что именно перебирать нужно...
И можно ли просто считать все ячейки подряд? Как я понял много времени уходит на то чтобы перебрать все ячейки пока не найдем с нужным именем... А если считывать все подряд в массив на потом уже с этим работать
0
999 / 358 / 135
Регистрация: 27.10.2006
Сообщений: 764
23.07.2017, 19:45
А вариант через Interop не подойдёт ?

using Excel = Microsoft.Office.Interop.Excel;

Вариант 1 - просто взять значение ячейки А1 с листа "Лист1"
C#
1
2
3
4
5
6
7
Excel.Application xlApp = new Excel.Application(); //Excel
Excel.Workbook xlWB; //рабочая книга            
Excel.Worksheet xlSht; //лист Excel
 
xlWB = xlApp.Workbooks.Open(@"G:\C#\Test Excel.xlsx"); //название файла Excel                                 
xlSht = xlWB.Worksheets["Лист1"]; //название листа или 1-й лист в книге xlSht = xlWB.Worksheets[1];
string a = xlSht.Range["A1"].Value; //берём значение ячейки в переменную

Вариант 2 - берём данные с листа в массив и что-то делаем с ними
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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(); //перекладываем данные с общего массива в чистый массив
        }            
}
1
21 / 19 / 4
Регистрация: 15.01.2015
Сообщений: 202
25.07.2017, 16:10  [ТС]
Цитата Сообщение от Pavel55 Посмотреть сообщение
А вариант через Interop не подойдёт ?
увы, но мой босс сказал чтоб никаких com объектов

В итоге забил на openXML и использовал Excel Data Reader, и за пять строчек считал весь файл в dataset. Он конечно при этом 250мб оперативы отжирает, но это давняя дилемма "память vs время"
Если кому надо пример тут https://gist.github.com/Munawwar/924413
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.07.2017, 16:10
Помогаю со студенческими работами здесь

Как считать в textbox ячейку из БД
Доброго времени суток, пишу курсач тест-программу на неведомой мне C# + БД access. Подключил базу, кинул на форму необходимую таблицу, чтоб...

Считать число из файла и вывести результат в ячейку таблицы
Всем привет! Помогите, пожалуйста, написать php код. Есть файл допустим data.dat, в котором записано какое-то число (вещественное)....

Пароль на ячейку в Excel
Здравствуйте, подскажите пожалуйста как сделать так, чтобы при входе в документ excel он запрашивал пароль на ячейку таким образом, чтобы...

Excel записать данные в ячейку
Всем доброго времени суток. Есть тлф справочник который надо немного подредактировать, а именно скопировать номер из ячейки в столбце...

Добавление данных в ячейку Excel
Добрый день нужен макрос или модуль для добавления данных в ячейку подскажите Range(&quot;A1:B1&quot;) = &quot;test&quot; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru