CLSIDFromProgID(L"Excel.Application", &clsid) 使用WIN32 API 读取Excel表格
时间: 2023-12-25 20:06:58 浏览: 362
CLSIDFromProgID() 函数是用于获取指定程序的 CLSID 的 Win32 API 函数,它的参数是程序的 ProgID,即程序的注册名称。在这里,使用 CLSIDFromProgID() 函数获取 Excel 应用程序的 CLSID,然后可以使用该 CLSID 创建 Excel 应用程序的 COM 对象,进而操作 Excel 表格。
以下是一个使用 Win32 API 读取 Excel 表格的示例代码:
```c++
#include <Windows.h>
#include <ObjBase.h>
#include <atlbase.h>
#include <atlcomcli.h>
#include <Excel.h>
int main() {
// 初始化 COM 库
CoInitialize(NULL);
// 获取 Excel 应用程序的 CLSID
CLSID clsid;
HRESULT hr = CLSIDFromProgID(L"Excel.Application", &clsid);
if (FAILED(hr)) {
// 处理获取 CLSID 失败的情况
return -1;
}
// 创建 Excel 应用程序的 COM 对象
CComPtr<IDispatch> pExcelApp;
hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER,
IID_IDispatch, (void**)&pExcelApp);
if (FAILED(hr)) {
// 处理创建 COM 对象失败的情况
return -1;
}
// 获取 Workbooks 对象
CComVariant vWorkbooks;
hr = pExcelApp->GetIDsOfNames(IID_NULL, L"Workbooks", 1, LOCALE_USER_DEFAULT,
&vWorkbooks);
if (FAILED(hr)) {
// 处理获取 Workbooks 对象失败的情况
return -1;
}
CComVariant vEmpty;
DISPPARAMS dp = {NULL, NULL, 0, 0};
CComVariant vResult;
hr = pExcelApp->Invoke(vWorkbooks.lVal, IID_NULL, LOCALE_USER_DEFAULT,
DISPATCH_PROPERTYGET, &dp, &vResult, NULL, NULL);
if (FAILED(hr)) {
// 处理获取 Workbooks 对象失败的情况
return -1;
}
CComPtr<IDispatch> pWorkbooks;
pWorkbooks = vResult.pdispVal;
// 打开 Excel 表格
CComVariant vFilename(L"C:\\test.xlsx");
CComVariant vReadOnly(false);
hr = pWorkbooks->Invoke(DISPID_VALUE, IID_NULL, LOCALE_SYSTEM_DEFAULT,
DISPATCH_METHOD, &dp, &vResult, NULL, NULL);
if (FAILED(hr)) {
// 处理打开 Excel 表格失败的情况
return -1;
}
CComPtr<IDispatch> pWorkbook;
pWorkbook = vResult.pdispVal;
// 获取 Worksheet 对象
CComVariant vWorksheets;
hr = pWorkbook->GetIDsOfNames(IID_NULL, L"Worksheets", 1, LOCALE_USER_DEFAULT,
&vWorksheets);
if (FAILED(hr)) {
// 处理获取 Worksheets 对象失败的情况
return -1;
}
CComVariant vIndex(1);
dp.rgvarg = &vIndex;
dp.cArgs = 1;
hr = pWorkbook->Invoke(vWorksheets.lVal, IID_NULL, LOCALE_USER_DEFAULT,
DISPATCH_PROPERTYGET, &dp, &vResult, NULL, NULL);
if (FAILED(hr)) {
// 处理获取 Worksheet 对象失败的情况
return -1;
}
CComPtr<IDispatch> pWorksheet;
pWorksheet = vResult.pdispVal;
// 获取单元格的值
CComVariant vRange(L"A1");
hr = pWorksheet->Invoke(0x6c, IID_NULL, LOCALE_USER_DEFAULT,
DISPATCH_PROPERTYGET, &dp, &vResult, NULL, NULL);
if (FAILED(hr)) {
// 处理获取单元格的值失败的情况
return -1;
}
CComVariant vValue;
vValue = vResult;
// 输出单元格的值
wprintf(L"%s\n", vValue.bstrVal);
// 关闭 Excel 应用程序
dp.rgvarg = NULL;
dp.cArgs = 0;
hr = pExcelApp->Invoke(DISPID_APP_CLOSE, IID_NULL, LOCALE_SYSTEM_DEFAULT,
DISPATCH_METHOD, &dp, NULL, NULL, NULL);
// 释放 COM 对象
pWorksheet.Release();
pWorkbook.Release();
pWorkbooks.Release();
pExcelApp.Release();
// 反初始化 COM 库
CoUninitialize();
return 0;
}
```
注意:上述示例代码使用了 ATL(Active Template Library)和 C++ COM,所以需要添加 ATL 头文件并链接 ATL 库才能编译通过。如果没有使用 ATL 或者 C++ COM,可以使用纯 Win32 API 和 C COM 实现相同的功能。
阅读全文