QT:Qt对OFFICE的基本读写

qt 下面通过一个实例演示QT对EXCEL和word ( WPS 表格、WPS文档)基本读写操作。

创建一个QT桌面应用程序项目,项目名称为OfficeHello,为了方便对比QT对两种不同类型的文档的操作,设计程序界面,qt 对OFFICE 基本读写程序界面如图14.4所示:

image

image

 

image

 

 项目文件添加 “axcontainer” ,  QT += axcontainer , 项目文件OfficeHello.pro 脚本内容:

QT       += core gui axcontainer

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked 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 it uses 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

SOURCES += \
    main.cpp \
    mainwindow.cpp

HEADERS += \
    mainwindow.h

FORMS += \
    mainwindow.ui

TRANSLATIONS += \
    OfficeHello_zh_CN.ts

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

  

 

 

mainwindow.h 文件 

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QMessageBox>
#include <QAxObject>  // 访问OFFICE对象类

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_readExcelPushButton_clicked();
    void on_writeExcelPushButton_clicked();
    void on_readWordPushButton_clicked();
    void on_writeWordPushButton_clicked();


private:
    Ui::MainWindow *ui;
    QAxObject *myexcel; // excel应用程序指针
    QAxObject *myworks; // 工作簿集指针
    QAxObject *workbook; // 工作簿指针
    QAxObject *mysheets; // 电子表格集指针

    QAxObject *myword; // WORD应用程序指针
    QAxObject *mydocs; //文档集指针
    QAxObject *document; //文档指针
    QAxObject *paragraph; //文本段指针
};
#endif // MAINWINDOW_H

  

源代码 mainwindow.cpp 代码:

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    // QaxObject QaxWidget :需要 在项目文件里添加  axcontainer
    ui->setupUi(this);

    myexcel = new QAxObject("Excel.Application");
    myworks = myexcel->querySubObject("WorkBooks"); // 获取工作簿集
    myworks->dynamicCall("Add"); // 添加工作簿
    workbook = myexcel->querySubObject("ActiveWorkBook"); //激活当前工作簿
    mysheets = workbook->querySubObject("Sheets");// 获取电子表格集

    myword = new QAxObject("Word.Application");
    mydocs = myword->querySubObject("Documents"); // 获取文档集
    mydocs->dynamicCall("Add(void)");//添加一个文档
    document = myword->querySubObject("ActiveDocument"); //指向当前活动的文档
    paragraph = myword->querySubObject("Selection"); //指向当前选中文本
    ui->readExcelPushButton->setEnabled(true);
    ui->readWordPushButton->setEnabled(true);
    connect(ui->readExcelPushButton,SIGNAL(clicked()),this,SLOT(on_readExcelPushButton()));
    connect(ui->writeExcelPushButton,SIGNAL(clicked()),this,SLOT(on_writeExcelPushButton()));
    connect(ui->readWordPushButton,SIGNAL(clicked()),this,SLOT(on_readWordPushButton()));
    connect(ui->writeWordPushButton,SIGNAL(clicked()),this,SLOT(on_writeWordPushButton()));
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_readExcelPushButton_clicked()
{
   // myexcel = new QAxObject("ET.Application");  // WPS 表格
    myexcel = new QAxObject("KET.Application");  //新版 WPS 表格
    //myexcel = new QAxObject("Excel.Application"); // Office Excel
    myworks = myexcel->querySubObject("WorkBooks");
    myworks->dynamicCall("Open(cost QString&","D:\\demo\\Qt5.14\\CH12\\CH1401\\我爱QT5.14.xls"); // 打开EXCEL
    workbook = myexcel->querySubObject("ActiveWorkBook");
    mysheets = workbook->querySubObject("WorkSheets") ;

    QAxObject *sheet = workbook->querySubObject("Sheets(int)",1);
    QAxObject *cell = sheet->querySubObject("Range(QVariant,QVariant)","C3");
    QString outstr = cell->dynamicCall("Value2()").toString(); // 读出C3单元格的内容
    ui->OutExcelLabel->setText(outstr);
    sheet = workbook->querySubObject("Sheets(int)",2);
    cell = sheet->querySubObject("Range(QVariant,QVariant)","B5");
    outstr = cell->dynamicCall("Value2()").toString();
    workbook->dynamicCall("Close()"); // 关闭EXCEL
    myexcel->dynamicCall("Quit()"); // 退出EXCEL应用程序
    QMessageBox::information(this,tr("消息"),outstr);
    ui->writeExcelPushButton->setEnabled(true);
    ui->readExcelPushButton->setEnabled(false);

}

void MainWindow::on_writeExcelPushButton_clicked()
{
    mysheets->dynamicCall("Add"); // 添加一个表
    QAxObject *sheet = workbook->querySubObject("ActiveSheet");//指向当前活动表格
    sheet->setProperty("Name","我爱上Qt"); // 工作表命名为“我爱上Qt”
    QAxObject *cell = sheet->querySubObject("Range(QVariant,QVariant)","C3") ; // 指向C3单元格
    QString  inStr =        ui->InExcelLineEdit->text();
    cell->dynamicCall("SetValue(const QVariant&)",QVariant(inStr)); // 向单元格写入内容

    sheet = mysheets->querySubObject("Item(int)",2); // 指向第二个表格
    sheet->setProperty("Name","Hello Qt");
    cell = sheet->querySubObject("Range(QVariant,Qvariant)","B5");
    cell->dynamicCall("SetValue(const QVariant&)",QVariant("Hello,I love Qt"));
    workbook->dynamicCall("SaveAs(const QString&)","D:\\demo\\Qt5.14\\CH12\\CH1401\\我爱QT5.14.xls");
    workbook->dynamicCall("Close()");
    myexcel->dynamicCall("Quit()");
    QMessageBox::information(this,tr("完毕"), tr("Excel工作表已经保存。"));
    ui->writeExcelPushButton->setEnabled(false);
    ui->readExcelPushButton->setEnabled(true);
}

void MainWindow::on_readWordPushButton_clicked()
{
    // myword = new QAxObject("WPS.Application"); // 旧版WPS
     myword = new QAxObject("KWPS.Application"); // 新版 WPS
    //myword = new QAxObject("Word.Application"); // Office Word
    mydocs = myword->querySubObject("Documents");
    mydocs->dynamicCall("Open(cost QString&","D:\\demo\\Qt5.14\\CH12\\CH1401\\我爱QT5.14.doc"); // 打开Word
    document = myword->querySubObject("ActiveDocument"); //指向活动文档
    paragraph = document->querySubObject("Range()") ; //指向当前文档

    QString outStr =paragraph->property("Text").toString(); // 读出文本的内容
    ui->OutWordLabel->setText(outStr.split("H").at(0));
    paragraph = document->querySubObject("Range(QVariant,QVariant)",14,30);
    outStr = paragraph->property("Text").toString();
    delete paragraph;
    paragraph = nullptr;

    document->dynamicCall("Close()"); // 关闭Word
    myword->dynamicCall("Quit()"); // 退出Word应用程序
    QMessageBox::information(this,tr("消息"),outStr);
    ui->writeWordPushButton->setEnabled(true);
    ui->readWordPushButton->setEnabled(false);
}

void MainWindow::on_writeWordPushButton_clicked()
{
    QString inStr = ui->InWordLineEdit->text();
    paragraph->dynamicCall("TypeText(const QString&)",inStr);
    paragraph->dynamicCall("TypeText(const QVariant&)",QVariant("\nHello! I love Qt."));
;
    document->dynamicCall("SaveAs(const QString&)","D:\\demo\\Qt5.14\\CH12\\CH1401\\我爱QT5.14.doc"); // 保存文件
    delete paragraph;
    paragraph = nullptr;

    document->dynamicCall("Close()");
    myword->dynamicCall("Quit()");
    QMessageBox::information(this,tr("完毕"), tr("Word文档已经保存。"));
    ui->writeWordPushButton->setEnabled(false);
    ui->readWordPushButton->setEnabled(true);
}

 

main.cpp 代码

  

#include "mainwindow.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

  

 

posted @ 2025-11-19 21:41  samrv  阅读(50)  评论(0)    收藏  举报