gpt4 book ai didi

c++ - 如何在Windows的Qt中使用QAxObject创建docx和doc文件?

转载 作者:行者123 更新时间:2023-12-01 14:58:14 25 4
gpt4 key购买 nike

我想使用QAxObject创建一个新的docx文件。如何创建新的docdocx文件,并在Windows的QAxObject中用qt编写文本。我尝试使用此代码,但找不到答案,因为它打开了现有文件,但是我想创建一个新文件并使用QAxObject

QString     outFile("C:/test.docx");
QString inFile1("C:/test1.docx");
QString inFile2("C:/test2.docx");
QAxObject axObject("Word.Application");
QAxObject *documents = axObject.querySubObject("Documents");
QAxObject *document = documents->querySubObject("Open(const QString&, bool)", inFile1, true);
QAxObject *selection = axObject.querySubObject("Selection");

selection->dynamicCall("EndKey(QVariant&)", 6); // WdUnits::wdStory=6
selection->dynamicCall("InsertBreak(QVariant&)", 7); // WdBreakType::wdPageBreak=7
selection->dynamicCall("InsertFile(QString&)", inFile2);

document->dynamicCall("SaveAs(const QString&)", outFile);
document->dynamicCall("Close()");
axObject.dynamicCall("Quit()");

最佳答案

SO中的此类问题已经存在一些answers,建议将QAxObjectdynamicCall()一起用于MS Office自动化。可以做到这一点,并且会奏效,但是我认为有一种更好,更有趣的方法。

我的建议是导入每个Office应用程序随附的COM类型库,生成一个C++对象模型。这有两个优点:与C#和VB.NET中流行的互操作方法相似,甚至这些语言的示例也可以用作我们自己的Qt项目的模型。当然,您可以在Qt Creator中享受自动补全的类和成员名称。我已经提到好玩了吗?

这与ActiveQt示例中包含的Outlook应用程序的Qutlook Example非常相似。除了在应用程序的.pro文件中添加TYPELIBS变量外,documentation并不能说明什么。转换由Qt bin目录中的 dumpcpp.exe utility执行。这是一个导入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和 header 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格式,然后以与Word 97/2003兼容的DOC格式。

完整的项目可以在 GitHub repository中找到。

关于c++ - 如何在Windows的Qt中使用QAxObject创建docx和doc文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59747787/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com