Генерация текстовых документов (.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++? Любые указатели, ссылки, примеры по этому поводу приветствуются.
3 ответа
Я сделал это через Qt
путь. т.е. используя ActiveQt
модуль.
Справочную документацию по MS Word можно получить,
Документация MSDN, которая фактически указала на VBAWD10.chm
файл, который имеет ActiveX API для MS Word.
Приложение Word может быть инициализировано
QAxWidget wordApplication("Word.Application");
Подобъекты приложения слова могут быть получены с помощью функции,
QAxBase::querySubObject()
Например:
QAxObject *activeDocument = wordApplication.querySubObject("ActiveDocument");
Чтобы передать полученный подобъект в качестве аргумента,
QVariant QAxBase::asVariant () const
Любые вызовы функций, включающие слово object, могут быть вызваны с использованием функции
QAxBase::dynamicCall ()
Например:
activeDocument->dynamicCall("Close(void)");
После довольно большого количества борьбы и нескольких убеждений все работает нормально.:)
Надеюсь, это поможет тем, кто ищет аналогичные решения...
Вы проверили эту ссылку здесь на SO на чтение.docx в C++? Это должно указать вам в правильном направлении.
Может быть, вы можете использовать это и записать в файл в формате odf http://doc.trolltech.com/4.6/qtextdocumentwriter.html qt не знает, как вывести doc docx и т. д., но вы можете использовать com(activeQt) или некоторые другие другая библиотека для записи в тех или иных нужных вам форматах
Для меня лучший способ автоматизации приложений 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 += Stackru 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;
}