通过C++/Qt生成Word文档(.doc/.odt)

10

我正在使用Qt 4.5.3和Windows XP。 我需要我的应用程序生成包含正在使用和生成的信息的文档。 正在使用的信息将只是字符串(更具体地说,是QString),而正在生成的信息也将是字符串和图像

我希望文档是Microsoft Word文档(.doc)或可以是Open Document格式(.odt)。此外,我希望文档采用字体,图片,数据表格,某些背景色等格式。

我已经使用QTextDocumentQTextCursorQPrinter创建了PDF文件。 但是当我尝试将相同的QTextDocument应用于odt时,结果出现格式错误。

有没有其他使用C ++的库来生成这样的文档的方法? 你们如何在C ++中生成这样的文档(.odt / .doc)? 关于此的任何指针,链接,示例都受到欢迎。

3个回答

10
我已经通过使用ActiveQt模块的Qt方法完成了这个任务。
可以通过MSDN documentation获取MS Word的参考文档,该文档实际上指向了VBAWD10.chm文件,其中包含了MS Word的ActiveX api。
Word应用程序可以通过初始化来实现。
QAxWidget wordApplication("Word.Application"); 

通过该函数可以获取单词应用程序的子对象。

QAxBase::querySubObject()

For e.g:

QAxObject *activeDocument = wordApplication.querySubObject("ActiveDocument");

将获取到的子对象作为参数传递,
QVariant QAxBase::asVariant () const

任何涉及到单词“object”的函数调用都可以使用函数“using”进行调用。
 QAxBase::dynamicCall ()

例如:

activeDocument->dynamicCall("Close(void)");

经过一番努力和一些说服工作,它很好地工作了。:)

希望对那些正在寻找类似解决方案的人有所帮助...


1

0
对我而言,一种更好的自动化 Office 应用程序的方式是将 MS Word COM 类型库的对象模型导入到 C++ 项目中。这与 Outlook 应用程序的示例非常相似。如果您想要,可以使用 oleview.exe 来获取库 GUID 将该技术推广到 Excel 和 PowerPoint。这里是 GitHub 上完整的项目。
QMake 项目文件:
QT += widgets axcontainer
CONFIG += c++11 cmdline
DEFINES += QT_DEPRECATED_WARNINGS

DUMPCPP=$$absolute_path("dumpcpp.exe", $$dirname(QMAKE_QMAKE))
TYPELIBS = $$system($$DUMPCPP -getfile {00020905-0000-0000-C000-000000000046})

isEmpty(TYPELIBS) {
    message("Microsoft Word type library not found!")
    REQUIRES += StackOverflow Rocks
} else {
    SOURCES  = main.cpp
}

主.cpp源代码:

#include <QApplication>
#include <QStandardPaths>
#include <QDir>
#include "MSWORD.h"

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

    Word::Application word;
    if (!word.isNull()) {
        word.SetVisible(false);

        Word::Documents* docs = word.Documents();
        Word::Document* newDoc = docs->Add();
        Word::Paragraph* p = newDoc->Content()->Paragraphs()->Add();
        p->Range()->SetText("Hello Word Document from Qt!");
        p->Range()->InsertParagraphAfter();
        p->Range()->SetText("That's it!");

        QDir outDir(QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation));

        QVariant fileName = outDir.absoluteFilePath("wordaut.docx");
        QVariant format = Word::wdFormatXMLDocument;
        newDoc->SaveAs2(fileName, format);

        QVariant fileName2 = outDir.absoluteFilePath("wordaut2.doc");
        QVariant format2 = Word::wdFormatDocument;
        newDoc->SaveAs2(fileName2, format2);

        newDoc->Close();
        word.Quit();
    }

    return 0;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接