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

Posted

技术标签:

【中文标题】通过 C++/Qt 生成 word 文档 (.doc/.odt)【英文标题】:Generating word documents (.doc/.odt) through C++/Qt 【发布时间】:2010-07-05 04:47:12 【问题描述】:

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

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

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

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

【问题讨论】:

【参考方案1】:

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

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

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

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

QAxWidget wordApplication("Word.Application"); 

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

QAxBase::querySubObject()

例如:

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

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

QVariant QAxBase::asVariant () const

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

 QAxBase::dynamicCall ()

例如:

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

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于通过 C++/Qt 生成 word 文档 (.doc/.odt)的主要内容,如果未能解决你的问题,请参考以下文章

QTword文档操作实例——根据word模板生成word报表

QTword文档操作实例——根据word模板生成word报表

QT中如何删除QTableView自动生成的数字序号列?

替换 Word 文档 QAxObject QT / C++ 中的字段值

通过Jasperreports生成word文档,生成出来的字体显示是“瀹嬩綋”,求指教啊!

通过QT查找Word中的关键字,并做高亮或删除操作