【问题标题】:Delphi - Changing Chart Title in Excel causes AV - Updated with complete sampleDelphi - 在 Excel 中更改图表标题会导致 AV - 使用完整示例更新
【发布时间】:2017-04-01 11:45:15
【问题描述】:

我正在使用 Delphi Seattle 在 Excel (2013) 中构建和显示图表。我从数据透视表构建图表。图表显示一切正常。它有一个默认标题,所以我想更改它。这应该是一个简单的属性更改,但我不断收到 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 的 Microsoft 对象模型文档说这是正确的属性...(https://msdn.microsoft.com/en-us/library/office/ff840521.aspx)

附加信息:我确实生成了自己的类型库 Excel_TLB,并且在我的USES 子句中有它。我完整的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;

【问题讨论】:

    标签: excel delphi com


    【解决方案1】:

    我可以设置如下标题。不同的是选择图表可以通过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;
    

    【讨论】:

    • 我不知道为什么您必须使用 ActiveChart 而不是要访问的图表的句柄,但显然您这样做了...您的代码适用于 Excel2013...谢谢。这让我发疯了。
    • @user - 可能你不必这样做。但由于它没有按预期工作(与类型库和文档不匹配),所以任何人都猜测你应该如何做。我在不使用 ActiveChart 的情况下用一个 strangely 工作解决方案更新了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多