Qt操作Excel之QAxObject(ActiveX Excel)方式0x00
- 2026-09-23 00:34:44
Qt操作Excel之QAxObject(ActiveX Excel)方式0x00
一、一些概念
1.在Qt中使用QAxObject操作Excel,本质上是借助Windows的COM(组件对象模型)技术,通过ActiveX自动化接口来间接控制Excel应用程序;
2.核心操作流程: 创建实例->打开/创建工作簿->操作工作表->保存/退出;
3.Excel COM对象模型层次(核心树结构):
Excel.Application // 顶层:Excel应用实例├─ WorkBooks // 工作簿集合│ └─ WorkBook // 单个xlsx文件│ ├─ WorkSheets // Sheet集合│ │ └─ Worksheet // 单个工作表│ │ └─ Range // 单元格/区域对象(A1、A1:C10)│ │ └─ Value / Font / Interior ...│ └─ Close() // 关闭工作簿└─ Quit() // 退出Excel应用进程
二、测试
1.工程目录
QtDemo/├─ CMakeLists.txt└─ main.cpp
2.源码
CMakeLists.txt
cmake_minimum_required(VERSION 3.20 FATAL_ERROR)#项目名称project(QtDemo VERSION 1.0 LANGUAGES CXX)#C++标准(VS2015最高支持 14)set(CMAKE_CXX_STANDARD 14)set(CMAKE_CXX_STANDARD_REQUIRED ON)#强制使用VS2015 工具集 v140set(CMAKE_GENERATOR_TOOLSET "v140" CACHE STRING "Platform Toolset" FORCE)#自动处理Qt信号槽/UI/资源(必须开)set(CMAKE_AUTOMOC ON)set(CMAKE_AUTORCC ON)set(CMAKE_AUTOUIC ON)#查找Qt5.12.6(精准匹配)find_package(Qt5 5.12.6 REQUIRED COMPONENTS Core Widgets Gui AxContainer)#源文件(你可以自己加)set(SOURCESmain.cpp)#WIN32:去掉控制台黑框add_executable(QtDemo WIN32${SOURCES})#链接Qt库target_link_libraries(QtDemo PRIVATEQt5::CoreQt5::WidgetsQt5::GuiQt5::AxContainer)#VS输出目录优化set_target_properties(QtDemo PROPERTIESRUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/bin/DebugRUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/bin/Release)#自动配置VS调试PATH (需要替换目录为你实际的安装目录--Qt5.12.6)set(QT_BIN_PATH "D:/Tool/DevelopmentTool/Qt/Qt5.12.6/5.12.6/msvc2015_64/bin")set_target_properties(QtDemo PROPERTIESVS_DEBUGGER_ENVIRONMENT "PATH=${QT_BIN_PATH};%PATH%")
main.cpp
#include<QCoreApplication>#include<QAxObject>#include<QDir>#include<QFile>#include<QDebug>#include<Windows.h>intmain(int argc, char *argv[]){//COM必须最先初始化CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);QCoreApplication a(argc, argv);/*连接excel控件*/QAxObject* m_pExcel = new QAxObject("Excel.Application");m_pExcel->dynamicCall("SetVisible(bool visible)", false);m_pExcel->setProperty("DisplayAlert", false);m_pExcel->setProperty("EnableEvents", false);/*先创建新的Excel文件*/#if 0/*保存Excel文件路径*/QString strSavePath = QDir(QCoreApplication::applicationDirPath()).filePath("cmake_demo.xlsx");//获取当前的工作薄QAxObject* m_pWorkBooks = m_pExcel->querySubObject("WorkBooks");m_pWorkBooks->dynamicCall("Add");QAxObject* m_pWorkBook = m_pExcel->querySubObject("ActiveWorkBook");QAxObject* m_pWorkSheets = m_pWorkBook->querySubObject("Sheets");QAxObject* m_pWorkSheet = m_pWorkSheets->querySubObject("Item(int)", 1);//保存文件,一定要将路径中 ‘/’转为‘\\’,前者只能被Qt识别m_pWorkBook->dynamicCall("SaveAs(const QString&)", QDir::toNativeSeparators(strSavePath));/*设置单元格中的内容 行号+列号*/QString number = "A1";QAxObject* pCell = m_pWorkSheet->querySubObject("Range(QString)", number);int value = 1234;pCell->setProperty("Value", value);#endif/*再打开已存在的Excel文件*/#if 1QAxObject* m_pWorkBook = nullptr;QString strExcelPath = QDir(QCoreApplication::applicationDirPath()).filePath("cmake_demo.xlsx");//获取当前工作薄QAxObject* m_pWorkBooks = m_pExcel->querySubObject("WorkBooks");m_pWorkBooks->dynamicCall("Open(QString)", strExcelPath); //(const QString&)qDebug() << m_pWorkBooks;if (m_pWorkBooks){qDebug() << "Open Excel Success";m_pWorkBook = m_pExcel->querySubObject("ActiveWorkBook");//获取sheetsQAxObject* m_pWorkSheets = m_pWorkBook->querySubObject("Sheets");//获取某个sheetQAxObject* m_pWorkSheet = m_pWorkSheets->querySubObject("Item(int)", 1);/*获取单元格中的内容*/QString number = "A1";int value;QAxObject* pCell = m_pWorkSheet->querySubObject("Range(QString)", number);value = pCell->property("Value").toInt();qDebug() << "value:" << value;}#endif//关闭文件m_pWorkBook->dynamicCall("Close(Boolean)", true);//关闭Excelm_pExcel->dynamicCall("Quit()");delete m_pExcel;m_pExcel = nullptr;CoUninitialize();return 0;}
3.生成VS2015工程步骤
#创建build目录mkdir buildcd build#执行如下命令生成VS2015工程(QtDemo.sln双击打开即可)D:\Tool\cmake-3.20.0-rc2-windows-x86_64\bin\cmake .. -G "Visual Studio 14 2015 Win64" -DCMAKE_PREFIX_PATH=D:\Tool\DevelopmentTool\Qt\Qt5.12.6\5.12.6\msvc2015_64\lib\cmake
4.程序运行结果

三、测试平台
VS2015 x64 Debug
四、参考
1.<Qt开发之CMake版本、Qt版本和VS2015的编译工具链适配>2.https://learn.microsoft.com/zh-cn/office/vba/api/excel.workbooks.open
本文来自网友投稿或网络内容,如有侵犯您的权益请联系我们删除,联系邮箱:wyl860211@qq.com 。