Qt使用QAxObject快速批量讀取Excel內容

  網上各類教程用的方法主要是以下這一句: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: 看了一下百度的 這一篇已經提到了此方法。
相關文章
相關標籤/搜索