QT word集成

DSOFramer

dsoframer是微软提供一款开源的用于在线编辑、调用Word、 Excel 、PowerPoint等的ActiveX控件。

1.官方有Dsoframer 1.3,支持Office2003和2007,也有远程保存的方法,但这个远程保存方法要求远程服务器的 HTTP 支持 Microsoft FrontPage Server Extensions (FPSE) 或 Web 分发创作和版本控制 (WebDAV) 协议扩展,有点不现实。
2.网上广为流传的还有Dsoframer 2.2.1.2,该控件支持HttpPost远程保存,但不支持Office 2007.
3.Dsoframer 2.3.0.0,这个是网上改的2.2.1.2版使其支持Office 2007。

注册使用

1、下载dsoframer.ocx文件。
2、在32位Windows操作系统中,将dsoframer.ocx组件复制到C:\Windows\System32目录,并使用regsvr32命令注册(命令行要以管理员身份运行,否则会报0x80070005错误)。
3、在64位Windows操作系统中,将dsoframer.ocx组件复制到C:\Windows\SysWOW64目录,并使用regsvr32命令注册(同上)。

regsvr32 C:\Windows\SysWOW64\dsoframer.ocx

4、在Visual Studio中,将调用DSOFramer组件项目的编译选项中的目标CPU设置为x86。
Dsoframer控件的下载及注册

ActiveX控件dsoFramer的使用(word、excel、PPT)
https://github.com/stone0090/OfficeTools.OnlineEditWord

Dumpcpp + Word

The dumpcpp Tool (ActiveQt)

F:\Qt\Qt5.12.9\5.12.9\msvc2017_64\bin路径中打开CMD:

dumpcpp.exe "\WebOffice\WebOffice\ocx\WebOffice.ocx" -o DWebOffice
dumpcpp.exe "F:\Program Files\LibreOffice\program\so_activex.dll" -o DLibreOffice
dumpcpp.exe {F1924D0C-9B35-4A46-BCDE-CFEF2CE67A17}

dumpcpp.exe无法处理64位程序的CLSID。需找到dumpcpp源码\Src\qtactiveqt\tools\dumpcpp,修改源码,填写参数后,再编译运行生成.cpp、.h。
在这里插入图片描述
利用Qt调用ocx插件接口,并使用dumpcpp生成.h和.cpp接口文件

Micorsoft WORD CLSID查看

  1. 使用工具RegDllView.exe(或oleview.exe)。
  2. 找到WINWORD.EXE中Word.Document即可找到对应的GUID。
    在这里插入图片描述

C++\QT & Word

Microsoft: Bookmarks object (Word)
Word 解决方案
Microsoft.Office.Interop.Word 命名空间

  1. 在QT项目中包含ActiveQt模块,使用ActiveQt框架中的QAxContainer模块:QT += axcontainer
    1.1 QAxContainer模块允许我们使用COM对象并且可以在Qt应用程序中嵌入QActive控件。
    1.2 QAxServer模块允许我们导出使用Qt编写的自定义的COM对象和Active控件。

  2. 在项目在头文件中包含QAxWidget和QAxObject。
    QAxBase:抽象类,提供初始化及访问com对象的接口(相关的附加依赖项 Qt5AxContainer.lib Qt5AxServer.lib Qt5AxBase.lib)。
    QAxObjectQAxWidget 是QAxBase的子类。
    QAxObject:是包含com对象的QObject。可以用来操作Word\Excel等。
    QAxWidget:是包含ActiveX控件的QWidget。

  3. QT ui中添加QAxWidget控件。
    在这里插入图片描述

  4. 右键点击拖放的QAxWidget控件,选择“设置控件”。
    在这里插入图片描述

  5. 打开word文档

QAxObject* officeDocument = new QAxObject("DSOFramer.DsoFramerControl", this);
officeDocument->setControl("Word.Document");
officeDocument->dynamicCall("SetApplication(const QString&)", "Microsoft Word"); // 指定打开Word文档时使用的应用程序
officeDocument->dynamicCall("Open(const QString&)", "your_file_path");

// 将dsoframer控件添加到窗口中
QWidget* widget = QWidget::createWindowContainer(officeDocument, this);
setCentralWidget(widget);

// 自动打开
officeDocument->dynamicCall("Activate");
  1. 获取exception
QAxObject *m_pApp;
connect(m_pApp, SIGNAL(exception(int, QString, QString, QString)), this, SLOT(slots_exception(int, QString, QString, QString)));

void DWorldImp2010::slots_exception(int code, const QString &source, const QString &desc, const QString &help)
{
	QString strError = QString("Error[%1]: %2 %3 %4").arg(source).arg(code).arg(desc).arg(help);
	qDebug() << strError;
}

Qt 使用QAxObject 访问 Word 异常问题 — 持续更新中

Problem

QAxObject无法识别

1.在.pro文件添加QT += axcontainer
2.在.cpp文件下加载#include <ActiveQt/QAxObject>
3.点击扩展->QT VS Tool-> Qt Project Settings -> Qt Model,勾选ActiveQt container模块即可
VS2019:无法打开源文件 ‘QAxObject‘“的错误解决办法

close()报错:此方法或属性无效,因为 此文档在另一应用程序中

在这里插入图片描述
在这里插入图片描述

Word开发工具

打开word【开发工具】选项卡
在这里插入图片描述

录制宏(获取函数)

Qt对word文档操作总结

API文档生成

// QAxObject* word = new QAxObject("Word.Application", 0);
QAxObject* word = new QAxObject("Word.Document");
QFile file("C:\\fff.html");
file.open(QIODevice::WriteOnly | QIODevice::Text);
QTextStream out(&file);
out << word->generateDocumentation();
file.close();

Using ActiveX Object in Qt

COM组件

COM:Component Object Modal,组件对象模型。

作用

COM的最大特点:复用。

在WINDOWS中,把DLL放置在一些公共位置(WINDOWS下的SYSTEM32中)也能达到复用,但是,如果把DLL放置在应用文件夹中,则可以被优先使用,容易导致问题。

COM注册:通过注册,定义COM对象的统一入口(通常是一个GUID),所有的应用里使用这个COM的时候,其实都是使用这个GUID的。

COM的GUID:并非是唯一的,只是说,提供的服务接口是唯一的,因为的COM不同版本可能会有不同的GUID,此时,这个COM的服务GUID就用于指明具体实现COM的GUID(或DLL/OCX文件)。

COM注册的行为:登记COM的GUID信息,同时指明这个COM的GUID指向的实际的模块(DLL/OCX)文件或版本GUID。

COM编程(COM组件生成、运行)

QT - QT中的COM编程(exe进程外组件形式)

ActiveX控件以exe形式发布可以不需要注册,在启动时加上-activex参数告诉它以提供COM服务的形式启动。

windows com指针

如何:创建和使用 CComPtr 和 CComQIPtr 实例

其它参考

QAxWidget 打开word、pdf、excel、ppt

Qt学习笔记:清除用QAxObject创建的Office进程
QT在子线程中使用QAxWidget需要初始化COM的问题

C++/Qt 和 Word,Excel,PDF 交互总结
Using ActiveX controls and COM in Qt
Category:Developing with Qt

dsoframer

DsoFramer_KB311765_x86.exe下载

DSO(dsoframer)的接口文档
DSOFramer 控件修改
DSOframer 微软官方API的查阅方法

C#: Use dsoframer.ocx control to achieve embedded office effect (detailed explanation)
C#:使用dsoframer.ocx控件实现内嵌office效果(详解)

原生ActiveX控件

m_pReportAxWnd = new DReportAxWnd(this);
ui.gridLayout_report->addWidget(m_pReportAxWnd);

// DReportAxWnd.cpp
QGridLayout *layout = new QGridLayout(this);
m_pReportAxWidget = new QAxWidget("Word.Application");
layout->addWidget(m_pReportAxWidget);
m_pReportAxWidget->setControl("E://11111.doc");
// 失败
QGridLayout *layout = new QGridLayout(this);
m_pReportAxWidget = new QAxWidget("Word.Application", this);
m_pReportAxWidget->dynamicCall("Documents.Open(const QString&)", m_strReportPath);
layout->addWidget(m_pReportAxWidget);

其它方案

WebOffice

webbrowser

Office OCX

间接嵌入浏览器

Qt窗体中嵌入office文档的新方法

通过进程打开后,嵌入QT

Qt窗口内嵌Word,PPT,Excel

如何在的Qt项目中嵌入word,excel,ppt窗口

LibOffice \ OpenOffice

Disphelper进行OpenOffice自动化

NTKO

IWebOffice

SOAOffice

Microsoft.Office.Interop

有谁知道类似pageoffice的 集成office控件?
WEB网站类型系统中使用的OFFICE控件-破解Ntko-Office

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值