Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Eugene1911 от Март 12, 2014, 15:18



Название: чтение данных из файла excel
Отправлено: Eugene1911 от Март 12, 2014, 15:18
Здравствуйте :)
Подскажите, пожалуйста, как считать данные из таблицы в excel'e. Там записаны целые числа, мне нужно записать их в массив.
Пробовал сделать так:
Код:
    QFile file("c://qt_workspace//read//file.xlsx");
    if (!file.open(QIODevice::ReadOnly)) return 0;
    QTextStream stream(&file);
    while(!stream.atEnd())
    {
        mas1.append(stream.readLine());
    }
Но вместо чисел в массив записываются непонятные символы)
Что я делаю не так?)


Название: Re: чтение данных из файла excel
Отправлено: kambala от Март 12, 2014, 15:53
для начала тебе надо почитать про формат xlsx

либо экспортируй таблицу в csv, это обычный текстовый формат


Название: Re: чтение данных из файла excel
Отправлено: Eugene1911 от Март 12, 2014, 16:03
Перевел в csv, потом начал выводить на экран первые 6 значений таблицы с помощью cout:

Код:
    cout<<mas1[0]<<mas1[1]<<mas1[2]<<mas1[3]<<mas1[4]<<mas1[5];

Первые два числа вывелись правильно, остальные не выводятся


Название: Re: чтение данных из файла excel
Отправлено: kambala от Март 12, 2014, 16:34
значит ты mas1 заполнил значениями неправильно


Название: Re: чтение данных из файла excel
Отправлено: panAlexey от Март 12, 2014, 16:45
Как-то так...
Код:
        QString ffName = ui->le_DataFile->text();
        updateState(QString::fromUtf8("Начинаем обработку файла: %1").arg(ffName));
        ui->progressBar->setValue(0);
        QAxObject* excel = new QAxObject( "Excel.Application", 0 );
        QAxBase* workbooks = excel->querySubObject( "Workbooks" );
        QAxBase* workbook = workbooks->querySubObject( "Open(const QString&)",ffName /* "C:\\Users\\LocalDev\\teste.xls" */);
        QAxBase* sheets = workbook->querySubObject( "Worksheets" );

        QAxBase* vMainSheet = sheets->querySubObject( "Item( int )", 1 );
        int vAllStringCntr = 0;
        int vAllColumnCntr = 0;
        QAxObject *usedRange = 0;
        if (vMainSheet){
            usedRange = vMainSheet->querySubObject("Cells( int, int)",1,1);
            if (usedRange) {
                QAxObject *specialCell = usedRange->querySubObject("SpecialCells(int)", 11);
                if(specialCell){
                    vAllStringCntr = specialCell->property("Row").toInt();
                    vAllColumnCntr = specialCell->property("Column").toInt();
                    delete specialCell;
                }
            }
for(int CNTR_Str = 1; CNTR_Str<= vAllStringCntr; CNTR_Str++){
bool processRow = false;
if (CNTR_Str == 1){
for(int cntCols = 1; cntCols <= vAllColumnCntr; cntCols++ ){
usedRange = vMainSheet->querySubObject("Cells( int, int)",CNTR_Str,cntCols);
if (usedRange) {
vVal = usedRange->property("Value");
}
}
}
}
        }



Название: Re: чтение данных из файла excel
Отправлено: Eugene1911 от Март 17, 2014, 20:13
Большое спасибо за советы, разобрался :)
В итоге сделал немного по другому) Считать надо было по столбцам(1 столбец = 1 массив)
В итоге сделал так:
Код:
int main(int argc, char *argv[])
{
    QString strVal;
    const char* cp = "Range(B25)";
    int i;
    QVector<float> mas;

    QApplication a(argc, argv);
    QAxWidget excel("Excel.Application");

    excel.setProperty("Visible", false);
//окрываю файл
    QAxObject *workbooks = excel.querySubObject("WorkBooks");
    workbooks->dynamicCall("Open (const QString&)", "c:\\qt_projects\\read\\file1.xls");
    QAxObject *workbook = excel.querySubObject("ActiveWorkBook");

    QAxObject *worksheet = workbook->querySubObject("Worksheets(int)", 1);

    for(i=2; i<=50; i++){//считываю информацию из 3 столбца файла
        QAxObject* cell = worksheet->querySubObject("Cells(QVariant,QVariant)", i, 3);
        QVariant vv = cell->property("Value");
        float ss = vv.toFloat() ;
        mas.append(ss);
   }

   // close the excel file
   excel.dynamicCall("Quit (void)");
   return(0);
}