Qt 中关于word的操作

1,835 阅读3分钟

在Qt中,有时候有需求使用程序自动生成word文档(例如:导出报告、自动生成文档等工作。)。在Qt中使用Microsoft Word可以通过ActiveX对象实现。

简单使用

例如何在Qt应用程序中使用Microsoft Word创建一个新文档,并在其中添加一些文本:

#include <QAxObject>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QAxObject* word = new QAxObject("Word.Application");
    word->setProperty("Visible", true);

    QAxObject* documents = word->querySubObject("Documents");
    QAxObject* document = documents->querySubObject("Add()");

    QAxObject* selection = word->querySubObject("Selection");
    selection->dynamicCall("TypeText(QString)", "Hello World!");

    return app.exec();
}

解释:

QAxObject类来创建并控制Microsoft Word对象。

通过设置Visible属性为true,可以使Word应用程序在前台显示。

此时只是打开了一个word应用程序,此时还需要打开 一个文档对象。

在这里选择是添加一个新的文档对象。然后使用querySubObject方法获取Selection对象,该对象代表了当前选择的内容。我们调用TypeText方法将文本插入到文档中

querySubObject方法可以用于调用ActiveX对象的任何方法或属性。它的语法如下

QAxObject* QAxObject::querySubObject(const QString &name);

在使用querySubObject方法获取ActiveX对象的子对象时,实际可调用的子对象是由该ActiveX对象的类型和实现方式所决定的,不同的ActiveX对象可能提供不同的子对象。

一般而言,ActiveX对象的子对象可以分为以下几种类型:

  1. 属性对象:ActiveX对象的属性可以是一个子对象,例如Word文档的ActiveDocument属性就是一个子对象。
  2. 方法对象:ActiveX对象的方法可以返回一个子对象,例如Excel工作簿的Sheets方法返回一个子对象集合。
  3. 枚举对象:ActiveX对象的枚举可以是一个子对象,例如PowerPoint演示文稿的Slides枚举就是一个子对象。
  4. 接口对象:ActiveX对象可能实现了一个或多个接口,每个接口都是一个子对象。

还是好麻烦欸,有没有什么办法可以看到 querySubObject 到底可以调用的呢?

你可能需要这样一篇文档

image.png 如何找到呢?

generateDocumentation

在Qt中,可以使用generateDocumentation方法生成ActiveX对象的API文档,以便查看ActiveX对象的接口、属性、方法等详细信息。

比如我想看当前axobject所有可以调用的东西,应该这样去看:

#include "MainWindow.h"
#include <QAxObject>
#include <QApplication>
#include <QDebug>
#include <QHBoxLayout>
#include <QTextBrowser>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QAxObject *axObject = new QAxObject("Word.Application");
    QAxObject* documents = axObject->querySubObject("Documents");
    QString docString = documents->generateDocumentation();
    QTextBrowser* t = new QTextBrowser();
    t->append(docString);
    t->show();
    return a.exec();
}

这样就打开了一个axobject对象的的文档。


继续上面的例子,

上面用到的是"Add()",你还可以选择 Open()来处理

image.png

例子

word的操作api太多太多,不可能一个个书写在这里,这里只是提供了一种方法,如何去找自己想要的api

比如我想插入书签:

你可以这样玩

QAxObject *word = new QAxObject("Word.Application");
QAxObject *documents = word->querySubObject("Documents");
QAxObject *document = documents->querySubObject("Open(const QString&)", "C:\\111.docx");

QAxObject *bookmarks = document->querySubObject("Bookmarks");
QAxObject *bookmark = bookmarks->querySubObject("Add(const QString&, const QAxObject&)", "MyBookmark", QVariant());
bookmark->setProperty("Range", document->querySubObject("Range()"));
bookmark->dynamicCall("Select()");

word->setProperty("Visible", true);

其中的操作,每一步都可以用 generateDocumentation来看一下。

比如 Bookmarks

#include "MainWindow.h"
#include <QAxObject>
#include <QApplication>
#include <QDebug>
#include <QHBoxLayout>
#include <QTextBrowser>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QAxObject *word = new QAxObject("Word.Application");
    QAxObject *documents = word->querySubObject("Documents");
    QAxObject *document = documents->querySubObject("ADD()");

    QAxObject *bookmarks = document->querySubObject("Bookmarks");
    QString docString = bookmarks->generateDocumentation();
    QTextBrowser* t = new QTextBrowser();
    t->append(docString);
    t->show();
    return a.exec();
}

可以明显找出其中的 ADD 对应着的文档描述

image.png