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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Чтение Excel файлов  (Прочитано 4217 раз)
derik
Новичок

Offline Offline

Сообщений: 24



Просмотр профиля
« : Январь 24, 2018, 12:30 »

Добрый день!
Есть файл екселя с 4-6 листами и кол-вом строк от 1600-5000 (в разных случаях по разному), я могу прочитать файл с помощью qt но при заполнении двумерного массива, при кол-ве строк 1600 и 6 листов тратится около 40-50 сек. пробывал делать трехмерный массив, скорость его заполнения вообще ппц. отсюда вопрос - правильно ли я делаю и есть ли способ сделать все быстрее? или есть способы проще? вот фрагмент кода:
Код:
 QString fileName = QFileDialog::getOpenFileName(this, tr("Открыть файл"), QApplication::applicationDirPath(), tr("All Files (*)"));
    QFile file(fileName);
    QFileInfo fi(file);
    QString ext = fi.completeSuffix();
    //открывать файлы екселя формата 97-2003
    QAxObject* excel = new QAxObject( "Excel.Application", 0 );
    QAxBase* workbooks = excel->querySubObject( "Workbooks" );
    QAxBase* workbook = workbooks->querySubObject( "Open(const QString&)",fileName /* "C:\\Users\\LocalDev\\teste.xls" */);
    QAxObject* sheets = excel->querySubObject("Worksheets");
    //количество листов в книге
    int sheetsCount = sheets->dynamicCall("Count").toInt();
    //записываем название листов в массив
    QStringList SheetNames;
    for (int i = 1; i <= sheetsCount; i++) {
        QAxObject* sheetsName = sheets->querySubObject("Item(const QVariant&)", QVariant(i));
        SheetNames<<sheetsName->dynamicCall("Name").toString().toLower();
    }
    //перебираем листы и заполняем необходимые массивы
    for (int i = 1; i <= sheetsCount; i++) {
        SetSheet = sheets->querySubObject( "Item(const QVariant&)", QVariant(i) );

        //получаем количество используемых строк
        QAxObject* usedRangeR = SetSheet->querySubObject("UsedRange");
        QAxObject* rows = usedRangeR->querySubObject("Rows");
        countRows = rows->property("Count").toInt();

        //получаем количество используемых столбцов
        QAxObject* usedRangeC = SetSheet->querySubObject("UsedRange");
        QAxObject* columns = usedRangeC->querySubObject("Columns");
        countCols = columns->property("Count").toInt();
    }
    //читаем данные из ячеек
    for (int j = 4; j <= countRows; j++) {
        for (int k = 1; k <= 5; k++) {
            QAxObject* cell = SetSheet->querySubObject("Cells(int,int)", j, k);//строка, столбец
            QVariant value = cell->property("Value");
            PCH1[j - 4][k] = value.toDouble();
        }
    }
    ui->Output->appendPlainText("РСН1 в таблицу занесен");
    for (int j = 4; j <= countRows; j++) {
        for (int k = 1; k <= 5; k++) {
            QAxObject* cell = SetSheet->querySubObject("Cells(int,int)", j, k);//строка, столбец
            QVariant value = cell->property("Value");
            PCH2[j - 4][k] = value.toDouble();
        }
    }
    ui->Output->appendPlainText("РСН2 в таблицу занесен");
    for (int j = 4; j <= countRows; j++) {
        for (int k = 1; k <= 5; k++) {
            QAxObject* cell = SetSheet->querySubObject("Cells(int,int)", j, k);//строка, столбец
            QVariant value = cell->property("Value");
            PCH3[j - 4][k] = value.toDouble();
        }
    }
    ui->Output->appendPlainText("РСН3 в таблицу занесен");
    for (int j = 4; j <= countRows; j++) {
        for (int k = 1; k <= 5; k++) {
            QAxObject* cell = SetSheet->querySubObject("Cells(int,int)", j, k);//строка, столбец
            QVariant value = cell->property("Value");
            PCH4[j - 4][k] = value.toDouble();
        }
    }
    ui->Output->appendPlainText("РСН4 в таблицу занесен");
    for (int j = 4; j <= countRows; j++) {
        for (int k = 1; k <= 5; k++) {
            QAxObject* cell = SetSheet->querySubObject("Cells(int,int)", j, k);//строка, столбец
            QVariant value = cell->property("Value");
            PCH5[j - 4][k] = value.toDouble();
        }
    }
    ui->Output->appendPlainText("РСН5 в таблицу занесен");
    for (int j = 4; j <= countRows; j++) {
        for (int k = 1; k <= 5; k++) {
            QAxObject* cell = SetSheet->querySubObject("Cells(int,int)", j, k);//строка, столбец
            QVariant value = cell->property("Value");
            PCH6[j - 4][k] = value.toDouble();
        }
    }
    ui->Output->appendPlainText("РСН6 в таблицу занесен");
    ui->Output->appendPlainText("Выполнено все");

    workbook->dynamicCall("Close()");
    excel->dynamicCall("Quit()");
Записан

инженер-конструктор
kai666_73
Крякер
****
Offline Offline

Сообщений: 319


Просмотр профиля
« Ответ #1 : Январь 25, 2018, 11:14 »

Не скажу за оптимизацию, но похоже что все PCHn вы заполняете из последнего листа  Шокированный
Записан
derik
Новичок

Offline Offline

Сообщений: 24



Просмотр профиля
« Ответ #2 : Январь 25, 2018, 12:57 »

да пока так, сейчас это не принципиально. мне понять можно ли как то оптимизировать скорость чтения из екселя или нет.
Записан

инженер-конструктор
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #3 : Январь 25, 2018, 15:25 »

расставьте по всем qax вызовам таймеры QElapsedTimer, может это поможет понять где больше всего тратится время
Записан
derik
Новичок

Offline Offline

Сообщений: 24



Просмотр профиля
« Ответ #4 : Январь 25, 2018, 15:32 »

Вы меня опередили Улыбающийся я так и сделал. он показывает что от открытия файла до заполнения последнего массива происходит 1 секунда...он виснет в момент открытия файла екселя мне кажется
Записан

инженер-конструктор
derik
Новичок

Offline Offline

Сообщений: 24



Просмотр профиля
« Ответ #5 : Январь 26, 2018, 10:16 »

Можно закрывать. я просто слишком много хочу от кью - все работает и все хорошо Улыбающийся спасибо за участие!
Записан

инженер-конструктор
derik
Новичок

Offline Offline

Сообщений: 24



Просмотр профиля
« Ответ #6 : Февраль 04, 2018, 01:48 »

Доброй ночи!
у меня вопрос - возможно он ламерский, но я не не могу понять в чем проблема:

Код:
for (int i = 1; i <= 5; i++) {
            for (int j = 4; j <= countRowsRod; j++) {
                QAxObject* cell = SetSheetRod->querySubObject("Cells(int,int)", j, i);//строка, столбец
                QVariant value = cell->property("Value");
                QTableWidgetItem* item = new QTableWidgetItem(value.toString());
                ui->rodPCH6->setItem(j - 4, i, item);
                if (NULL == value.toDouble()) {
                    continue;
                }
                rodPCH6[j - 4][i] = value.toDouble();
            }
        }

    for (int j = 0; j < countRowsRod - 2; j++) {
        ui->Output->appendPlainText(QString::number(rodPCH6[j][1]));
    }

в последнем цикле выводится только последний элемент массива. я в ступоре, первый раз такое вижу. где я мог накосячить?
Записан

инженер-конструктор
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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