C++操作Word 使用Microsoft Office提供的COM接口

使用Office Automation,开发者可以利用编程语言(如Visual Basic for Applications(VBA)、C#、Python等)来与Office应用程序进行交互。这些编程语言提供了丰富的API(应用程序编程接口),允许开发者操作文档、工作表、幻灯片等各种对象,以及执行各种操作,比如创建、读取、修改和删除内容。

示例:创建一个新的Word文档,向其中插入了一行文本,然后将文档保存为"example.docx"

#include <windows.h>
#include <iostream>#import "C:\Program Files\Microsoft Office\Root\VFS\ProgramFilesCommonX64\Microsoft Shared\OFFICE16\MSO.dll"
using namespace Office;
#import "C:\Program Files\Microsoft Office\root\Office16\MSWORD.OLB" raw_native_types auto_rename
#import "C:\Program Files\Microsoft Office\root\Office16\MSPPT.OLB" raw_native_types
#import "C:\Program Files\Microsoft Office\root\Office16\EXCEL.EXE" raw_native_types auto_renameusing namespace std;
int main() {// 初始化COM库HRESULT hr = CoInitialize(NULL);if (FAILED(hr)) {cout << "Failed to initialize COM library" << endl;return 1;}try {// 创建 Word 应用程序对象Word::_ApplicationPtr pWordApp;hr = pWordApp.CreateInstance(__uuidof(Word::Application));if (FAILED(hr)) {cout << "Failed to create Word application instance" << endl;return 1;}// 设置可见性pWordApp->Visible = VARIANT_TRUE;// 添加新文档Word::DocumentsPtr pDocs = pWordApp->Documents;Word::_DocumentPtr pDoc = pDocs->Add();// 在文档中插入文本Word::RangePtr pRange = pDoc->Content;pRange->Text = _bstr_t("Hello, World from C++ using Microsoft Office Automation!");// 保存文档_variant_t filename("D:\\example.docx");pDoc->SaveAs(&filename);// 关闭文档pDoc->Close();// 退出 Word 应用程序pWordApp->Quit();}catch (_com_error& e) {cout << "COM Error: " << e.ErrorMessage() << endl;CoUninitialize();return 1;}// 释放COM库CoUninitialize();return 0;}

参考文档:
· What is the correct, modern, c++ to call the Office automation COM APIs

还有一种不用import库的方式

#include <iostream>
#include <windows.h>
#include <atlbase.h>
#include <atlcom.h>int main() {// 初始化 COM 库HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);if (FAILED(hr)) {std::cerr << "Failed to initialize COM library" << std::endl;return 1;}// 创建 Word 应用程序对象指针IDispatch* pWordApp = NULL;CLSID clsWordApp;// 获取 Word 应用程序的 CLSIDhr = CLSIDFromProgID(L"Word.Application", &clsWordApp);if (FAILED(hr)) {std::cerr << "Failed CLSIDFromProgID" << std::endl;CoUninitialize();return 1;}// 创建 Word 应用程序实例hr = CoCreateInstance(clsWordApp, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void**)&pWordApp);if (FAILED(hr)) {std::cerr << "Failed to create Word application instance" << std::endl;CoUninitialize();return 1;}// 获取文档集合对象IDispatch* pDocuments = NULL;{DISPPARAMS params = { NULL, NULL, 0, 0 };VARIANT result;VariantInit(&result);DISPID dispid;CComBSTR methodName = L"Documents";// 获取 Documents 属性的 DISPIDhr = pWordApp->GetIDsOfNames(IID_NULL, &methodName, 1, LOCALE_SYSTEM_DEFAULT, &dispid);if (SUCCEEDED(hr)) {// 调用 Documents 属性获取文档集合对象hr = pWordApp->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET, &params, &result, NULL, NULL);if (SUCCEEDED(hr)) {pDocuments = V_DISPATCH(&result);}}}// 获取文档数量long docCount = 0;if (pDocuments != NULL) {{DISPID dispid;CComBSTR szMember = L"Count";hr = pDocuments->GetIDsOfNames(IID_NULL, &szMember, 1, LOCALE_USER_DEFAULT, &dispid);if (SUCCEEDED(hr)) {VARIANT result;VariantInit(&result);DISPPARAMS dispParams = { NULL, NULL, 0, 0 };hr = pDocuments->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, &dispParams, &result, NULL, NULL);if (SUCCEEDED(hr)) {docCount = V_I4(&result);}}}}// 打印文档数量std::cout << "Number of open Word documents: " << docCount << std::endl;// 释放 COM 对象if (pDocuments != NULL)pDocuments->Release();if (pWordApp != NULL)pWordApp->Release();// Uninitialize COM 库CoUninitialize();std::cout << "The End" << std::endl;return 0;
}

无论哪种方式都只能获取程序中打开的word文档数量,无法获取手动打开的word文档数量。
第2种方法,只是在后台运行,即使代码中加入word可见的设置,依然无法看到word界面。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/803926.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python代码识别minist手写数字【附pdf】

一、概述 对于人类而言&#xff0c;要识别图片中的数字是一件很容易的事情&#xff0c;但是&#xff0c;如何让机器学会理解图片上的数字&#xff0c;这似乎并不容易。那么&#xff0c;能否找出一个函数&#xff08;模型&#xff09;&#xff0c;通过输入相关的信息&#xff0…

CentOS7.9.2009设置elasticsearch7.11.1开机自启动

前提:root用户登录CentOS服务器 1.进入/etc/systemd/system目录 命令: cd /etc/systemd/system [root@elasticsearch ~]# cd /etc/systemd/system [root@elasticsearch system]# pwd /etc/systemd/system [root@elasticsearch system]# 2.创建elasticsearch启动文件。E.g…

网络基础三——IP协议补充和Mac帧协议

全球网络及网段划分的理解 ​ 根据国家组织地区人口综合评估进行IP地址范围的划分&#xff1b; ​ 假设前8位用来区分不同的国家&#xff0c;国际路由器负责全球数据传输&#xff0c;子网掩码为IP/8&#xff1b;次6位区分不同的省份&#xff0c;国内路由器负责全国数据的传输…

jvm调优案例分析-window通过jstack查找死锁的进程

我们经常会遇到java程序遇死锁的问题&#xff0c;也会经常遇到。 案例 以下是案例代码&#xff1a; package com.dzend.mall.order;public class JstackLockDemo {public static final int initData 666;public static User user new User();public int compute(){int a1;i…

汽车传感器介绍

汽车中有各种类型的传感器&#xff0c;它们用于监测和控制车辆的各个方面。以下是一些常见的汽车传感器及其功能介绍&#xff1a; 车速传感器&#xff1a;车速传感器用于监测车辆的速度。它们可以采用不同的技术&#xff0c;如磁性传感器或光学传感器&#xff0c;以测量车轮的转…

对CryptoDriver里密钥格式定义的探索(2)

目录 1.概述 2.开始分析 2.1 公钥的PEM解析 2.2 私钥的PEM解析 3 小结 1.概述 我们简单描述了PEM格式,但是引出了ASN,1的问题,所以下片文章,我继续分析,并将pem格式解析出来 什么是AS

Git汇总

目录 1&#xff0c;查看分支 &#xff08;1&#xff09;查看本地分支 &#xff08;2&#xff09;查看远程分支 (3&#xff09;查看所有分支 1&#xff0c;查看分支 &#xff08;1&#xff09;查看本地分支 git branch&#xff08;2&#xff09;查看远程分支 git branch -r…

java中可变参数和简单游戏

可变参数&#xff1a; 就是一种特殊形参&#xff0c;定义在方法&#xff0c;构造器的形参列表中&#xff0c;格式是&#xff1a;数据类型...参数名称 可变参数的好处&#xff1a; 灵活的接收数据 特点&#xff1a;可以不传数据给它&#xff0c;可以传一个数据或者多个数据给它…

Explain SQL 诊断和性能分析策略等问题

EXPLAIN SQL诊断和性能分析策略 问题1&#xff1a;请解释EXPLAIN命令在MySQL中的作用&#xff0c;并列举其主要输出列的含义。 答案1&#xff1a;EXPLAIN命令用于分析MySQL如何执行SQL查询语句&#xff0c;帮助开发者理解查询的执行计划&#xff0c;从而进行性能优化。其主要…

Window安装PostgresSQL

PostgreSQL 安装参考&#xff1a;Windows下安装PostgreSQL_window 安装postgresql-CSDN博客 安装好后打开pgAdmin4 配置Navicat连接PostgresSQL 找到安装目录文件 pg_hba.conf 修改配置增加&#xff1a; 修改前&#xff1a; # TYPE DATABASE USER ADDRES…

登录压力测试

目录 一、准备测试数据 1.1数据库存储过程添加数据 1.2导出为csv作为测试数据&#xff08;账号、密码&#xff09; 二、使用fiddler抓包查看接口 2.1.抓到相关接口信息 2.2添加线程组和http请求 2.3将前面接口需要的参数去json格式化 ​2.4填写相关信息 ​ 2.5添加http…

vue canvas绘制信令图,动态显示标题、宽度、高度

需求: 1、 根据后端返回的数据&#xff0c;动态绘制出信令图 2、根据 dataStatus 返回值&#xff1a; 0 和 1&#xff0c; 判断 文字内容的颜色&#xff0c;0&#xff1a;#000&#xff0c;1&#xff1a;red 3.、根据 lineType 返回值&#xff1a; 0 和 1&#xff0c; 判断 箭…

20240309web前端_第三周作业_教务系统页面

作业&#xff1a;教务系统页面 成果展示&#xff1a; 完整代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1…

ubuntu 部署redis

Redis redis官网地址&#xff1a;http://www.redis.io/ 所有历史版本下载地址&#xff1a;http://download.redis.io/releases/ redis中文文档地址&#xff1a;http://www.redis.cn/documentation.html Linux安装部署Redis_linux redis安装部署-CSDN博客 Linux下Redis的安…

深入理解Python中的生成器与迭代器:概念、区别与实战应用

深入理解Python中的生成器与迭代器&#xff1a;概念、区别与实战应用 开篇 在Python编程世界中&#xff0c;生成器&#xff08;Generators&#xff09;和迭代器&#xff08;Iterators&#xff09;是两个核心概念&#xff0c;它们在处理大型数据集、节省内存以及实现高效循环结…

Verilog实现手表计时

实现手表的计时功能&#xff1a; 1.具有start启动信号、pause暂停信号&#xff0c;可以自定义其触发机制。 2.具有时间更改接口&#xff0c;可以更改时、分、秒。 3.输出时、分、秒。 Verilog设计 模块端口定义&#xff1a; module watch1(input wire clk …

STC89C52学习笔记(七)

STC89C52学习笔记&#xff08;七&#xff09; 综述&#xff1a;本文介绍了串口以及讲述了串口相关寄存器如何配置并给予相关代码。 一、修改代码注意事项 在修改代码时不要一次性加入一堆代码&#xff0c;不利于定位错误。可以先注释一些代码&#xff0c;待解决完毕问题后再…

Angular 使用DomSanitizer

跨站脚本Cross-site scripting 简称XSS&#xff0c;是代码注入的一种&#xff0c;是一种网站应用程序的安全漏洞攻击。它允许恶意用户将代码注入到网页上&#xff0c;其他用户在使用网页时就会收到影响&#xff0c;这类攻击通常包含了HTML和用户端脚本语言&#xff08;JS&…

ES6基础(JavaScript基础)

本文用于检验学习效果&#xff0c;忘记知识就去文末的链接复习 1. ECMAScript介绍 ECMAScript是一种由Ecma国际&#xff08;前身为欧洲计算机制造商协会&#xff0c;英文名称是European Computer Manufacturers Association&#xff09;通过ECMA-262标准化的脚本程序设计语言…

基于拉格朗日分布算法的电动汽车充放电调度MATLAB程序

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 程序简介 该模型主要做的是基于拉格朗日分布算法的电动汽车充放电调度模型。利用蒙特卡洛模拟法模拟出电动汽车负荷曲线&#xff0c;并求解出无序充电功率曲线和有序充电曲线&#xff0c;该模型在电动汽车个…