Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
akrufar
91 / 3 / 2
Регистрация: 19.05.2016
Сообщений: 38
1

Быстрое чтение большого массива данных с Excel в C++Builder

19.05.2016, 22:14. Просмотров 907. Ответов 9
Метки нет (Все метки)

Всем привет! нужна помощь. Считываю диапазон ячеек с Excel. Например размером 18 на 3500. Код ниже:

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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
Variant
      v_Var_Excel,         
      v_Var_Books,         
      v_Var_Book,         
      v_Var_Sheets,       
      v_Var_Sheet,        
      v_Var_Cells,        
      v_Var_Cell,
v_RangeDataHelp
v_RangeData; 
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
// запускаем Excel
ExcelInit("ИМЯ_Файла.xls",1);
 
int i_TimeStart = GetTickCount();
 
Variant v_RangeDataHelp ,v_RangeData ;
v_RangeDataHelp = v_Var_Sheet.OlePropertyGet("Range","A1:R3500");
v_RangeData = v_RangeDataHelp.OlePropertyGet("Value");
 
Label1->Caption = "Time: " + FloatToStr((float)(GetTickCount()- i_TimeStart)/1000.0)+" c";
 
//Освобождается память и закрывается Excel
v_RangeDataHelp.Clear();
v_RangeData.Clear();
ExcelClose();
CleaningMemory();
}
 
void __fastcall ExcelInit(AnsiString as_File, int i_Number_Sheet)
{
  // Попытка запуска Excel
  try {
        //Пытаемся запустить Exel
        v_Var_Excel = CreateOleObject("Excel.Application");
        b_Excel_Start = true;
  } catch (...) {
        Application->MessageBox("Невозможно открыть Microsoft Excel!"
        "Возможно Excel не установлен на компьютере.",
        "Ошибка",MB_OK+MB_ICONERROR);
        b_Excel_Start = false;
        return;
  }
  try {
        if(as_File!=""){
                v_Var_Excel.OlePropertyGet("WorkBooks").OleProcedure("Open", as_File.c_str()); //Пытаемся открыть указанный файл
                b_Excel_Start = true;
        }
        else{
                b_Excel_Start = false;
                return;
        }
        //Открываем лист книги с которым будем работать
        v_Var_Sheet = v_Var_Excel.OlePropertyGet("Worksheets",i_Number_Sheet);
  } catch(...) {
        Application->MessageBox("Ошибка открытия книги Microsoft Excel!",
                                         "Ошибка",MB_OK+MB_ICONERROR);
        return;
  }
}
 
void __fastcall ExcelClose()
{
  v_Var_Excel.OlePropertyGet("WorkBooks").OleProcedure("Close");
  v_Var_Excel.OleProcedure("Quit");
}
 
void __fastcall CleaningMemory()
{
  v_Var_Excel.Clear();
  v_Var_Books.Clear();
  v_Var_Book.Clear();
  v_Var_Sheets.Clear();
  v_Var_Sheet.Clear();
  v_Var_Cells.Clear();
  v_Var_Cell.Clear();
}
При однократном вызове все работает быстро. Диапазон 18 на 3500 меньше чем за секунду считывает. Но если вызвать повторно код, то работает порядка 30 секунд. Хотя при каждом вызове сначала открываю Excel, считываю данные, закрываю Excel. Кто подскажет в чем беда????

При тестировании выяснил, что проблема именно в этой строке:

C++
1
v_RangeData = v_RangeDataHelp.OlePropertyGet("Value");
но что именно не так не понятно. т.е. если эту строку убрать, то код работает быстро при любом количестве вызовов, а если вернуть, то первый раз быстро, а при повторных вызовах очень медленно.
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.05.2016, 22:14
Ответы с готовыми решениями:

Максимально быстрое чтение очень большого файла
Добрый день, задача прочитать очень большой файл (1GB-10GB+). Нужно провести операцию с каждой...

Быстрое чтение большого файла. Зависает процесс
Всем доброго времени суток. Есть задача прочитать файл(1-20 мб), который состоит из слов...

Быстрое чтение из Excel
Здравствуйте! Перейду сразу к вопросу. Есть Excel-файл с 9 колонками и 1000 строк, т.е. 9000...

Быстрое чтение из Excel
Доброе время, форумчане! Столкнулся с такой проблемой: 100 лет работал с Excel и беды не знал,...

9
D1973
Модератор
5853 / 3696 / 1649
Регистрация: 21.01.2014
Сообщений: 15,553
Записей в блоге: 3
Завершенные тесты: 1
20.05.2016, 07:35 2
Не совсем понятно, зачем у тебя v_RangeDataHelp и v_RangeData 2 раза объявляются: глобально и в методе клика по Баттон1?
0
akrufar
91 / 3 / 2
Регистрация: 19.05.2016
Сообщений: 38
20.05.2016, 11:50  [ТС] 3
Оу, это ошибка. Когда экспериментировал, не исправил. На самом деле они глобально объявляются. Только один раз.

Добавлено через 3 часа 41 минуту
Кстати, дело именно в самом Variant потому что, если перед v_RangeData = v_RangeDataHelp.OlePropertyGet("Value"); назначить переменно v_RangeData любое значение, например, 0 (v_RangeData = 0). То и после первого запуска программа работает долго.

Пробовал с v_RangeData всякие обнуления и очистки:
C++
1
2
3
            v_RangeData.Clear();
            v_RangeData = Unassigned;
            VarClear(v_RangeData );
Ничего не помогает...
Кто знает в чем причина может быть? Помогите!!!
0
akrufar
91 / 3 / 2
Регистрация: 19.05.2016
Сообщений: 38
21.05.2016, 16:47  [ТС] 4
В общем не знаю в чем причина, но нашел решение. Если программу сначала откомпилировать, полностью закрыть появившуюся программу (exe). Затем запустить уже не через билдер, а просто exeшник, то она работает отлично. Все и в первый раз исполнения кода и при последующем. Но если запускать через билдер, то она глючит (первый раз нормально работает, в последующие грузится долго). Я не понимаю из-за чего это может быть. =)
Может у вас есть какие-то идеи?
0
vxg
Модератор
3306 / 2098 / 332
Регистрация: 13.01.2012
Сообщений: 8,152
21.05.2016, 20:34 5
akrufar, дебагер с ума сходит. какие еще могут быть идеи? очевидно по вашему описанию что запуск из-под среды что-то вносит в процесс. что он может вносить кроме того что все идет под отладкой?
0
akrufar
91 / 3 / 2
Регистрация: 19.05.2016
Сообщений: 38
21.05.2016, 20:40  [ТС] 6
Цитата Сообщение от vxg Посмотреть сообщение
akrufar, дебагер с ума сходит. какие еще могут быть идеи? очевидно по вашему описанию что запуск из-под среды что-то вносит в процесс. что он может вносить кроме того что все идет под отладкой?
Ну а как это исправить? Не очень удобно постоянно собирать проект, а потом перезапускать отдельно исполняемый файл
0
vxg
Модератор
3306 / 2098 / 332
Регистрация: 13.01.2012
Сообщений: 8,152
21.05.2016, 20:42 7
Цитата Сообщение от akrufar Посмотреть сообщение
Ну а как это исправить?
очевидно что это ненормально. а вот что с этим делать можно сказать после того как будет понятно почему это происходит. позднее попробую запустить ваш код и воспроизвести такое поведение. может это специфично только для вас? ну к пример у вас 128 мб оперативки если загрузить пару раз большие массивы их начинает свопить и все лагает?
0
akrufar
91 / 3 / 2
Регистрация: 19.05.2016
Сообщений: 38
21.05.2016, 20:48  [ТС] 8
Цитата Сообщение от vxg Посмотреть сообщение
может это специфично только для вас?
Будет интересно узнать. Отпишитесь только потом
Цитата Сообщение от vxg Посмотреть сообщение
ну к пример у вас 128 мб оперативки если загрузить пару раз большие массивы их начинает свопить и все лагает?
Вряд ли, у меня 4 гига и файлик 40-50 мб сильно не должен оперативку нагрузить, даже при многократном вызове. Хотя это только тестовые запуски, на боевой программе там куда большие объемы будут...
0
vxg
Модератор
3306 / 2098 / 332
Регистрация: 13.01.2012
Сообщений: 8,152
22.05.2016, 13:46 9
Цитата Сообщение от akrufar Посмотреть сообщение
Отпишитесь только потом
создал файл c:\\temp\\test.xls заполнил 3500 строк в столбце A цифрами от 1 до 3500 запустил ваш код и несколько раз нажал кнопку - время всегда одного и того же порядка - 60-100 мс
0
akrufar
91 / 3 / 2
Регистрация: 19.05.2016
Сообщений: 38
22.05.2016, 15:42  [ТС] 10
Спасибо! Значит дело в моей среде...будем решать.
0
22.05.2016, 15:42
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.05.2016, 15:42

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Быстрое формирование списков большого количество данных
Здравствуйте ув.Форумчане. У меня вот такой вопрос: необходимо сделать быстрое формирование...

Быстрое создание большого массива элементов управления
Привет всем! У меня есть некоторый пользовательский (свой) элемент управления. Подскажите,...

Загрузка большого массива данных из Excel - стоит ли рассматривать поячеечное считывание?
Добрый день! Есть задача считать из excel большой массив данных (количество строк и столбцов не...

Быстрое чтение массива из файла
Добрый день, появился вроде бы не сложный вопрос, у меня есть динамический массив данных ...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.