是Visual Basic的一种宏语言,是在其桌面应用程序中执行通用的自动化(OLE)任务的编程语言。主要能用来扩展Windows的应用程序功能,特别是Microsoft Office软件。它也可说是一种应用程式视觉化的 Basic 脚本。
调用方法用dynamicCall,获取属性或获取返回值用querySubObject()
查看操作office所需调用的函数https://docs.microsoft.com/zh-cn/office/vba/api/
QT想要操作excel需要使用一个模块就是axcontainer模块,他和GUI,network一样,都是要自行添加在。pro文件中。部分材料中提到,商业版QT才有axcontainer,这个时候可以使用CONFIG += qaxcontainer命令(QT4的模块),我在使用CONFIG += qaxcontainer后,QT += axcontainer也可以使用了,目前不知道为什么。
#-------------------------------------------------
#
# Project created by QtCreator 2022-02-21T10:36:47
#
#-------------------------------------------------
QT += core gui
#QT += core axcontainer
QT += axcontainer
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = writeExcel
TEMPLATE = app
# The following define makes your compiler emit warnings if you use
# any feature of Qt which has been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
CONFIG += c++11
#CONFIG += qaxcontainer
SOURCES += \
main.cpp \
mainwindow.cpp
HEADERS += \
mainwindow.h
FORMS += \
mainwindow.ui
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
想要访问excel,需要通过QAxobject来操作因此在头文件应添加
#include
#include
#include
class{
private:
QAxObject* myexcel;//excel 应用程序指针
QAxObject* myworks;//工作簿集指针
QAxObject* workbook;//工作簿指针
QAxObject* mysheets;//电子表格集
}
若要操作excel我们应该首先创建一个Excel进程
myexcel = new QAxObject("Excel.Application");
随后获取当前excel进程的工作簿集
myworks = myexcel->querySubObject("WorkBooks");
添加一个工作簿
myworks->dynamicCall("Add");
获取当前活动的工作簿
workbook = myexcel->querySubObject("ActiveWorkBook");
添加一个表格集
mysheets->dynamicCall("Add");
指向当前活动表格
QAxObject *sheet = workbook->querySubObject("ActiveSheet");
给表格命名
sheet->setProperty("Name", "writeQt");
指向特定单元格
QAxObject *cell = sheet->querySubObject("Range(QVariant, QVariant)", "C3");
单元格写入内容
cell->dynamicCall("SetValue(const QVariant&)", QVariant(inStr));
指向特定表格集
sheet = mysheets->querySubObject("Item(int)", i);
保存表格
workbook->dynamicCall("SaveAs(const QString&)", "./Qt5.xlsx");
打开表格
myworks->dynamicCall("Open(const QString&)", "./Qt5.xlsx");
读取表格内容
QString outStr = cell->dynamicCall("Value2()").toString();
指向第二个表格
sheet = workbook->querySubObject("Sheets(int)", 2);
QAxBase: Error calling IDispatch member ActiveSheet: Unknown error
我这边出现这个主要是在操作表的时候,Excel表格突然弹出激活、许可协议等信息等造成的。激活工具激活office后就好了。
QAxBase: Error calling IDispatch member SaveAs: Exception thrown by server
Code : -2146827284
Source : Microsoft Excel
Description: Microsoft Excel ???D://24ED7000?? ???:
Help : xlmain11.chm
出现错误的原因是因为我对这个类的调用过程中,对文件保存路径出现错误,解决方式保存在Excel默认保存路径
exportexcel.newExcel("./text.xls"); //将保存在调用的Excel功能的默认保存文件夹
参考:
QT5开发及实例 陆文周
https://blog.csdn.net/y396397735/article/details/78306440
https://blog.csdn.net/qq_41488943/article/details/102838380