【QT Excel】读写文件及踩坑处理

QT excel编程小结

excel基本结构

  1. excel当前工作文档
  2. excel的工作簿:works
  3. excel的表格集(1,2,3不是从零开始的):sheet
  4. excel的每个单元格:cell

excel自动化办公接口VBA(Visual Basic for Applications)

是Visual Basic的一种宏语言,是在其桌面应用程序中执行通用的自动化(OLE)任务的编程语言。主要能用来扩展Windows的应用程序功能,特别是Microsoft Office软件。它也可说是一种应用程式视觉化的 Basic 脚本。

调用方法用dynamicCall,获取属性或获取返回值用querySubObject()

查看操作office所需调用的函数https://docs.microsoft.com/zh-cn/office/vba/api/

QT 操作excel流程

QT工程准备

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的的方式

想要访问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

你可能感兴趣的:(QT编程,qt,visual,studio,qt5,qtcreator,excel)