Уже есть несколько ответов на подобные вопросы в SO, предполагающие использование QAxObject
с dynamicCall()
для автоматизации MS Office. Это может быть сделано, и это будет работать, но я думаю, что есть лучший и более интересный способ сделать это.
Мое предложение состоит в том, чтобы импортировать библиотеку типов COM, которая поставляется с каждым приложением Office, создавая С ++ объектная модель. Это имеет два преимущества: аналогично подходу взаимодействия, популярному в C# и VB. NET, и даже примеры для этих языков могут использоваться в качестве моделей для наших собственных проектов Qt. И, конечно, вы можете наслаждаться автозаполнением в Qt Creator для классов и имен членов. Я уже упоминал веселье?
Это очень похоже на Пример Qutlook для приложения Outlook, включенного в примеры ActiveQt. Документация ничего не говорит о большем, чем добавление переменной TYPELIBS
в файл .pro вашего приложения. Перевод выполняется утилитой dumpcpp.exe
, которую можно найти в каталоге Qt bin. Это простой программный проект командной строки, импортирующий объектную модель MS Word:
QT += widgets axcontainer
CONFIG += c++11 cmdline
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 += MSWord
} else {
SOURCES = main.cpp
}
Чтобы узнать GUID других библиотек типов, вы можете использовать утилиту oleview.exe
.
QMake создает исходный файл MSWORD.cpp
и заголовок MSWORD.h
, которые вы можете включить в свои собственные классы для доступа к сгенерированной объектной модели. Этот пример генерирует документ Word с нуля и сохраняет его в двух форматах:
#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;
}
Как видите, код достаточно читабелен, за счет включения большого куска кода. Вы #include
сгенерировали заголовок MSWORD.h
, и программа создает новый документ, заполняет его содержимое двумя текстовыми строками и сохраняет этот документ дважды: сначала в современном формате DOCX, а затем в формате, совместимом с DO C. со словом 97/2003.
Полный проект можно найти в этом GitHub репозитории .