最近在了解关于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进程了。