【问题标题】:Generating word documents (.doc/.odt) through C++/Qt通过 C++/Qt 生成 word 文档 (.doc/.odt)
【发布时间】: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)?欢迎任何与此相关的指针、链接和示例。

【问题讨论】:

    标签: c++ qt ms-word odf


    【解决方案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;
        }
        

        【讨论】: