5
社区成员




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源代码可以到这里下载