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进程了。

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值