crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

Алексей1153
  опции профиля:
сообщение 25.3.2013, 11:14
Сообщение #1


фрилансер
******

Группа: Участник
Сообщений: 2944
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


задача - считать исходные данные из экселевского файла. Имеется три колонки, каждую нужно поместить в свой вектор

по всяким примерам с форума сделал чтение таким образом

QAxObject excel("Excel.Application");
if(!excel.isNull())
{
    if(QAxObject* workbooks=excel.querySubObject("WorkBooks"))
    {
        QString nativeFilePath=QDir::toNativeSeparators(filename);

        if(QAxObject* workbook=workbooks->querySubObject("Open(const QString&)", nativeFilePath))
        {
            if(QAxObject* sheet=workbook->querySubObject("Worksheets(const QVariant&)", 1))
            {
                if(QAxObject* usedRang = sheet->querySubObject("UsedRange"))
                {
                    QAxObject* usedRows = usedRang->querySubObject("Rows"   );
                    QAxObject* usedCols = usedRang->querySubObject("Columns");
                    
                    int intRowStart = usedRang->property("Row"   ).toInt();
                    int intColStart = usedRang->property("Column").toInt();
                    int intRows     = usedRows->property("Count" ).toInt();
                    int intCols     = usedCols->property("Count" ).toInt();

                    ...
                    ...

                    bool bOk=true;
                    for(int col=e_time; col<e_count+intCols; col++)
                    {
                        ...
                        ...

                        for(int row=intRowStart; row<intRowStart+intRows; row++)
                        {
                            if(QAxObject* cell=sheet->querySubObject("Cells(int,int)", row, col ))
                            {
                                double val=cell->dynamicCall("Value()").toDouble(&bOk);

                                ...
                                ...

                                delete cell;
                            }

                            if(!bOk)break;
                        }

                        if(!bOk)break;
                    }
                }
            }
            workbooks->dynamicCall("Close" );
        }
    }

    excel.dynamicCall("Quit");
}


но, блин, так долго вытаскивается даже 1000 значений - капец.

Понимаю, что проблема в том, что я по ячейке добываю.

Может, как-то не по ячейке можно доставать, а сразу колонку ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
3 страниц V  < 1 2 3  
Начать новую тему
Ответов (20 - 24)
lanz
  опции профиля:
сообщение 18.2.2015, 19:58
Сообщение #21


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Цитата
Только не понятно, почему через итератор QVariantList (*it).toString не работает, но это уже не важно.

А вот это написано в документации :lol:
http://qt-project.org/doc/qt-4.8/qvariant.html#toString
Цитата
Returns the variant as a QString if the variant has type() String, Bool, ByteArray, Char, Date, DateTime, Double, Int, LongLong, StringList, Time, UInt, or ULongLong; otherwise returns an empty string.

Так как тип варианта QVariantList, то он не преобразуется и возвращает пустую строку.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
pfuser
  опции профиля:
сообщение 19.2.2015, 8:14
Сообщение #22


Новичок


Группа: Новичок
Сообщений: 6
Регистрация: 17.2.2015
Пользователь №: 4340

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(lanz @ 18.2.2015, 19:58) *
Так как тип варианта QVariantList, то он не преобразуется и возвращает пустую строку.

Что-то понял, а пробразовать в то что нужно только так:
1) lst.begin()->toString()
2) lst.begin()->toInt
3) lst.begin()->toFloat
и т.д.?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 19.2.2015, 9:14
Сообщение #23


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Цитата
Что-то понял, а пробразовать в то что нужно только так:
1) lst.begin()->toString()
2) lst.begin()->toInt
3) lst.begin()->toFloat
и т.д.?

Эта запись эквивалентна
QVariantList::const_iterator it = lst.begin();
it->toString(); // что эквивалентно (*it).toString()

Здесь мы получаем первый элемент списка.
Так как у нас столбец, то в каждой строке ровно один элемент, он же первый.
Вообще по хорошему надо проверять список на пустоту/количество элементов.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
pfuser
  опции профиля:
сообщение 19.2.2015, 9:53
Сообщение #24


Новичок


Группа: Новичок
Сообщений: 6
Регистрация: 17.2.2015
Пользователь №: 4340

Спасибо сказали: 0 раз(а)




Репутация:   0  


QList<QVariant> и QVariantList - чем отличаются и ещ ене понял.
В первом случает список элементов QVariant, а во втором нечто похожее, только на что пока не понятно.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 19.2.2015, 10:28
Сообщение #25


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Это одно и то же:
http://qt-project.org/doc/qt-4.8/qvariant....antList-typedef
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

3 страниц V  < 1 2 3
Быстрый ответОтветить в данную темуНачать новую тему
Теги


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 14.7.2025, 11:44