通过 C++/Qt 生成 word 文档 (.doc/.odt)
Posted
技术标签:
【中文标题】通过 C++/Qt 生成 word 文档 (.doc/.odt)【英文标题】:Generating word documents (.doc/.odt) through C++/Qt 【发布时间】:2010-07-05 04:47:12 【问题描述】:我使用的是 Qt 4.5.3 和 Windows XP。我需要我的应用程序来生成包含正在使用和生成的信息的文档。正在使用的信息将只是字符串(更具体地说是QString
),并且正在生成的信息也将是字符串和图像。
我希望文档是 MS Word 文档 (.doc
) 或者可以是开放文档格式 (.odt
) 另外我希望文档使用 字体、图像、数据表等格式背景颜色和所有。
我已经使用QTextDocument
、QTextCursor
和QPrinter
创建了PDF 文件。但是,当我尝试为 odt 应用相同的 QTextDocument
时,我得到的只是格式错误。
有没有办法使用任何其他使用 C++ 的库来生成此类文档?你们如何使用 C++ 生成此类文档(.odt/.doc)?欢迎任何与此相关的指针、链接和示例。
【问题讨论】:
【参考方案1】:我是通过Qt
方式完成的。即使用ActiveQt
模块。
MS Word的参考文档可以通过以下方式获得,
MSDN documentation,它实际上指向了具有 MS Word 的 ActiveX api 的 VBAWD10.chm
文件。
Word 应用程序可以通过以下方式初始化
QAxWidget wordApplication("Word.Application");
word应用的子对象可以通过函数获取,
QAxBase::querySubObject()
例如:
QAxObject *activeDocument = wordApplication.querySubObject("ActiveDocument");
将获得的子对象作为参数传递,
QVariant QAxBase::asVariant () const
任何涉及单词对象的函数调用都可以使用函数using来调用,
QAxBase::dynamicCall ()
例如:
activeDocument->dynamicCall("Close(void)");
经过相当多的斗争和很少的说服,它工作正常。 :)
希望它对那些正在寻找类似解决方案的人有所帮助......
【讨论】:
【参考方案2】:也许您可以使用它并以 odf 格式写入文件 http://doc.trolltech.com/4.6/qtextdocumentwriter.html#supportedDocumentFormats qt 不知道如何输出 doc docx 等,但您可以使用 com(activeQt) 或其他一些库以您需要的那些或其他格式写入
【讨论】:
【参考方案3】:对我来说,自动化 Office 应用程序的更好方法是将对象模型从 MS Word COM 类型库导入 C++ 项目。这与 Outlook 应用程序的 Qutlook Example 非常相似。如果需要,您可以将该技术外推到 Excel 和 PowerPoint,使用 oleview.exe 获取库 Guids。 Here 是 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 += *** 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;
【讨论】:
以上是关于通过 C++/Qt 生成 word 文档 (.doc/.odt)的主要内容,如果未能解决你的问题,请参考以下文章
QTword文档操作实例——根据word模板生成word报表
QTword文档操作实例——根据word模板生成word报表
替换 Word 文档 QAxObject QT / C++ 中的字段值