10

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

我希望文档是 MS Word 文档 ( .doc) 或者可以是开放文档格式 ( .odt) 另外我希望文档使用字体、图像、数据表、一些背景颜色等进行格式化。

我已经使用 和 完成了PDF文件的创建。但是当我尝试对odt应用相同的内容时,我只得到了格式错误。QTextDocumentQTextCursorQPrinterQTextDocument

有没有办法使用任何其他使用 C++ 的库来生成此类文档?你们如何使用C++生成此类文档( .odt /. doc )?欢迎任何与此相关的指针、链接和示例。

4

3 回答 3

9

我已经通过这种Qt方式做到了。即通过使用ActiveQt模块。

MS Word的参考文档可以通过以下方式获得:

MSDN 文档,它实际上指向了VBAWD10.chm具有 MS Word 的 ActiveX api 的文件。

Word应用程序可以通过以下方式初始化

QAxWidget wordApplication("Word.Application"); 

word应用的子对象可以通过函数获取,

QAxBase::querySubObject()

例如:

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

要将获得的子对象作为参数传递,

QVariant QAxBase::asVariant () const

任何涉及单词对象的函数调用都可以使用以下函数调用,

 QAxBase::dynamicCall ()

例如:

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

经过相当多的斗争和很少的说服,它工作正常。:)

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

于 2010-07-28T13:02:10.663 回答
1

也许您可以使用它并以 odf 格式写入文件http://doc.trolltech.com/4.6/qtextdocumentwriter.html#supportedDocumentFormats qt 不知道如何输出 doc docx 等,但您可以使用 com(activeQt) 或一些以您需要的那些或其他格式编写的其他库

于 2010-07-05T08:31:02.950 回答
0

对我来说,自动化 Office 应用程序的更好方法是将对象模型从 MS Word COM 类型库导入 C++ 项目。这与 Outlook 应用程序的Qutlook 示例非常相似。如果需要,您可以将该技术外推到 Excel 和 PowerPoint,使用 oleview.exe 获取库 Guids。是 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
}

main.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;
}
于 2020-01-15T17:03:05.700 回答