這里以在線程中訪問excel,然后讀取完成在界面提示
1、按鈕啟動線程
void Mystack::on_pushButton_9_clicked() { QString str = QFileDialog::getOpenFileName(this); if(str == "") { return; } std::thread t(&Mystack::getTrackData,this,str); t.detach(); ui->label_147->setText(""); }
2、線程函數
void Mystack::getTrackData(QString path)//path是excel的路徑 { (void)CoInitialize(NULL); //讀取excel所有數據 QAxObject * excel = new QAxObject("Excel.Application");//選擇excel軟件 excel->dynamicCall("Setvisible (bool Visible)","false");//不顯示主窗體,后面打開excel的時候不顯示 excel->setProperty("DisplayAlerts",false);//不顯示excel的警告信息,如果打開失敗,不彈出框 QAxObject *work_books = excel->querySubObject("WorkBooks");//選擇work_books work_books->dynamicCall("Open(const QString&)", path);//設置excel存在路徑 QAxObject *work_book = excel->querySubObject("ActiveWorkBook");//選擇work_book QAxObject *work_sheet = work_book->querySubObject("Sheets(int)",1); //Sheets也可換用WorkSheets,打開第一個sheet QAxObject *range_data = work_sheet->querySubObject("UsedRange"); QVariant var = range_data->dynamicCall("Value");//將所有數據存在QVariant結構體里面 //excel內存回收 delete range_data; delete work_sheet; delete work_book; delete work_books; delete excel; //獲取到所有數據 allDataTvlist.clear(); castVariant2ListListVariant(var,allDataTvlist);//自定義函數 QList<QString> list; QString tmpStr; for(int i=1;i<allDataTvlist.size();i++) { tmpStr = allDataTvlist.at(i).at(0).toString(); if(tmpStr=="批號") { continue; } if(NOT_FOUND==list.indexOf(tmpStr)) { list.append(tmpStr); } } ui->comboBox->clear();//直接訪問this的ui對象 foreach (const QString &value, list) { ui->comboBox->addItem(value); } ui->comboBox->setCurrentIndex(0); ui->label_147->setText("請選擇指定批號上傳"); }