チャートの挿入
そろそろチャートを挿入します。
チャートを新しく挿入する前に決めておくことは次の項目です。
- チャートオブジェクト名
- チャートのサイズ。チャートはチャートの埋め込まれた図形描写オブジェクトのサイズで変更しなければいけないため、事前に決めたほうが楽です。
- データ範囲、ラベル範囲
- タイトルなど
char2 API を利用してチャートのデータソースを操作するため空のデータ範囲を設定して新規チャートを作成します。
- チャートコンテナにチャートを挿入。空のデータ範囲、チャートの位置とサイズを指定します。
- 挿入したチャートオブジェクトをコンテナから取得しなおします。
- 利用したい種類のチャートのテンプレートを作成。
- データプロバイダを利用してデータソースを作成。
- テンプレートをダイアグラムに適用します。このとき同時にデータソースも適用します。
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" を指定します。
";" で範囲を区切れば分割された範囲からでもデータソースを簡単に生成できます。