crossplatform.ru

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

> считывание таблицы из xls (Excel)
Алексей1153
  опции профиля:
сообщение 25.3.2013, 11:14
Сообщение #1


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

Группа: Участник
Сообщений: 2941
Регистрация: 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 значений - капец.

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

Может, как-то не по ячейке можно доставать, а сразу колонку ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Алексей1153
  опции профиля:
сообщение 25.3.2013, 13:40
Сообщение #2


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

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

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




Репутация:   34  


lanz, спасибо. Даже работает ) Только я применил вариант с циферными индексами

Range(Cells(1, 1), Cells(100, 3))

Ужасает только количество delete :D Но тут, видимо, никак иначе

Кстати, он возвращает QVariantList of QVariantList, только это набор строк, что не совсем кузяво (но терпимо). Никак его не заставить возвращать набор колонок ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- Алексей1153   считывание таблицы из xls (Excel)   25.3.2013, 11:14
- - lanz   Можно получить объект Range, а потом прочитать его...   25.3.2013, 11:51
- - Алексей1153   lanz, спасибо. Даже работает ) Только я применил ...   25.3.2013, 13:40
- - lanz   Не пробовал. Можно посмотреть в сторону свойства C...   25.3.2013, 14:27
- - Алексей1153   оставил так, вроде устраивает   25.3.2013, 19:43
- - Olga   Добрый вечер! Стоит задача считать данные из ...   24.7.2014, 21:28
- - lanz   Можно использовать объект Range, как я уже писал т...   25.7.2014, 23:30
- - Pavel12345   Вы уверены, что хорошо знаете эксель? Пройдите кур...   9.1.2015, 3:27
- - Гость   Здравствуйте. Похожая задача. Нужно читать 3 столб...   16.2.2015, 22:03
- - lanz   ЦитатаНе получается. Что именно не получается?   16.2.2015, 23:45
- - Гость   Это моя первая работа с Qt (моя специальность элек...   17.2.2015, 8:09
- - lanz   ЦитатаmyVarName[i].setValue((*it).toString()); Дол...   17.2.2015, 9:19
- - Гость   Массивы объявлены: QVariant myVarName[20000]; QVa...   17.2.2015, 9:40
- - Гость   Я в текстовом поле (Я не наблюдаю значения перемен...   17.2.2015, 10:11
- - Гость   В отладчика переменная "myVarName[i].setValu...   17.2.2015, 13:13
- - pfuser   Здравствуйте, еще раз. Зарегестрировался. Вопрос е...   17.2.2015, 13:34
- - pfuser   Если напрямую установить значение: myVarName[3].se...   17.2.2015, 15:18
- - pfuser   Все правильно, что-то с типа ми объявления. У мен...   17.2.2015, 16:56
- - lanz   Фишка в том, что Range() возвращает двумерный масс...   17.2.2015, 20:25
- - pfuser   Цитата(lanz @ 17.2.2015, 20:25) Используй...   17.2.2015, 20:43
- - lanz   ЦитатаТолько не понятно, почему через итератор QVa...   18.2.2015, 19:58
|- - pfuser   Цитата(lanz @ 18.2.2015, 19:58) Так как т...   19.2.2015, 8:14
- - lanz   ЦитатаЧто-то понял, а пробразовать в то что нужно ...   19.2.2015, 9:14
- - pfuser   QList<QVariant> и QVariantList - чем отличаю...   19.2.2015, 9:53
- - lanz   Это одно и то же: http://qt-project.org/doc/qt-4.8...   19.2.2015, 10:28


Быстрый ответОтветить в данную темуНачать новую тему
Теги


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




RSS Текстовая версия Сейчас: 18.2.2025, 19:36