当前位置:   article > 正文

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

word 接口

使用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_rename

using 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;

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61

参考文档:
· 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 应用程序的 CLSID
	hr = 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 属性的 DISPID
		hr = 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;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/人工智能uu/article/detail/825708
推荐阅读
相关标签
  

闽ICP备14008679号