1. 程式人生 > >Qt5對Excel表格簡單、高效處理方法

Qt5對Excel表格簡單、高效處理方法

由於經常用Qt對Excel中的一些資料進行處理,最終綜合出一套簡單好用的讀、寫資料方案。
主要程式碼如下(完整測試專案地址見本文最下方):

bool ExcelManger::Test(QString &path)
{
    QAxObject *excel = NULL;    //本例中,excel設定為Excel檔案的操作物件
    QAxObject *workbooks = NULL;
    QAxObject *workbook = NULL;  //Excel操作物件
    excel = new QAxObject("Excel.Application");
    excel->
dynamicCall("SetVisible(bool)", true); //true 表示操作檔案時可見,false表示為不可見 workbooks = excel->querySubObject("WorkBooks"); //————————————————按檔案路徑開啟檔案———————————————————— workbook = workbooks->querySubObject("Open(QString&)", path); // 獲取開啟的excel檔案中所有的工作sheet QAxObject * worksheets =
workbook->querySubObject("WorkSheets"); //—————————————————Excel檔案中表的個數:—————————————————— int iWorkSheet = worksheets->property("Count").toInt(); qDebug() << QString("Excel檔案中表的個數: %1").arg(QString::number(iWorkSheet)); // ————————————————獲取第n個工作表 querySubObject("Item(int)", n);——————————
QAxObject * worksheet = worksheets->querySubObject("Item(int)", 1);//本例獲取第一個,最後引數填1 //—————————獲取該sheet的資料範圍(可以理解為有資料的矩形區域)———— QAxObject * usedrange = worksheet->querySubObject("UsedRange"); //———————————————————獲取行數——————————————— QAxObject * rows = usedrange->querySubObject("Rows"); int iRows = rows->property("Count").toInt(); qDebug() << QString("行數為: %1").arg(QString::number(iRows)); //————————————獲取列數————————— QAxObject * columns = usedrange->querySubObject("Columns"); int iColumns = columns->property("Count").toInt(); qDebug() << QString("列數為: %1").arg(QString::number(iColumns)); //————————資料的起始行——— int iStartRow = rows->property("Row").toInt(); qDebug() << QString("起始行為: %1").arg(QString::number(iStartRow)); //————————資料的起始列———————————— int iColumn = columns->property("Column").toInt(); qDebug() << QString("起始列為: %1").arg(QString::number(iColumn)); //——————————————讀出資料————————————— //獲取第i行第j列的資料 //假如是第6行,第6列 對應表中F列6行,即F6 QAxObject *range1 = worksheet->querySubObject("Range(QString)", "F6"); QString strRow6Col6 = ""; strRow6Col6 = range1->property("Value").toString(); qDebug() << "第6行,第6列的資料為:" + strRow6Col6; //列的轉換函式如下地址,第6列轉為F列,第29列轉為AC列 http://blog.csdn.net/y396397735/article/details/78312124 //—————————————寫入資料————————————— //獲取F6的位置 QAxObject *range2 = worksheet->querySubObject("Range(QString)", "F6"); //寫入資料, 第6行,第6列 range2->setProperty("Value", "中共十九大"); QString newStr = ""; newStr = range2->property("Value").toString(); qDebug() << "寫入資料後,第6行,第6列的資料為:" + newStr; //!!!!!!!一定要記得close,不然系統程序裡會出現n個EXCEL.EXE程序 workbook->dynamicCall("Close()"); excel->dynamicCall("Quit()"); if (excel) { delete excel; excel = NULL; } return true; }

根據自己的操作實踐結果:
處理前:
處理前
處理後:
這裡寫圖片描述

應用程式輸出:

"Excel檔案中表的個數: 3"
"行數為: 9"
"列數為: 5"
"起始行為: 5"
"起始列為: 2"
"第6行,第6列的資料為:66666"
"寫入資料後,第6行,第6列的資料為:中共十九大"