C++通过IDispatch接口清除Excel单元格内容的属性名咨询
清除Excel单元格内容的IDispatch调用方案
针对你的需求,有两种可行的方式通过IDispatch接口清除Excel单元格内容,对应不同的GetIDsOfNames参数设置:
方案一:复用Value属性设置空值
这种方式不需要修改GetIDsOfNames的目标名称,依然使用L"Value",只需将赋值的内容改为空字符串即可:
LPOLESTR ptName = L"Value"; DISPID dispID; xlCell->GetIDsOfNames(IID_NULL, &ptName, 1, LOCALE_USER_DEFAULT, &dispID); LCID lcid = GetUserDefaultLCID(); // 设置为空字符串 std::wstring cellVal = L""; VARIANT vArgArray[1]; vArgArray[0].vt = VT_BSTR; vArgArray[0].bstrVal = SysAllocString(cellVal.c_str()); DISPID dispidNamed = DISPID_PROPERTYPUT; DISPPARAMS dp = {NULL, NULL, 0, 0}; dp.cArgs = 1; dp.rgvarg = vArgArray; dp.cNamedArgs = 1; dp.rgdispidNamedArgs = &dispidNamed; xlCell->Invoke( dispID, IID_NULL, lcid, DISPATCH_PROPERTYPUT, &dp, NULL, NULL, NULL); // 记得释放BSTR资源 SysFreeString(vArgArray[0].bstrVal);
方案二:调用ClearContents方法
这是Excel Range对象专门用于清除单元格内容的方法,此时需要将GetIDsOfNames的ptName设为L"ClearContents":
LPOLESTR ptName = L"ClearContents"; // 目标名称改为ClearContents DISPID dispID; xlCell->GetIDsOfNames(IID_NULL, &ptName, 1, LOCALE_USER_DEFAULT, &dispID); LCID lcid = GetUserDefaultLCID(); // 调用方法无需传入参数 DISPPARAMS dp = {NULL, NULL, 0, 0}; dp.cArgs = 0; dp.cNamedArgs = 0; xlCell->Invoke( dispID, IID_NULL, lcid, DISPATCH_METHOD, // 调用类型改为方法调用 &dp, NULL, NULL, NULL);
两种方式的区别:
- 方案一仅清空单元格的值,逻辑和你之前写入内容的操作一致;
- 方案二调用Excel原生清除方法,只会清除单元格的数值/文本内容,不会改动单元格格式(如字体、颜色等),更贴合“清除内容”的语义。
内容的提问来源于stack exchange,提问作者Prabal Kajla
相关产品推荐
相关产品推荐

