我正在使用Qt 4.5.3和Windows XP。我需要我的应用程序来生成包含正在使用和生成的信息的文档。正在使用的信息只是字符串(QString
更具体),正在生成的信息也将是字符串和图像。
我希望文档是MS Word文档(.doc
)或者可以是开放文档格式(.odt
)我还希望使用字体,图像,表格来格式化文档数据,一些背景颜色和所有。
我使用QTextDocument
,QTextCursor
和QPrinter
创建了 PDF 文件。但是当我尝试为 odt 应用相同的QTextDocument
时,我最终只得到了格式错误。
有没有办法使用任何其他使用C ++的库生成此类文档?您是如何使用C ++生成此类文档( .odt /。 doc )的?任何关于此的指针,链接和示例都是受欢迎的。
答案 0 :(得分:8)
我是通过Qt
方式完成的。即使用ActiveQt
模块。
MS Word 的参考文档可以通过
获得 MSDN documentation,它实际指向具有MS Word ActiveX API的VBAWD10.chm
文件。
可以通过
初始化Word应用程序QAxWidget wordApplication("Word.Application");
单词应用程序的子对象可以通过函数
获得QAxBase::querySubObject()
例如:
QAxObject *activeDocument = wordApplication.querySubObject("ActiveDocument");
将获取的子对象作为参数传递,
QVariant QAxBase::asVariant () const
任何涉及word对象的函数调用都可以使用函数
调用 QAxBase::dynamicCall ()
例如:
activeDocument->dynamicCall("Close(void)");
经过相当多的斗争和很少的说服力,它运作良好。 :)
希望对那些寻求类似解决方案的人有帮助......
答案 1 :(得分:1)
也许你可以使用它并写入odf格式的文件http://doc.trolltech.com/4.6/qtextdocumentwriter.html#supportedDocumentFormats qt不知道如何输出doc docx等但你可以使用com(activeQt)或其他一些库来编写这些或其他格式你需要
答案 2 :(得分:1)
你检查了这个reference here on SO on Reading .docx in C++吗?它应该指向正确的方向。
答案 3 :(得分:0)
对我来说,使Office应用程序自动化的一种更好的方法是将对象模型从MS Word COM类型库导入C ++项目。这与Outlook应用程序的Qutlook Example非常相似。如果需要,可以使用oleview.exe将技术外推到Excel和PowerPoint,以获得库Guid。 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 += 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;
}