qt excel 不能彻底退出_C++跨平台库QT学习 操作Excel

c197d33b9d8261cb0a559e1a811775b0.png

一、打开Excel文件

  • 首先在.pro文件加入:QT += axcontainer
  • 引入头文件: #include
    qDebug() << "尝试打开Excel" << path << endl;    // 操作Excel的对象    QAxObject *excel = NULL;    // workbook对象    QAxObject *workbooks = NULL;    // workbook对象    QAxObject *workbook = NULL;    excel = new QAxObject("Excel.Application");    //true 表示操作文件时可见,false表示为不可见    excel->dynamicCall("SetVisible(bool)", true);    workbooks = excel->querySubObject("WorkBooks");    // 指定路径打开Excel    workbook = workbooks->querySubObject("Open(QString&)", path);

二、获取worksheet

    // 获取所有worksheets    QAxObject * worksheets = workbook->querySubObject("WorkSheets");    // count属性获取worksheet数量    int iWorkSheet = worksheets->property("Count").toInt();    qDebug() << QString("Excel文件中表的个数: %1").arg(QString::number(iWorkSheet));    // 取得第一个worksheet    QAxObject * worksheet = worksheets->querySubObject("Item(int)", 1);        // 根据名称获取worksheet    QAxObject* pWorkSheet = NULL;    try {        pWorkSheet = worksheets->querySubObject("Item(QString)", name);    } catch (...) {        qCritical()<

三、数据读取

    // 获取有数据的区域    QAxObject * usedrange = worksheet->querySubObject("UsedRange");    // 通过rows获取行数    QAxObject * rows = usedrange->querySubObject("Rows");    int iRows = rows->property("Count").toInt();    qDebug() << QString("行数为: %1").arg(QString::number(iRows));    // 通过Columns获取列数    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));    // 将所有的数据读取到QVariant容器中保存    QVariant var = usedrange->dynamicCall("Value");    // 将QVariant转换为Qlist的二维数组    QVariantList varRows=var.toList();    if(varRows.isEmpty())    {        qDebug() << "没有数据" << endl;    }else{        const int row_count = varRows.size();        QVariantList rowData;        // 转换过程        for(int i=0;iquerySubObject("Range(QVariant, QVariant)",A);    // 设置值    cellA->dynamicCall("SetValue(const QVariant&)",QVariant("新值"));

四、数据写入

    // 不显示任何警告信息。如果为true在关闭是会出现类似“文件已修改,是否保存”的提示excel->setProperty("DisplayAlerts", false);    // 保存数据    workbook->dynamicCall("Save()");    // 另存    // workbook->dynamicCall("SaveAs(const QString&)",QDir::toNativeSeparators(filepath));

五、添加worksheet

    QAxObject *pWorkSheet = NULL;    try {    //获取工作表数目        int count = worksheets->property("Count").toInt();          // 取得最后一个表        QAxObject *pLastSheet = worksheets->querySubObject("Item(int)", count);        // 新增一个表        pWorkSheet = worksheets->querySubObject("Add(QVariant)", pLastSheet->asVariant());        // 移动位置        pLastSheet->dynamicCall("Move(QVariant)", pWorkSheet->asVariant());        // 设置工作表名称        pWorkSheet->setProperty("Name", name);      } catch (...) {        qCritical() <

六、根据名称删除表

    try {        QAxObject *pFirstSheet = worksheets->querySubObject("Item(QString)", name);        pFirstSheet->dynamicCall("delete");    } catch (...) {        qCritical()<

七、按索引删除表

    try {        QAxObject *pFirstSheet = worksheets->querySubObject("Item(int)", index);        pFirstSheet->dynamicCall("delete");    } catch (...) {        qCritical()<

八、释放Excel对象

Excel对象如果没有释放,会造成进程里Excel相关进程无法自动退出。

    // 关闭workbook    workbook->dynamicCall("Close()");    // 关闭excel    excel->dynamicCall("Quit()");    if (excel)    {        delete excel;        excel = NULL;    }

九、QT其它操作Excel的方法

1. QtXlsx

网址:http://qtxlsx.debao.me
可以不安装Excel就能方便地对Excel文件进行操作。

2. ODBC操作Excel文件

须安装MS Access数据库引擎。

其它库功能对比:

0b95f92ca74e833867fddb20a5a46470.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值