Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
206 / 135 / 6
Регистрация: 15.11.2009
Сообщений: 1,654
1

Работа с xls, цикл, очень долго выполняется

25.12.2014, 11:14. Показов 2692. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток. Помогите пожалуйста у меня такая задача. Вытащить из всех екселевских файлов в выбранном каталоге определенные значения(только цифры и не меньше 4). Мой код работает очень медленно.
Эти значения содержатся в файле на первом листе и в первых двух колонках, максимально 2000 строк.

Мой код:
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
//сообственно определяем список файлов в массив
            string folderName;
            FolderBrowserDialog fbd = new FolderBrowserDialog();
            if (this.textBox1.Text.Length > 1 & Directory.Exists(this.textBox1.Text)){folderName = this.textBox1.Text;}
            else{if (fbd.ShowDialog() == System.Windows.Forms.DialogResult.OK) folderName = fbd.SelectedPath; else return;}
            this.listBox1.Items.Clear();
            string[] allFiles = Directory.GetFiles(folderName, "*.xls");
 
//из каждого файла вытаскиваем значения в массив
            foreach (string i in allFiles)//Start foreach for xls file
            {
 
                Microsoft.Office.Interop.Excel.Application ObjExcel = new Microsoft.Office.Interop.Excel.Application();                                                                                                                                                      
                Microsoft.Office.Interop.Excel.Workbook ObjWorkBook = ObjExcel.Workbooks.Open(i, 0, false, 5, "", "", false, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "", true, false, 0, true, false, false);
                Microsoft.Office.Interop.Excel.Worksheet ObjWorkSheet;
                ObjWorkSheet = (Microsoft.Office.Interop.Excel.Worksheet)ObjWorkBook.Sheets[1];
                string pattern =@"^[\s\d]*$"; bool good;
                List<string> lst = new List<string>();
                for (int j = 1; j < 2000; j++)
                {
                   //так я вытаскиваю с помощью регулярки только нужные мне значения.
                    good = Regex.IsMatch(ObjWorkSheet.Cells[j, 1].Text, pattern);
                    if (good == true){ lst.Add(ObjWorkSheet.Cells[j, 1].Text);}
                    good = Regex.IsMatch(ObjWorkSheet.Cells[j, 2].Text, pattern);
                    if (good == true) { lst.Add(ObjWorkSheet.Cells[j, 2].Text); }
                    Application.DoEvents();
                }
                ObjExcel.Quit();
                lst = lst.Distinct().ToList();
Сообственно цикл
for (int j = 1; j < 2000; j++)
и выполняется всех дольше, оно и понятно, что 2000 тысячи строк проверить, да еще и регуляркой каждый раз 2 раза.. Но можно ли как-то это дело ускорить?

Заранее спасибо!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.12.2014, 11:14
Ответы с готовыми решениями:

Почему если условие входа в цикл не выполняется, функция заново входит в цикл
Сам код: private void traverse_node(TreeControlItem node) { TreeControlItem...

Долго выполняется программа и зависает
Программа на C# долго выполняется и зависает при вводе eps вот код: using System; using...

Запрос выполняется очень долго
Помагите оптимизировать запрос. Выполняется бесконечно долго (Запрос занял 95.9257 сек.) SELECT...

Очень долго выполняется запрос
Запрос выполняется минут десять. Разве так должно быть? Обрисовываю ситуацию. Берутся две...

6
Неадекват
1492 / 1230 / 246
Регистрация: 02.04.2010
Сообщений: 2,789
25.12.2014, 12:21 2
Можно. Скопируйте содержимое в буфер обмена - перекиньте его в string[] и проверяйте там. Ускорение будет на порядки.
0
206 / 135 / 6
Регистрация: 15.11.2009
Сообщений: 1,654
25.12.2014, 12:43  [ТС] 3
freeba, а можно пример, как это делается или ссылку?
0
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
25.12.2014, 12:54 4
C#
1
object[,] arr = activeSheet.get_Range("A1:B2000").Value;
1
Неадекват
1492 / 1230 / 246
Регистрация: 02.04.2010
Сообщений: 2,789
25.12.2014, 12:57 5
Вот в эту тему загляните. Там есть пара быстрых вариантов.
1
286 / 192 / 56
Регистрация: 25.12.2012
Сообщений: 640
25.12.2014, 13:49 6
C#
1
2
Regex r = new Regex(@"[\S\D]", RegexOptions.Compiled);       
good = !r.IsMatch(ObjWorkSheet.Cells[j, 1].Text, pattern);
1
206 / 135 / 6
Регистрация: 15.11.2009
Сообщений: 1,654
25.12.2014, 14:01  [ТС] 7
Спасибо всем за помощь и наводку)
0
25.12.2014, 14:01
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.12.2014, 14:01
Помогаю со студенческими работами здесь

Запрос выполняется очень долго
Обращаюсь к специалистам за помощью. Задача, поставленная в данной базе решена. Но последний...

Очень долго выполняется запрос SQL
Добрый день! Товарищи, помогите разобраться почему SQL запрос выполняется жутко долго (2,5 минуты)...

Очень долго выполняется curl + https
Вот этот код выполняется 20 секунд! &lt;?php $api_login = '...'; // Логин $api_password = '...';...

Простой запрос выполняется очень долго
Здравствуйте. Пишу веб-приложение на asp.net. Выполняется запрос, который просто получает все...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru