Generating word documents (.doc/.odt) through C++/Qt
Asked Answered
P

3

10

I am using Qt 4.5.3 and Windows XP. I need my application to generate documents that contains the information that is being used and generated. The information that is being used will be just strings (QString to be more specific) and the information that is being generated will be strings and images as well.

I want documents to be a MS word document (.doc) or can be an Open Document Format (.odt) Also I want the documents to be formatted with fonts,images, tables of data, some background colors and all.

I have done the creation PDF files using QTextDocument, QTextCursor and QPrinter. But when I tried to apply the same QTextDocument for odt, I ended up with just format error.

Is there a way to generate such documents using any other libraries that use C++? How you guys use to generate such documents (.odt/.doc) in C++? Any pointers, links, examples regarding this are welcome.

Proceeds answered 5/7, 2010 at 4:47 Comment(0)
P
10

I have done this through the Qt way. i.e by using ActiveQt module.

The reference documentation for MS Word can be obtained through,

MSDN documentation, which actually pointed to the VBAWD10.chm file that has the ActiveX apis for MS Word.

The Word Application can be initialized by

QAxWidget wordApplication("Word.Application"); 

The sub-objects of the word application can be obtained through the function,

QAxBase::querySubObject()

For e.g:

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

To pass the obtained sub-object as an argument,

QVariant QAxBase::asVariant () const

Any function calls involving the word object can be called using the function using,

 QAxBase::dynamicCall ()

For e.g:

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

After a quite good amount of struggle and few convinces, it's working fine. :)

Hope it helps for those who are all looking for similar solutions...

Proceeds answered 28/7, 2010 at 13:2 Comment(0)
O
1

maybe you can use this and write to a file in odf format http://doc.trolltech.com/4.6/qtextdocumentwriter.html#supportedDocumentFormats qt does not know how to output doc docx etc but you can use com(activeQt) or some other library to write in those or other formats you need

Operator answered 5/7, 2010 at 8:31 Comment(0)
B
0

For me, a better way of automating Office applications is importing the object model from the MS Word COM type library into the C++ project. This is very similar to the Qutlook Example for the Outlook application. You can extrapolate the technique to Excel and PowerPoint if you want, using oleview.exe to obtain the library Guids. Here is a complete project at GitHub.

The QMake project file :

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
}

The main.cpp source:

#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;
}
Bend answered 15/1, 2020 at 17:3 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.