Генерация текстовых документов (.doc / .odt) через C ++ / Qt

Я использую Qt 4.5.3 и Windows XP. Мне нужно мое приложение для создания документов, содержащих информацию, которая используется и генерируется. Используемая информация будет представлять собой просто строки (QString, если быть более конкретным), а генерируемая информация будет также строками и изображениями.

Я хочу, чтобы документы были в формате MS Word (.doc) или могли быть в формате открытого документа (.odt). Также я хочу, чтобы документы были отформатированы с помощью шрифтов, изображений, таблиц данных, некоторых цветов фона и всего прочего .

Я создал файлы PDF, используя QTextDocument, QTextCursor и QPrinter. Но когда я попытался применить тот же QTextDocument для odt, у меня возникла ошибка форматирования.

Есть ли способ сгенерировать такие документы с помощью любых других библиотек, использующих C ++? Как вы, ребята, генерируете такие документы (.odt /. doc) на C ++? Любые указатели, ссылки, примеры по этому поводу приветствуются.


person liaK    schedule 05.07.2010    source источник


Ответы (3)


Я сделал это Qt способом. то есть с помощью модуля ActiveQt.

Справочную документацию по MS Word можно получить по адресу:

документация MSDN, которая фактически указала на VBAWD10.chm файл с API ActiveX для MS Word.

Приложение Word можно инициализировать с помощью

QAxWidget wordApplication("Word.Application"); 

Подобъекты слова application можно получить с помощью функции,

QAxBase::querySubObject()

Например:

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

Чтобы передать полученный подобъект в качестве аргумента,

QVariant QAxBase::asVariant () const

Любые вызовы функций, включающие объект слова, могут быть вызваны с помощью функции, использующей,

 QAxBase::dynamicCall ()

Например:

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

После неплохой борьбы и нескольких убеждений все работает нормально. :)

Надеюсь, это поможет тем, кто ищет похожие решения ...

person liaK    schedule 28.07.2010

возможно, вы можете использовать это и записать в файл в формате odf http://doc.trolltech.com/4.6/qtextdocumentwriter.html#supportedDocumentFormats qt не знает, как выводить doc docx и т. д., но вы можете использовать com (activeQt) или другую библиотеку для записи в тех или иных форматах, которые вам нужны.

person Olorin    schedule 05.07.2010

Для меня лучший способ автоматизации приложений Office - это импорт объектной модели из библиотеки типов COM MS Word в проект C ++. Это очень похоже на пример Qutlook для Приложение Outlook. Вы можете экстраполировать эту технику на 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;
}
person Former contributor    schedule 15.01.2020