使用C++语言Qt框架完成替换Excel表格的内容

亭台六七座 2024-11-29 12:09:32

 Qt框架提供了QAxObject类用以处理COM接口,使用此类需要添加axcontainer模块

QT       += axcontainer

 首先我们在PRO工程文件中进行了添加

INCLUDEPATH += \
    E:/Programming/QT/QTcoder/Own/h_cpp/COM/office2/excel

SOURCES += \
    main.cpp \
    widget.cpp \
    E:/Programming/QT/QTcoder/Own/h_cpp/COM/office2/excel/Application.cpp \
    E:/Programming/QT/QTcoder/Own/h_cpp/COM/office2/excel/Workbook.cpp \
    E:/Programming/QT/QTcoder/Own/h_cpp/COM/office2/excel/Workbooks.cpp \
    E:/Programming/QT/QTcoder/Own/h_cpp/COM/office2/excel/Range.cpp \
    E:/Programming/QT/QTcoder/Own/h_cpp/COM/office2/excel/Sheets.cpp \
    E:/Programming/QT/QTcoder/Own/h_cpp/COM/office2/excel/Worksheet.cpp

HEADERS += \
    widget.h \
    E:/Programming/QT/QTcoder/Own/h_cpp/COM/office2/excel/def.h \  #所有类的宏定义在这里,用到哪个类需要接触屏蔽
    E:/Programming/QT/QTcoder/Own/h_cpp/COM/office2/excel/enum.h \
    E:/Programming/QT/QTcoder/Own/h_cpp/COM/office2/excel/Application.h \
    E:/Programming/QT/QTcoder/Own/h_cpp/COM/office2/excel/Workbook.h \
    E:/Programming/QT/QTcoder/Own/h_cpp/COM/office2/excel/Workbooks.h \
    E:/Programming/QT/QTcoder/Own/h_cpp/COM/office2/excel/Range.h \
    E:/Programming/QT/QTcoder/Own/h_cpp/COM/office2/excel/Sheets.h \
    E:/Programming/QT/QTcoder/Own/h_cpp/COM/office2/excel/Worksheet.h

 这里我们引用了Excel的COM接口的六个类的头文件

#include "Application.h"
#include "Range.h"
#include "Sheets.h"
#include "Workbook.h"
#include "Workbooks.h"
#include "Worksheet.h"

打开def.h解除以上六个类的屏蔽的宏

宏定义格式为 QAX_DUMPCPP_MACRO_CLASS_XXX_H

 

在窗口类的构造函数中初始化Excel的COM接口;也可以使其方便手动关闭激活向导,不关闭激活向导将导致后续接口无法正常调用。

    pApplication = new Excel::Application;
    QString str = pApplication->application->generateDocumentation(); //调用QAxObject的成员函数
    writeTxt("E:/Application.html", str);
    qDebug() << pApplication->Version();
    pApplication->SetDisplayAlerts(false); //禁止显示警告弹窗
    pApplication->SetVisible(true);

    //!!!若Office未激活,这里会弹出激活向导,这样写方便手动关闭激活向导
    //!不关闭激活向导将导致后续接口无法正常调用
    pWorkbooks = pApplication->Workbooks();
    if (pWorkbooks == Q_NULLPTR) {
        return;
    }

在析构函数中不要忘了退出和销毁,否则Excel进程会被遗留

    if (Q_NULLPTR != pApplication) {
        pApplication->Save();
        pApplication->Quit();
        delete pApplication;
    }

我们点击按钮后,设置表格内容及保存Excel的代码如下

    Excel::Workbook *pWorkbook = Q_NULLPTR;
    pWorkbook = pWorkbooks->Add();
    if (pWorkbook == Q_NULLPTR) {
        return;
    }
    Excel::Sheets *sheets = pWorkbook->Sheets();
    Excel::Worksheet *sheet = new Excel::Worksheet(sheets->Item(1));
    sheet->Range("A1")->SetValue("WW");//设置A1表格的内容为"WW"
    pWorkbook->Save();
    pWorkbooks->Close();

这里我们将COM类进行了封装,可以像使用普通源码一样使用,有代码提示,使得编写代码不易出错
也可以用到哪个类加入哪个类,达到优化软件体积,加快编译速度的目的,不用将整个COM库代码整体加入,总共768个文件,实现Excel的COM接口的99.8%的接口

用到的COM源代码可以到这里下载

...全文
243 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

5

社区成员

发帖
与我相关
我的任务
社区描述
本社区旨在为Qt交流
qtqt6.3pyqt 技术论坛(原bbs)
社区管理员
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

本社区旨在Qt学习交流

试试用AI创作助手写篇文章吧