網上各類教程用的方法主要是以下這一句:html
QAxObject * range = worksheet->querySubObject("Cells(int,int)", 1, 1 );這種方法固然也行,能夠一項一項地讀,可是當讀取數量很大的時候就很慢了,在個人電腦上測試讀5000個數據大約168s左右。看資料找到一種批量讀取的方法,經測試讀10000行的數據才3s多,效果超級棒,充分發揮了QAxobject讀取的優點。
核心代碼在於這一句:數組
QAxObject *range = worksheet->querySubObject("Range(QString)", "B13:C1000");用Range(QString)實現選取一大塊區域,一次性讀一個數組出來固然快啦。
附上完整的源碼供你們交流學習:學習
pro中加一句:QT+=axcontainer測試
頭文件加一個:#include <QAxObject>spa
核心代碼:excel
// 批量讀取xls到map int readEnvXlsFile(QString FileName, QMap<QString,float> &map) { QAxObject *excel = NULL; QAxObject *workbooks = NULL; QAxObject *workbook = NULL; excel = new QAxObject("Excel.Application"); if (!excel) { qDebug() << "EXCEL對象丟失!"; } excel->dynamicCall("SetVisible(bool)", false); workbooks = excel->querySubObject("WorkBooks"); workbook = workbooks->querySubObject("Open(QString, QVariant)", FileName); QAxObject * worksheet = workbook->querySubObject("WorkSheets(int)", 1);//打開第一個sheet QAxObject * usedrange = worksheet->querySubObject("UsedRange");//獲取該sheet的使用範圍對象 QAxObject * rows = usedrange->querySubObject("Rows"); QAxObject * columns = usedrange->querySubObject("Columns"); int intRows = rows->property("Count").toInt(); int intCols = columns->property("Count").toInt(); qDebug() << "xls行數:"<<intRows; qDebug() << "xls列數:"<<intCols; // 批量載入數據,這裏默認讀取B13:C最後 QString Range = "B13:C" +QString::number(intRows); QAxObject *allEnvData = worksheet->querySubObject("Range(QString)", Range); QVariant allEnvDataQVariant = allEnvData->property("Value"); QVariantList allEnvDataList = allEnvDataQVariant.toList(); for(int i=0; i<= intRows-13; i++) { QVariantList allEnvDataList_i = allEnvDataList[i].toList() ; //qDebug()<< allEnvDataList_i[0].toString()<< allEnvDataList_i[1].toFloat(); map.insert(allEnvDataList_i[0].toString(),allEnvDataList_i[1].toFloat()); } workbooks->dynamicCall("Close()"); return 0; }Update 2017-05-06: 看了一下百度的 這一篇已經提到了此方法。