2016-11-17 22 views
1

我使用Delphi Seattle在Excel(2013)中構建和顯示圖表。我從數據透視表建立我的圖表。圖表顯示一切正常。它有一個默認標題,所以我想改變它。這應該是一個簡單的屬性更改,但我不斷收到AV錯誤。當我谷歌,我可以找到最接近的事情提到,我需要選擇圖表和/或圖表標題之前,我改變它。 [已更新]以下是顯示問題的工作示例。Delphi - 在Excel中更改圖表標題導致AV - 更新完整樣本

procedure TForm1.Button1Click(Sender: TObject); 
var 
    oExcel : ExcelApplication; 
    RawDataSheet :_Worksheet; 
    myChart: Shape; 
begin 
    oExcel := CreateOleObject('Excel.Application') as ExcelApplication; 
    oExcel.Visible[LOCALE_USER_DEFAULT] := True; 

    // Add a New Workbook, with a single sheet 
    oExcel.Workbooks.Add(EmptyParam, LOCALE_USER_DEFAULT); 
    // Get the handle to the active Sheet, and insert some dummy data 
    RawDataSheet := oExcel.ActiveSheet as _Worksheet; 
    RawDataSheet.Range['A1', 'B10'].value2 := 10; 

    // Now add my chart 
    myChart := RawDataSheet.Shapes.AddChart2(208, xlColumnClustered, 200, 10, 300, 300, True); 

    // Try to access the Chart Title... This always AVs here. 
    myChart.Chart.HasTitle[LOCALE_USER_DEFAULT] := True; 

    // Set Title Text. If Comemnt out above line, this AVs as well 
    myChart.Chart.ChartTitle[LOCALE_USER_DEFAULT].Caption := 'New Chart Title'; 

end; 

我找不到任何方法來更改我的標題。我什至不能找到任何方式來閱讀現有的標題,更不用說改變它。

爲ChartTitle微軟對象模型文檔說,這是正確的屬性...(https://msdn.microsoft.com/en-us/library/office/ff840521.aspx

附加信息:我並生成自己的類型庫,Excel_TLB,和我有我的uses子句。我的完整使用條款是...

uses 
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, 
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, ComObj, Excel_TLB; 

回答

3

我能夠設置標題如下。區別在於選擇圖表可以通過ActiveChart來引用它。請注意,我有辦公室14,其中沒有AddChart2,所以我用AddChart

uses 
    comobj, excel_tlb; 

{$R *.dfm} 

procedure TForm1.Button1Click(Sender: TObject); 
var 
    oExcel : ExcelApplication; 
    RawDataSheet :_Worksheet; 
    myChart: Shape; 
begin 
    oExcel := CreateOleObject('Excel.Application') as ExcelApplication; 
    oExcel.Visible[LOCALE_USER_DEFAULT] := True; 

    // Add a New Workbook, with a single sheet 
    oExcel.Workbooks.Add(EmptyParam, LOCALE_USER_DEFAULT); 
    // Get the handle to the active Sheet, and insert some dummy data 
    RawDataSheet := oExcel.ActiveSheet as _Worksheet; 
    RawDataSheet.Range['A1', 'B10'].value2 := 10; 

    // Now add my chart 
// myChart := RawDataSheet.Shapes.AddChart2(208, xlColumnClustered, 200, 10, 300, 300, True); 
    myChart := RawDataSheet.Shapes.AddChart(xlColumnClustered, 200, 10, 300, 300); 
    myChart.Select(False); 

    oExcel.ActiveChart.HasTitle[LOCALE_USER_DEFAULT] := True; 
    oExcel.ActiveChart.ChartTitle[LOCALE_USER_DEFAULT].Caption := 'New Chart Title'; 
end; 

另外請注意,我不知道這是傳遞給Select參數的含義。


另一個可行的方法是放棄某些點後的類型安全(不再有效),並依賴於MS文檔中的VBA示例(它與生成的類型庫的簽名不匹配) 。這允許直接在圖表上工作。

procedure TForm1.Button1Click(Sender: TObject); 
var 
    oExcel : ExcelApplication; 
    RawDataSheet :_Worksheet; 
    myChart: Shape; 
    V: OleVariant; 
begin 
    oExcel := CreateOleObject('Excel.Application') as ExcelApplication; 
    oExcel.Visible[LOCALE_USER_DEFAULT] := True; 

    // Add a New Workbook, with a single sheet 
    oExcel.Workbooks.Add(EmptyParam, LOCALE_USER_DEFAULT); 
    // Get the handle to the active Sheet, and insert some dummy data 
    RawDataSheet := oExcel.ActiveSheet as _Worksheet; 
    RawDataSheet.Range['A1', 'B10'].value2 := 10; 

    // Now add my chart 
// myChart := RawDataSheet.Shapes.AddChart2(208, xlColumnClustered, 200, 10, 300, 300, True); 
    myChart := RawDataSheet.Shapes.AddChart(xlColumnClustered, 200, 10, 300, 300); 

    V := myChart.Chart; 
    V.HasTitle := True; 
    V.ChartTitle.Caption := 'Chart Title'; 
end; 
+0

我不知道你爲什麼要使用的,而不是一個句柄,你要訪問的圖表ActiveChart,但顯然你做......你的代碼,是用Excel2013 ...謝謝你。這一直讓我瘋狂。 – user1009073

+0

@user - 可能你不需要。但由於它不能按預期工作(與類型庫和文檔不匹配),所以任何人都會猜測你應該怎麼做。我用一個*奇怪的工作解決方案更新了答案,而不使用ActiveChart。 –