在通过 IDispatch
接口获取 Excel 单元格的显示文本(即格式化后的内容,而非原始值)时,需要访问 Text
属性而非 Value
或 Value2
。以下是完整的实现步骤和代码示例:
#include <windows.h>
#include <oleauto.h>
#include <comdef.h>
#include <string>
// 辅助函数:动态调用COM方法/属性
HRESULT AutoWrap(int autoType, VARIANT* pvResult, IDispatch* pDisp, LPOLESTR ptName, int cArgs, ...) {
va_list marker;
va_start(marker, cArgs);
DISPID dispID;
HRESULT hr = pDisp->GetIDsOfNames(IID_NULL, &ptName, 1, LOCALE_USER_DEFAULT, &dispID);
if (FAILED(hr)) return hr;
DISPPARAMS dp = { NULL, NULL, 0, 0 };
VARIANT* pArgs = new VARIANT[cArgs + 1];
for (int i = 0; i < cArgs; i++) {
pArgs[i] = va_arg(marker, VARIANT);
}
dp.cArgs = cArgs;
dp.rgvarg = pArgs;
if (autoType & DISPATCH_PROPERTYPUT) {
dp.cNamedArgs = 1;
DISPID dispidNamed = DISPID_PROPERTYPUT;
dp.rgdispidNamedArgs = &dispidNamed;
}
hr = pDisp->Invoke(dispID, IID_NULL, LOCALE_USER_DEFAULT, autoType, &dp, pvResult, NULL, NULL);
delete[] pArgs;
va_end(marker);
return hr;
}
// 获取单元格显示文本
std::wstring GetExcelCellText(IDispatch* pRange) {
VARIANT result;
VariantInit(&result);
// 调用Text属性获取显示文本
HRESULT hr = AutoWrap(DISPATCH_PROPERTYGET, &result, pRange, L"Text", 0);
if (SUCCEEDED(hr) && result.vt == VT_BSTR) {
return std::wstring(result.bstrVal);
}
return L"";
}
// 示例:获取活动单元格的显示文本
std::wstring GetActiveCellText() {
CoInitialize(NULL);
std::wstring text;
IDispatch* pExcel = NULL;
CLSID clsid;
// 创建Excel实例
if (SUCCEEDED(CLSIDFromProgID(L"Excel.Application", &clsid)) &&
SUCCEEDED(CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void**)&pExcel))) {
VARIANT result;
VariantInit(&result);
// 获取活动单元格
IDispatch* pActiveCell = NULL;
if (SUCCEEDED(AutoWrap(DISPATCH_PROPERTYGET, &result, pExcel, L"ActiveCell", 0))) {
pActiveCell = result.pdispVal;
text = GetExcelCellText(pActiveCell);
pActiveCell->Release();
}
pExcel->Release();
}
CoUninitialize();
return text;
}
1. 关键步骤
-
获取单元格的
Text
属性
Text
属性返回的是单元格的显示内容(含数字格式、日期格式等)。 -
通过
IDispatch::Invoke
动态调用
使用DISPATCH_PROPERTYGET
调用方式获取属性值。 -
处理返回的
VARIANT
数据
将返回的BSTR
转换为可用字符串格式。
3. 关键点说明
(1) 属性对比
(2) 内存管理
-
使用
VariantInit
和VariantClear
管理VARIANT
变量 -
及时
Release
获取的IDispatch
对象 -
BSTR
内存由COM自动管理(无需手动释放)
(3) 错误处理
-
检查每个
AutoWrap
调用的HRESULT
-
验证返回的
VARIANT
类型(应为VT_BSTR
)
属性 | 返回内容 | 适用场景 |
---|---|---|
Text | 显示文本(含格式) | 获取用户看到的单元格内容 |
Value | 原始值(可能含格式转换) | 兼容旧版Excel |
Value2 | 原始值(无格式) | 数据计算 |