Название: Чтение Excel файлов
Отправлено: derik от Январь 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()");
Название: Re: Чтение Excel файлов
Отправлено: kai666_73 от Январь 25, 2018, 11:14
Не скажу за оптимизацию, но похоже что все PCHn вы заполняете из последнего листа :o
Название: Re: Чтение Excel файлов
Отправлено: derik от Январь 25, 2018, 12:57
да пока так, сейчас это не принципиально. мне понять можно ли как то оптимизировать скорость чтения из екселя или нет.
Название: Re: Чтение Excel файлов
Отправлено: Alex Custov от Январь 25, 2018, 15:25
расставьте по всем qax вызовам таймеры QElapsedTimer, может это поможет понять где больше всего тратится время
Название: Re: Чтение Excel файлов
Отправлено: derik от Январь 25, 2018, 15:32
Вы меня опередили :) я так и сделал. он показывает что от открытия файла до заполнения последнего массива происходит 1 секунда...он виснет в момент открытия файла екселя мне кажется
Название: Re: Чтение Excel файлов
Отправлено: derik от Январь 26, 2018, 10:16
Можно закрывать. я просто слишком много хочу от кью - все работает и все хорошо :) спасибо за участие!
Название: Re: Чтение Excel файлов
Отправлено: derik от Февраль 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])); } в последнем цикле выводится только последний элемент массива. я в ступоре, первый раз такое вижу. где я мог накосячить?
|