最近在瞭解關於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進程了。