IDispatch 接口获取 Excel 单元格的显示文本而不是原始值

在通过 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. 关键步骤

  1. 获取单元格的 Text 属性
    Text 属性返回的是单元格的显示内容(含数字格式、日期格式等)。

  2. 通过 IDispatch::Invoke 动态调用
    使用 DISPATCH_PROPERTYGET 调用方式获取属性值。

  3. 处理返回的 VARIANT 数据
    将返回的 BSTR 转换为可用字符串格式。

3. 关键点说明

(1) 属性对比
(2) 内存管理
  • 使用 VariantInit 和 VariantClear 管理 VARIANT 变量

  • 及时 Release 获取的 IDispatch 对象

  • BSTR 内存由COM自动管理(无需手动释放)

(3) 错误处理
  • 检查每个 AutoWrap 调用的 HRESULT

  • 验证返回的 VARIANT 类型(应为 VT_BSTR

属性返回内容适用场景
Text显示文本(含格式)获取用户看到的单元格内容
Value原始值(可能含格式转换)兼容旧版Excel
Value2原始值(无格式)数据计算
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值