前面說過了怎么保存Qt中的數據到excel,現在再來說一說怎么讀取excel中的數據到Qt(無論是讀取到表格中,還是保存到數據模型中,核心的一點都是將excel中的數據讀取到Qt的容器中,然后只要能讀取容器中的數據,那么后面是保存到表格還是模型,都是很簡單的事了)。
假設我們已經有這么一個由Qt保存好的excel表格,現在想要讀取其中的數據
代碼如下:
void Widget::on_readbtn_clicked() { QAxObject *excel = new QAxObject(this);//建立excel操作對象 excel->setControl("Excel.Application");//連接Excel控件 excel->setProperty("Visible", false);//顯示窗體看效果,選擇ture將會看到excel表格被打開 excel->setProperty("DisplayAlerts", true);//顯示警告看效果 QAxObject *workbooks = excel->querySubObject("WorkBooks");//獲取工作簿(excel文件)集合 QString str = QFileDialog::getOpenFileName(this,"打開", QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation),"Excel 文件(*.xls *.xlsx)"); workbooks->dynamicCall("Open(const QString&)", str);//打開剛才選定的excel QAxObject *workbook = excel->querySubObject("ActiveWorkBook"); QAxObject *worksheet = workbook->querySubObject("WorkSheets(int)",1); QAxObject *usedRange = worksheet->querySubObject("UsedRange");//獲取表格中的數據范圍 QVariant var = usedRange->dynamicCall("Value");//將所有的數據讀取刀QVariant容器中保存 QList<QList<QVariant>> excel_list;//用於將QVariant轉換為Qlist的二維數組 QVariantList varRows=var.toList(); if(varRows.isEmpty()) { return; } const int row_count = varRows.size(); QVariantList rowData; for(int i=0;i<row_count;++i) { rowData = varRows[i].toList(); excel_list.push_back(rowData); }//轉換完畢
qDebug()<<excel_list.at(3).at(1).toInt(); //然后將二維數組Qlist<Qlist<QVariant>>中的數據讀取出來,到表格或者數據模型中,具體在這里過程省略 workbook->dynamicCall( "Close(Boolean)", false ); excel->dynamicCall( "Quit(void)" ); delete excel;//因為前面選擇了不顯示excel窗口,如果這里不刪除excel的話,excel依然是打開的,只是我們看不見(因為被隱藏起來了) }
其中標紅的那一行代碼可以用來測試是否能成功讀取出二維數組中的數據。
當輸入 qDebug()<<excel_list.at(3);時,打印的結果為
因為excel中一共有24列,但是只有6行中有數據,因此可以看到這其實是把表格中第4行的數據(因為是從零開始0,1,2,3)全部讀取出來了。
當輸入 qDebug()<<excel_list.at(3).at(3);時,打印結果為
即打印出了第4行第4列的數據.。
當輸入qDebug()<<excel_list.at(3).at(3).toInt();時,打印的結果就是數字3。
由此,讀取excel工作基本完成,至於怎么保存到表格中或者模型中,就看自己喜好啦。
*Tips: 由於excel中保存的數據讀取到Qlist的數組中之后,這不一定是個規則的二維數組,因此在必要的情況下可以將excel的第一二排留出來用於保存信息,這些信息可以用來判斷讀取時按什么規則來讀取。