チャートの挿入

そろそろチャートを挿入します。

チャートを新しく挿入する前に決めておくことは次の項目です。

  • チャートオブジェクト名
  • チャートのサイズ。チャートはチャートの埋め込まれた図形描写オブジェクトのサイズで変更しなければいけないため、事前に決めたほうが楽です。
  • データ範囲、ラベル範囲
  • タイトルなど

char2 API を利用してチャートのデータソースを操作するため空のデータ範囲を設定して新規チャートを作成します。

  1. チャートコンテナにチャートを挿入。空のデータ範囲、チャートの位置とサイズを指定します。
  2. 挿入したチャートオブジェクトをコンテナから取得しなおします。
  3. 利用したい種類のチャートのテンプレートを作成。
  4. データプロバイダを利用してデータソースを作成。
  5. テンプレートをダイアグラムに適用します。このとき同時にデータソースも適用します。
Sub InsertChart
  oDoc = ThisComponent
  ' チャートコンテナ
  oCharts = oDoc.getSheets().getByIndex(0).getCharts()
  
  Dim aRange(1) As New com.sun.star.table.CellRangeAddress
  Dim aRectangle As New com.sun.star.awt.Rectangle
  ' チャート名およびチャートのサイズ
  sChartName = "Chart2"
  aRectangle = make_Rectangle(1300, 1300, 7000, 5000)
  
  If oCharts.hasByName(sChartName) Then
    oCharts.removeByName(sChartName)
  End If
  
  ' チャートを挿入
  oCharts.addNewByName(sChartName, aRectangle, aRange, False, False)
  ' 挿入したチャートオブジェクトを取得
  oChart = oCharts.getByName(sChartName).getEmbeddedObject()
 
  ' chart2 モジュールのダイアグラムオブジェクト
  oDiagram = oChart.getFirstDiagram()
 
  ' テンプレートオブジェクトを作成
  oChartTypeManager = oChart.getChartTypeManager()
  oChartTypeTemplate = oChartTypeManager.createInstance( _
        "com.sun.star.chart2.template.ThreeDPie")
  oChartTypeTemplate.changeDiagram(oDiagram)
  
  ' データプロバイダ
  oDataProvider = oChart.getDataProvider()
  
  ' データソースを作成
  oDataSource = CreateNewDataSource(oDataProvider, "Sheet1.A1:B3", False, True)
  
  ' ダイアグラムにデータを設定、テンプレートでチャートのタイプも更新
  Dim aArgs(0) As New com.sun.star.beans.PropertyValue
  aArgs(0).Name = "HasCategories"
  aArgs(0).Value = True
 
  oChartTypeTemplate.changeDiagramData(oDiagram, oDataSource, aArgs)
End Sub


' 新しいデータソースを作成
Function CreateNewDataSource( oDataProvider As Object, _
    sDataRange As String, bFirstCellAsLabel As Boolean, bHasCategories As Boolean )
  ' 新しくデータソースをセルの範囲から生成
  ' css.chart2.data.TabularDataProviderArguments
  Dim aProps(3) As New com.sun.star.beans.PropertyValue
  ' データ範囲
  aProps(0).Name = "CellRangeRepresentation"
  aProps(0).Value = sDataRange
  ' データの並ぶ方向
  aProps(1).Name = "DataRowSource"
  aProps(1).Value = com.sun.star.chart.ChartDataRowSource.COLUMNS
  ' 最初のセルをラベルに利用
  aProps(2).Name = "FirstCellAsLabel"
  aProps(2).Value = bFirstCellAsLabel
  ' ラベルを表示
  aProps(3).Name = "HasCategories"
  aProps(3).Value = bHasCategories
 
  CreateNewDataSource = oDataProvider.createDataSource(aProps)
End Function


Function make_Rectangle( _
    nX As Long, nY As Long, _
    nWidth As Long, nHeight As Long ) _
        As com.sun.star.awt.Rectangle
  Dim aRectangle As New com.sun.star.awt.Rectangle
  With aRectangle
    .X = nX
    .Y = nY
    .Width = nWidth
    .Height = nHeight
  End With
  make_Rectangle = aRectangle
End Function

データソースの作成

上記の CreateNewDataSource 関数ではデータプロバイダを利用して新しいチャートのためのデータソースを生成しています。createDataSource メソッドの引数は []com.sun.star.beans.PropertyValue 型です。この方法ではセル範囲のアドレス表記からデータソースを簡単に生成できます。データのセル範囲オブジェクトがあるのなら AbsoluteName プロパティから範囲のアドレスを取得できます。
また、データの並んでいる方向、最初のセルをラベルとして利用するかどうかなどを指定できます。これはチャートを手作業で作成するときと同じオプションです。

チャートの種類の変更

利用したい種類のチャートのテンプレートオブジェクトをインスタンス化して、それを利用してチャートの種類を変更します。
まず、changeDiagram メソッドでチャートの種類を変更します。その後、データソースを changeDiagramData メソッドで変更します。

データソース作成の補足

次の表から列 B と C を描くものと列 D と E について描く二つの折れ線グラフを作成することを考えます。データラベルは列 A のものを両方で利用します。

- A B C D E
1 A 100 99 89 90
2 B 133 105 80 100
3 C 120 110 82 99
4 D 102 120 90 88

上記の CreateDataSource 関数でデータソースオブジェクトを生成するときに、一つめのグラフでは データ範囲に "Sheet1.A1:C4" を指定、二つめのグラフでは "Sheet1.A1:A4;Sheet1.D1:E4" を指定します。
";" で範囲を区切れば分割された範囲からでもデータソースを簡単に生成できます。