QT之Excel文件總結

最近在瞭解關於QT操作Excel表格的內容,這裏記錄下這個學習的過程和碰到的一些問題以及解決辦法。

在QT操作excel表格,我們需要在工程文件(.pro)中加入以下內容,這裏分兩種添加方法:

第一種:

QT       += qaxcontainer

第二種:

QT       += axcontainer

上面兩種方法都可以,只是需要在頭文件mainwindow.h文件包含的內容不同。

如果使用的是第一種,需要在頭文件添加

#include <QAxObject>

如果使用的是第二種,則需要添加:

#include <ActiveQt/QAxObject>

這是操作excel,QT工程所需要設置的代碼。

接下來,就是表格的相關操作了:

excel文件初始化

excel = new QAxObject("Excel.Application");
excel->dynamicCall("SetVisible(bool)",false);//false 不可見

workbooks = excel->querySubObject("WorkBooks");

excel文件相關操作:步驟如下

1.使用一個按鍵,點擊打開一個文件對話框

2.獲取打開的文件名,使用querySubObject的方法打開excel文件

3.對錶格進行各種操作

   3.1 獲取打開excel文件中表的個數

   3.2 選擇第幾個工作表進行操作

   3.3 查詢總共的行和列

   3.4 查詢某一行某一列的數據

具體代碼如下:

void MainWindow::on_open_excel_pushButton_clicked()
{
    QString file_name = QFileDialog::getOpenFileName(this,"open file",QDir::currentPath(),"Excel Files(*.xlsx *.xls)");

    //————————————————按文件路徑打開文件————————————————————
    workbook = workbooks->querySubObject("Open(QString&)", file_name);
    // 獲取打開的excel文件中所有的工作sheet
    QAxObject *worksheets = workbook->querySubObject("WorkSheets");

    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));


    //——————————————讀出數據—————————————
    //獲取第i行第j列的數據
    //假如是第6行,第9列
    //QAxObject *range1 = worksheet->querySubObject("Cells(int,int)", i,j);
    int i = 6;
    int j = 9;
    QAxObject *range1 = worksheet->querySubObject("Cells(int,int)", i,j);
    QString str_data = range1->dynamicCall("Value").toString();
    qDebug("第%d行,第%d列的數據爲:%s",i,j,qPrintable(str_data));//
    qDebug("第%d行,第%d列的數據爲:%s",i,j,str_data.toLocal8Bit().constData());
}

注意,以下幾個變量是定義在mainwindow.h中的

QAxObject *excel = nullptr;    //本例中,excel設定爲Excel文件的操作對象
QAxObject *workbooks = nullptr;
QAxObject *workbook = nullptr;  //Excel操作對象

碰到的問題以及解決辦法:

運行該程序多次後,然後編譯的時候出現out of memory allocating的錯誤

剛開始沒有去細究該問題,直接關閉QT軟件即可解決。

後面多運行幾次,又出現了。經過幾次試驗後,我覺得是沒有釋放資源導致的。然後在某次不經意的瞬間,打開了windows的任務管理器,發現裏面有很多excel進程沒有關閉,所以就導致了內存不夠用了。

以下是我打開三次軟件關閉後的截圖,發現任務管理器的excel進程還沒有關閉,只能通過手動強制關掉。

具體的解決辦法是在析構函數中增加釋放excel文件的相關資源的代碼,代碼如下:

excel->dynamicCall("Quit(void)");

增加這句代碼後,在關閉軟件後,就將excel的資源釋放了,所以,不管我們打開多少次,只要關閉了,就不會在任務管理器中發現excel進程了。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章