delphi – 在Excel中更改图表标题导致AV – 更新完整的示例

我正在使用Delphi Seattle在Excel(2013)中构build和显示图表。 我从一个数据透视表build立我的图表。 图表显示一切正常。 它有一个默认的标题,所以我想改变这一点。 这应该是一个简单的属性更改,但我不断收到AV错误。 当我谷歌,我可以find最接近的事情提到,我需要select图表和/或图表标题之前,我改变它。 [已更新]这是一个工作示例,显示问题。

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; 

我找不到任何方法来改变我的标题。 我什至不能find任何方式来读取现有的标题,更不用说改变它。

ChartTitle的Microsoft对象模型文档说这是正确的属性…( https://msdn.microsoft.com/en-us/library/office/ff840521.aspx )

附加信息:我确实生成了我自己的types库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; 

我能够设置一个标题如下。 区别在于select图表可以通过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的参数的含义。

另一个可行的方法是放弃某些点之后的types安全(不再适用),并依靠MS文档中find的VBA示例(与生成的types库的签名不匹配)。 这允许直接在图表上工作。

 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;