前陣子在 Delphi.KTOP 看到一篇「請問 Excel AddSmartArt 第一個參數該怎麼設定」。
覺得操作 SmartArt 這點很有意思,這兩天才有時間認真看了這篇文章,一開始以為使用 Excel 的「錄製巨集」就可以搞定,但直覺認為回覆此內容時會得到「我早就已經知道」的結果。
因此決定一試 Excel 巨集功能,取得的 VBA 內容是:
Call ActiveSheet.Shapes.AddSmartArt(Application.SmartArtLayouts( _
"urn:microsoft.com/office/officeart/2005/8/layout/cycle1")).Select
就這麼短短一行,轉到 Delphi 上會是以下內容:
procedure TForm2.Button3Click(Sender: TObject);
var
ExcelApp,
ActiveSheet,
oSALayout: Variant;
begin
try
ExcelApp := CreateOleObject('Excel.Application');
except
ShowMessage('建立EXCEL錯誤');
end;
ExcelApp.Visible := True;
ExcelApp.WorkBooks.Add;
ActiveSheet := ExcelApp.ActiveSheet;
oSALayout := ExcelApp.SmartArtLayouts('urn:microsoft.com/office/officeart/2005/8/layout/hierarchy2');
ActiveSheet.Shapes.AddSmartArt(oSALayout, 50, 50, 200, 200);
end;
卻得到以下結果:
看來樓主的問題內容並沒有說明完整,就來看一下 Excel Developer Docs 怎麼描述 SmartArtLayouts:
文件也就這麼一點點,沒了。 再透過 Google 搜尋,沒有更多的資料,Delphi 似乎沒有人這樣做,【找不到成員】這問題難道就無解了嗎?
Google 沒有沒關係,Excel_TLB 單元來解答
利用 Excel 執行檔來製作最適合它的 Delphi 元件看來是最終解法,果不其然,答案在這裡:ExcelApplication 確實有 SmartArtLayouts 成員,接下來就是直接操作它,程式碼直接公開:
VBA 對 OLE 成員非常自由,Item 到底是什麼東西?經查詢的結果是:
微軟連自家軟體的工程師手冊都寫得如此破碎和簡短,也難怪這方面的開發資訊幾近沒有。
原本還要多寫些關於 SmartArt 賦值的內容,無奈再往下追盡是 Access Violation,使用 Excel_TLB 時必定會發生,Stack Overflow 這篇【Delphi - How to create Excel PivotChart】也遇到一模一樣的問題,雖無法找到原因,但改以 OLE 重新刻一次後卻可以解決問題。