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

时间:2010-07-05 04:47:12

标签: c++ qt ms-word odf

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

我希望文档是MS Word文档(.doc)或者可以是开放文档格式(.odt)我还希望使用字体,图像,表格来格式化文档数据,一些背景颜色和所有

我使用QTextDocumentQTextCursorQPrinter创建了 PDF 文件。但是当我尝试为 odt 应用相同的QTextDocument时,我最终只得到了格式错误。

有没有办法使用任何其他使用C ++的库生成此类文档?您是如何使用C ++生成此类文档( .odt /。 doc )的?任何关于此的指针,链接和示例都是受欢迎的。

4 个答案:

答案 0 :(得分:8)

我是通过Qt方式完成的。即使用ActiveQt模块。

MS Word 的参考文档可以通过

获得

MSDN documentation,它实际指向具有MS Word ActiveX API的VBAWD10.chm文件。

可以通过

初始化Word应用程序
QAxWidget wordApplication("Word.Application"); 

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

获得
QAxBase::querySubObject()

例如:

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

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

QVariant QAxBase::asVariant () const

任何涉及word对象的函数调用都可以使用函数

调用
 QAxBase::dynamicCall ()

例如:

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

经过相当多的斗争和很少的说服力,它运作良好。 :)

希望对那些寻求类似解决方案的人有帮助......

答案 1 :(得分:1)

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

答案 2 :(得分:1)

你检查了这个reference here on SO on Reading .docx in C++吗?它应该指向正确的方向。

答案 3 :(得分:0)

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