Название: чтение данных из файла 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); }
|