使用 VC++ (MFC/ATL) 通過 IDispatch 自動化 Excel,調用 Shapes.AddPicture 插入圖片,但圖片始終保持原始尺寸且位置固定在 A1 儲存格,無法通過參數控制。
Shape AddPicture(
Filename, LinkToFile, SaveWithDocument,
Left, Top, Width, Height, Anchor
)
參數說明:
Left, Top, Width, Height 類型為 float (VT_R4),單位為點。
Anchor 為可選 Range 對象,指定錨定儲存格區域。
代碼中將 Left/Top/Width/Height 封裝為 VT_R4 但賦值用 p4.iVal = 100 (iVal 是 short,對應 VT_I2),導致類型不匹配,Excel 忽略參數使用默認值。
VARIANT vLeft, vTop, vWidth, vHeight;
vLeft.vt = VT_R4; vLeft.fltVal = 100.0f; // 左邊距 100 點
vTop.vt = VT_R4; vTop.fltVal = 50.0f; // 頂邊距 50 點
vWidth.vt = VT_R4; vWidth.fltVal = 200.0f; // 寬度 200 點
vHeight.vt = VT_R4; vHeight.fltVal = 150.0f; // 高度 150 點
// 錨定區域(可選)
VARIANT vAnchor;
IDispatch* pRange = GetRange("E5:J10"); // 獲取 Range 對象
vAnchor.vt = VT_DISPATCH; vAnchor.pdispVal = pRange;
// 調用順序:Filename, LinkToFile, SaveWithDocument, Left, Top, Width, Height, Anchor
// 注意:AutoWrap 參數順序為逆序壓棧(最右參數最先放入數組)
AutoWrap(DISPATCH_METHOD, NULL, pShapes, L"AddPicture", 8,
vAnchor, vHeight, vWidth, vTop, vLeft,
vSaveWithDoc, vLinkToFile, vFilename);
LinkToFile 為 FALSE 表示嵌入圖片,TRUE 為鏈接。Shape 對象進一步微調屬性(LockAspectRatio, Rotation 等)。