C++跨平台库QT学习9 通过QAxObject操作Excel_qaxobject适配linux吗

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以点击这里获取!

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

一、打开Excel文件

  • 首先在.pro文件加入:QT += axcontainer
  • 引入头文件: #include <QAxObject>


    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()<<"获取sheet失败...";
    }
    

三、数据读取

    // 获取有数据的区域
    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;i<row_count;++i)
        {
          rowData = varRows[i].toList();
          excel_list.push_back(rowData);
        }
    }
    
    // 另一种方式获取单元格值
    QAxObject *cellA;
    // 设置要操作的单元格,如A1
    QString A = "A" + QString::number(cellrow);
    // 获取单元格内容
    cellA = worksheet->querySubObject("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() <<"创建sheet失败..." << endl;
    }

六、根据名称删除表

    try {
        QAxObject *pFirstSheet = worksheets->querySubObject("Item(QString)", name);
        pFirstSheet->dynamicCall("delete");
    } catch (...) {
        qCritical()<<"删除sheet失败...";
        return false;
    }
    return true;

七、按索引删除表



### 最后的话

最近很多小伙伴找我要Linux学习资料,于是我翻箱倒柜,整理了一些优质资源,涵盖视频、电子书、PPT等共享给大家!

### 资料预览

给大家整理的视频资料:

![](https://img-blog.csdnimg.cn/img_convert/ea59c8cdbf55aa3a51ffe8a5717ae9ee.png)

给大家整理的电子书资料:

  

![](https://img-blog.csdnimg.cn/img_convert/6e2272669ea8320da4c61c46d1dcbcfa.png)



**如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!**

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以点击这里获取!](https://bbs.csdn.net/topics/618635766)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以点击这里获取!](https://bbs.csdn.net/topics/618635766)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值