crossplatform.ru

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

3 страниц V   1 2 3 >  
Ответить в данную темуНачать новую тему
> считывание таблицы из 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 значений - капец.

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

Может, как-то не по ячейке можно доставать, а сразу колонку ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 25.3.2013, 11:51
Сообщение #2


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

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

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




Репутация:   8  


Можно получить объект Range, а потом прочитать его value как QVariantList.

QAxObject *range = sheet->querySubObject("Range(const QVariant&)", "A1:A100");
QVariantList vlist = qvariant_cast<QVariantList> (range->dynamicCall("Value()"));


Если рэнж прямоугольный, получится QVariantList QVariantList-ов.

Не проверял :lol:, у меня была обратная задача, я выкидывал данные через qscript (ax - обертка для генератора объектов, SubObj - вызывает querySubObject, table - список списков).
Раскрывающийся текст
var table = [];
    for (var i = 0; i < exids.length; ++i) {
        var row = make_row(exids[i]);
        table.push (row);                       ;        
    };
    var range_str = ("A2:" + columns[ExportCols.length - 1] + (exids.length + 1));
    range = ax.SubObj(sheet, "Range(QVariant)", range_str);
    range.Value = table;
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 25.3.2013, 13:40
Сообщение #3


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

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

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




Репутация:   34  


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

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

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

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


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

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

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




Репутация:   8  


Не пробовал. Можно посмотреть в сторону свойства Columns или сделать три Range по одному для каждой колонки.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 25.3.2013, 19:43
Сообщение #5


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

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

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




Репутация:   34  


оставил так, вроде устраивает
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Olga
  опции профиля:
сообщение 24.7.2014, 21:28
Сообщение #6


Новичок


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

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




Репутация:   0  


Добрый вечер!
Стоит задача считать данные из excel файла и добавить их в БД MySql.
В файле содержиться более 30000 строк. Если считываю по ячейки и вставляю в БД, то все это делается ооооооооооооочень медленно.
Может есть более быстрый способ???
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 25.7.2014, 23:30
Сообщение #7


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

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

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




Репутация:   8  


Можно использовать объект Range, как я уже писал тут выше. Он работает значительно быстрее.
Приведите пример как вы делаете, может можно срезать углы где-то.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Pavel12345
  опции профиля:
сообщение 9.1.2015, 3:27
Сообщение #8


Новичок


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

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




Репутация:   0  


Вы уверены, что хорошо знаете эксель? Пройдите курс MS Excel Профессионал от специалистов ведущей международной консалтинговой компании. Вы научитесь работать в экселе в 2 раза быстрее и будете уверены, что решаете каждую задачу наиболее эффективным способом. Внимание! Осталось 3 места, до пятницы скидка 20%. Оставьте заявку по ссылке: http://msexcel.pro?ch=frm
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_*
сообщение 16.2.2015, 22:03
Сообщение #9





Гости








    


Здравствуйте.
Похожая задача.
Нужно читать 3 столбца из *.csv файла.
Столбцы читаю (вижу в отладчике значения).
....................
Файл *.h
QVariantList List1;
QVariantList List2;
QVariantList List3;
.............................

Файл *.cpp
......................
QAxObject *range1 = worksheet->querySubObject("Range(const QVariant&)","A1:A16000");
QAxObject *range2 = worksheet->querySubObject("Range(const QVariant&)","B1:B16000");
QAxObject *range3 = worksheet->querySubObject("Range(const QVariant&)","C1:C16000");
List1 = qvariant_cast<QVariantList> (range1->dynamicCall("Value()"));
List2 = qvariant_cast<QVariantList> (range2->dynamicCall("Value()"));
List3 = qvariant_cast<QVariantList> (range3->dynamicCall("Value()"));
.............................................................

А как выделить элемен из списка List1, List2, List3 - не знаю.

Пробовал по разному:
................................................
QVariantList::const_iterator it = List1.constBegin();
int i=1;
while (it != List1.constEnd())
{
myVarName[i].setValue((*it).toString());//QVariant myVarName[16000]

i++;
it++;
}
Не получается.
Нужно преобразов List1 в массив строк, List2 в массив даты времени, List3 в массив значений.
В отладчике вижу тип QString, но даже его не могу засунуть в myVarName.

Спасибо.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 16.2.2015, 23:45
Сообщение #10


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

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

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




Репутация:   8  


Цитата
Не получается.

Что именно не получается?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 27.11.2024, 0:28