Russian Qt Forum
Ноябрь 01, 2024, 07:36 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Excel как жрёт ОП  (Прочитано 4174 раз)
iei-nn
Гость
« : Октябрь 19, 2010, 17:56 »

Доброго времени суток я новичок в QT не стоит обрушивать на меня тонны критики.
Вообщем проблема то можно сказать тривиальная только вот ни как решить не могу.
Есть программка лезет она в папку по указанному пути смотри там Excel-ые файлики берёт каждый открывает его читает от туда заданный диапазон и по ИДЕЕ закрывает!
  Штука вся в том что она либо не закрывает либо закрывает но не всё. в итоге в диспетчере наблюдается процесс EXCEL.exe только размером он в ОП где то под 150 метров. Меня сначала и процесс самой программы беспокоил но оказалось что на самом деле всё нормально это Windows немножко не корректно показывает.
Код:


QString fileName;
     QString bufstr;
    QAxObject* excel = new QAxObject( "Excel.Application" ); //получаем указатьтель на excel
    workbooks = excel->querySubObject("WorkBooks");

     QDir dir("C:\\s\\s\\");
   dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks);
   dir.setSorting(QDir::Size | QDir::Reversed);

   QFileInfoList list = dir.entryInfoList();
   ui->progressBar->setRange(0,list.size());
  // std::cout << "     Bytes Filename" << std::endl;
   for (int i = 0; i < list.size(); ++i) {

       fileInfo = list.at(i);

     QString  zapis="  ";
  if (fileInfo.suffix()=="xls" or fileInfo.suffix()== "xlsx"){
      fileName=fileInfo.fileName();



         QString pathfile="C:\\s\\s\\"+fileName;
         workbooks->dynamicCall("Open (const QString&)", QString(pathfile));

         int intCount =  excel->querySubObject("ActiveWorkBook")->querySubObject("WorkSheets")->property("Count").toInt();
         workbook = excel->querySubObject("ActiveWorkBook");
         worksheet = workbook->querySubObject("Worksheets(int)", 1)->querySubObject("UsedRange");
         usedrange = excel->querySubObject("ActiveWorkBook")->querySubObject("Worksheets(int)", 1)->querySubObject("UsedRange");
         rows = usedrange->querySubObject("Rows");
         columns = usedrange->querySubObject("Columns");
         int intCols = columns->property("Count").toInt();
         int intRows = rows->property("Count").toInt();
         zapis=""+fileName+'\n';
         ui->label->setText(fileName);
         ui->progressBar_2->setRange(0,intRows-8);
         ui->progressBar_2->setValue(0);
        for (int rows = 8; rows <= intRows; ++rows){
              for (int Cols = 1; Cols <= intCols; ++Cols){
                cell=usedrange->querySubObject("Cells(int, int)",rows,Cols  );
                value = cell->dynamicCall( "Value()" );
                zapis=zapis+value.toString()+" ";
           }
               zapis=zapis+"\n";
ui->progressBar_2->setValue(rows-8);
         }

        ui->textEdit->setPlainText(zapis);
        ui->progressBar->setValue(i);
        workbooks->dynamicCall("Close()");
        excel->dynamicCall("Quit()");
        excel->dynamicCall("Close()");


    }
   }
Заранее благодарю!
Записан
iei-nn
Гость
« Ответ #1 : Октябрь 20, 2010, 14:49 »

Народ ну помогите когда несколько Excel файлов по 4000 записей умирает на проч все а так не хачется :-(
Записан
iei-nn
Гость
« Ответ #2 : Октябрь 22, 2010, 04:10 »

Очень жаль что эта тема превращается в монолог, но не смотря на это все же я продолжил исследовать этот вопрос.
Самым главным оружием исследователя НАБЛЮДЕНИЕ, было выяснено, что при выполнение вот этого кода:


Код:
cell=usedrange->querySubObject("Cells(int, int)",rows,Cols  );
value = cell->dynamicCall( "Value()" );
собственно и растет занимаемое место в ОП процессом excel.exe
Следовательно вопрос !!!
Какого я извиняюсь это происходит ведь тут объект ячейка присваивается cell а потом посылается команда на получение значения ячейки.
получается так, что ячейка когда ActiveX получает команду  Cells(int, int) заново записывается в ОП. ЧТО ЗА ХРЕНЬ НепонимающийНепонимающий?
Возможно мои предположения расходятся с действительностью, но что эти 2 строки вызывают увеличение памяти которое занимает процесс Ecxel.exe это факт!!!!!!

P/S "Неужели ни кто не знает и не может объяснить?  Непонимающий"

Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.048 секунд. Запросов: 20.