Previous topicNext topic
Help > 开发指南 > Excel > API > 示例 > Chart图表 >
如何:创建和修改图表

这些示例演示如何创建基本图表并指定其设置。

选择要执行的操作。

添加和定位图表

工作表中嵌入的所有图表都存储在图表集合中,可通过 Worksheet.Charts 属性访问。若要创建图表,请使用 ChartCollection.Add 方法将其添加到图表集合中,并传递以下参数:所需的图表类型 (ChartType) 和包含图表数据的 CellRange 对象(此参数是可选的,可以省略,因此可以手动将数据系列添加到图表中)。有关如何组织源范围内的数据以创建图表的信息,请参阅图表主题。

若要在工作表中定位创建的图表,请使用以下方法之一。

下面的示例演示如何使用 ChartCollection.Add 方法重载创建三维饼图,该重载允许您指定包含图表数据的 CellRange。

Vb.Net
Dim worksheet As DevExpress.Spreadsheet.Worksheet = workbook.Worksheets("chartTask1")
workbook.Worksheets.ActiveWorksheet = worksheet

'创建饼图并指定其位置。
Dim chart As DevExpress.Spreadsheet.Charts.Chart = worksheet.Charts.Add(DevExpress.Spreadsheet.Charts.ChartType.Pie3D, worksheet("B2:C7"))
chart.TopLeftCell = worksheet.Cells("E2")
chart.BottomRightCell = worksheet.Cells("K15")

'设置图表样式。
chart.Style = DevExpress.Spreadsheet.Charts.ChartStyle.ColorGradient

C#
DevExpress.Spreadsheet.Worksheet worksheet = workbook.Worksheets["chartTask1"];
workbook.Worksheets.ActiveWorksheet = worksheet;

// 创建饼图并指定其位置。
DevExpress.Spreadsheet.Charts.Chart chart = worksheet.Charts.Add(DevExpress.Spreadsheet.Charts.ChartType.Pie3D, worksheet["B2:C7"]);
chart.TopLeftCell = worksheet.Cells["E2"];
chart.BottomRightCell = worksheet.Cells["K15"];

// 设置图表样式。
chart.Style = DevExpress.Spreadsheet.Charts.ChartStyle.ColorGradient;

添加或删除数据序列

如果未在 ChartCollection.Add 方法中指定包含图表数据的范围,则可以稍后使用下列方法之一来定义它。

Vb.Net
Dim worksheet As DevExpress.Spreadsheet.Worksheet = workbook.Worksheets("chartTask1")
workbook.Worksheets.ActiveWorksheet = worksheet
    
'创建图表并指定其位置。
Dim chart As DevExpress.Spreadsheet.Charts.Chart = worksheet.Charts.Add(DevExpress.Spreadsheet.Charts.ChartType.ColumnClustered)
chart.TopLeftCell = worksheet.Cells("H2")
chart.BottomRightCell = worksheet.Cells("N14")

'添加使用工作表区域作为数据源的图表系列。
chart.Series.Add(worksheet("D2"), worksheet("B3:B6"), worksheet("D3:D6"))
chart.Series.Add(worksheet("F2"), worksheet("B3:B6"), worksheet("F3:F6"))

C#
DevExpress.Spreadsheet.Worksheet worksheet = workbook.Worksheets["chartTask1"];
workbook.Worksheets.ActiveWorksheet = worksheet;

// 创建图表并指定其位置。
DevExpress.Spreadsheet.Charts.Chart chart = worksheet.Charts.Add(DevExpress.Spreadsheet.Charts.ChartType.ColumnClustered);
chart.TopLeftCell = worksheet.Cells["H2"];
chart.BottomRightCell = worksheet.Cells["N14"];

// 添加使用工作表区域作为数据源的图表系列。
chart.Series.Add(worksheet["D2"], worksheet["B3:B6"], worksheet["D3:D6"]);
chart.Series.Add(worksheet["F2"], worksheet["B3:B6"], worksheet["F3:F6"]);

若要从图表中删除单个序列,请使用 SeriesCollection.Remove 或 SeriesCollection.RemoveAt 方法。

下面的示例演示了如何从图表中删除第二个序列。

Vb.Net
Dim worksheet As DevExpress.Spreadsheet.Worksheet = workbook.Worksheets("chartTask1")
workbook.Worksheets.ActiveWorksheet = worksheet

'创建图表并指定其位置。
Dim chart As DevExpress.Spreadsheet.Charts.Chart = worksheet.Charts.Add(DevExpress.Spreadsheet.Charts.ChartType.ColumnClustered, worksheet("B2:E6"))
chart.TopLeftCell = worksheet.Cells("H2")
chart.BottomRightCell = worksheet.Cells("N14")

'根据序号删除图表系。
chart.Series.RemoveAt(1)

C#
DevExpress.Spreadsheet.Worksheet worksheet = workbook.Worksheets["chartTask1"];
workbook.Worksheets.ActiveWorksheet = worksheet;


// 创建图表并指定其位置。
DevExpress.Spreadsheet.Charts.Chart chart = worksheet.Charts.Add(DevExpress.Spreadsheet.Charts.ChartType.ColumnClustered, worksheet["B2:E6"]);
chart.TopLeftCell = worksheet.Cells["H2"];
chart.BottomRightCell = worksheet.Cells["N14"];

// 根据序号删除图表系。
chart.Series.RemoveAt(1);

更改图表数据引用

创建图表后,可以更改从中检索序列参数和值数据的单元格区域。为此,请执行以下步骤。

  1. 使用 ChartData.FromRange 方法创建包含序列新数据的 ChartData 对象。
  2. 将创建的对象分配给 Series.Arguments 或 Series.Values 属性。

下面的示例演示了如何向图表添加数据序列,以及如何更改包含特定序列数据的单元格区域。

该代码使用 SeriesCollection.Add 方法创建一个系列,并将其添加到 ChartObject.Series 集合中。若要指定工作表区域中包含的序列值,请使用 ChartData.FromRange 方法创建一个 ChartData 对象,并将其分配给 Series.Values 属性。

ChartText.SetReference 方法用于将 Series.SeriesName 链接到工作表单元格的内容。

Vb.Net
Dim worksheet As DevExpress.Spreadsheet.Worksheet = workbook.Worksheets("chartTask1")
workbook.Worksheets.ActiveWorksheet = worksheet

'创建图表并指定其位置。
Dim chart As DevExpress.Spreadsheet.Charts.Chart = worksheet.Charts.Add(DevExpress.Spreadsheet.Charts.ChartType.ColumnClustered)
chart.TopLeftCell = worksheet.Cells("H2")
chart.BottomRightCell = worksheet.Cells("N14")
'使用工作表区域作为数据源添加系列。
chart.Series.Add(worksheet("D2"), worksheet("B3:B6"), worksheet("D3:D6"))
chart.Series.Add(worksheet("F2"), worksheet("B3:B6"), worksheet("F3:F6"))

'更改序列值的数据范围。
chart.Series(1).Values = DevExpress.Spreadsheet.Charts.ChartData.FromRange(worksheet("E3:E6"))

'指定作为序列名称来源的单元格。
chart.Series(1).SeriesName.SetReference(worksheet("E2"))

C#
DevExpress.Spreadsheet.Worksheet worksheet = workbook.Worksheets["chartTask1"];
workbook.Worksheets.ActiveWorksheet = worksheet;

// 创建图表并指定其位置。
DevExpress.Spreadsheet.Charts.Chart chart = worksheet.Charts.Add(DevExpress.Spreadsheet.Charts.ChartType.ColumnClustered);
chart.TopLeftCell = worksheet.Cells["H2"];
chart.BottomRightCell = worksheet.Cells["N14"];
// 使用工作表区域作为数据源添加系列。
chart.Series.Add(worksheet["D2"], worksheet["B3:B6"], worksheet["D3:D6"]);
chart.Series.Add(worksheet["F2"], worksheet["B3:B6"], worksheet["F3:F6"]);

// 更改序列值的数据范围。
chart.Series[1].Values = DevExpress.Spreadsheet.Charts.ChartData.FromRange(worksheet["E3:E6"]);

// 指定作为序列名称来源的单元格。
chart.Series[1].SeriesName.SetReference(worksheet["E2"]);

更改数据序列的顺序

默认情况下,如果图表具有多个数据系列,则这些数据系列将按照它们在工作表上的显示顺序绘制在图表上(如果数据按列排列,则从左到右;如果数据按行排列,则从上到下)。但是,您可以更改此默认顺序。利用 Series.BringForward 或 Series.SendBackward 方法按绘图顺序向上或向下移动指定的序列,一次一个位置。若要将序列放在图表上所有其他序列之前或之后,请使用 Series.BringToFront 或 Series.SendToBack 方法。

Vb.Net
Dim worksheet As DevExpress.Spreadsheet.Worksheet = workbook.Worksheets("chartTask1")
workbook.Worksheets.ActiveWorksheet = worksheet

'创建图表并指定其位置。
Dim chart As DevExpress.Spreadsheet.Charts.Chart = worksheet.Charts.Add(DevExpress.Spreadsheet.Charts.ChartType.ColumnClustered, worksheet("B2:D6"))
chart.TopLeftCell = worksheet.Cells("H2")
chart.BottomRightCell = worksheet.Cells("N14")

'改变图表系列的顺序
chart.Series(1).BringForward()

C#
DevExpress.Spreadsheet.Worksheet worksheet = workbook.Worksheets["chartTask1"];
workbook.Worksheets.ActiveWorksheet = worksheet;

// 创建图表并指定其位置。
DevExpress.Spreadsheet.Charts.Chart chart = worksheet.Charts.Add(DevExpress.Spreadsheet.Charts.ChartType.ColumnClustered, worksheet["B2:D6"]);
chart.TopLeftCell = worksheet.Cells["H2"];
chart.BottomRightCell = worksheet.Cells["N14"];

// 改变图表系列的顺序
chart.Series[1].BringForward();

更改图表类型

创建图表后,您可能会发现所选的图表不合适,其他图表类型可能更能代表您的数据。在这种情况下,无需重新创建图表。只需使用 ChartObject.ChangeType 方法更改整个图表的类型即可。此方法将现有图表替换为指定的图表。如果无法完成操作,则会触发异常。

下面的示例演示如何创建 ChartType.PieExploded 类型的图表。之后,代码尝试使用 ChartObject.ChangeType 方法将图表类型更改为 ChartType.LineMarker。如果尝试将图表类型更改为 ChartType.StockHighLowClose(此行已注释),则会引发异常,因为此图表类型的数据范围不足,并且图表将更改为 ChartType.ColumnClustered。

Vb.Net
Dim worksheet As DevExpress.Spreadsheet.Worksheet = workbook.Worksheets("chartTask1")
workbook.Worksheets.ActiveWorksheet = worksheet

Dim type1 As DevExpress.Spreadsheet.Charts.ChartType = DevExpress.Spreadsheet.Charts.ChartType.LineMarker
'如果无法使用现有数据创建新的图表类型,则会引发异常。
Dim type2 As DevExpress.Spreadsheet.Charts.ChartType = DevExpress.Spreadsheet.Charts.ChartType.ColumnClustered

'创建图表并指定其位置
Dim chart As DevExpress.Spreadsheet.Charts.Chart = worksheet.Charts.Add(DevExpress.Spreadsheet.Charts.ChartType.PieExploded, worksheet("B2:C7"))

'改变图表的类型
Try
    chart.ChangeType(type1)
Catch e As Exception
    MessageBox.Show(e.Message, "Incompatible chart type")
    chart.ChangeType(type2)
End Try

C#
DevExpress.Spreadsheet.Worksheet worksheet = workbook.Worksheets["chartTask1"];
workbook.Worksheets.ActiveWorksheet = worksheet;

DevExpress.Spreadsheet.Charts.ChartType type1 = DevExpress.Spreadsheet.Charts.ChartType.LineMarker;
// 如果无法使用现有数据创建新的图表类型,则会引发异常。
DevExpress.Spreadsheet.Charts.ChartType type2 = DevExpress.Spreadsheet.Charts.ChartType.ColumnClustered;

// 创建图表并指定其位置
DevExpress.Spreadsheet.Charts.Chart chart = worksheet.Charts.Add(DevExpress.Spreadsheet.Charts.ChartType.PieExploded, worksheet["B2:C7"]);

// 改变图表的类型
try
{
    chart.ChangeType(type1);
}
catch (Exception e)
{
    MessageBox.Show(e.Message, "Incompatible chart type");
    chart.ChangeType(type2);
}

更改序列的图表类型(组合图表)

除了更改整个图表的类型外,还可以为单个数据系列选择不同的图表类型。这将自动将图表转换为组合图表。组合图表是一种复杂的图表,它由两个或多个 ChartView 对象组成,这些对象合并了相同图表类型的系列。若要更改单个数据序列的类型,请调用 Series.ChangeType 方法。如果指定的序列类型与现有 ChartView 对象 (ChartView.ViewType) 的类型不同,则将创建包含序列的新 ChartView,否则,该系列将添加到相同类型的现有 ChartView 中。

重要

并非所有图表类型都可以组合(例如,无法组合 2-D 和 3-D 图表类型)。如果选择的类型在逻辑上与现有图表类型无关,则生成的图表将仅包含最近添加类型的一个图表视图。

下面列出了兼容的图表类型。

ChartType.Area
ChartType.AreaFullStacked
ChartType.AreaStacked
ChartType.BarClustered
ChartType.BarFullStacked
ChartType.BarStacked
ChartType.ColumnClustered
ChartType.ColumnFullStacked
ChartType.ColumnStacked
ChartType.Line
ChartType.LineFullStacked
ChartType.LineFullStackedMarker
ChartType.LineMarker
ChartType.LineStacked
ChartType.LineStackedMarker

Vb.Net
Dim worksheet As DevExpress.Spreadsheet.Worksheet = workbook.Worksheets("chartTask1")
workbook.Worksheets.ActiveWorksheet = worksheet

'创建图表并指定其位置。
Dim chart As DevExpress.Spreadsheet.Charts.Chart = worksheet.Charts.Add(DevExpress.Spreadsheet.Charts.ChartType.LineMarker, worksheet("B2:D8"))
chart.TopLeftCell = worksheet.Cells("F2")
chart.BottomRightCell = worksheet.Cells("L15")

'更改第二个系列的类型。
chart.Series(1).ChangeType(DevExpress.Spreadsheet.Charts.ChartType.ColumnClustered)

'使用辅助轴。
chart.Series(1).AxisGroup = DevExpress.Spreadsheet.Charts.AxisGroup.Secondary

'指定图例的位置。
chart.Legend.Position = DevExpress.Spreadsheet.Charts.LegendPosition.Top

C#
DevExpress.Spreadsheet.Worksheet worksheet = workbook.Worksheets["chartTask1"];
workbook.Worksheets.ActiveWorksheet = worksheet;

// 创建图表并指定其位置。
DevExpress.Spreadsheet.Charts.Chart chart = worksheet.Charts.Add(DevExpress.Spreadsheet.Charts.ChartType.LineMarker, worksheet["B2:D8"]);
chart.TopLeftCell = worksheet.Cells["F2"];
chart.BottomRightCell = worksheet.Cells["L15"];

// 更改第二个系列的类型。
chart.Series[1].ChangeType(DevExpress.Spreadsheet.Charts.ChartType.ColumnClustered);

// 使用辅助轴。
chart.Series[1].AxisGroup = DevExpress.Spreadsheet.Charts.AxisGroup.Secondary;

// 指定图例的位置。
chart.Legend.Position = DevExpress.Spreadsheet.Charts.LegendPosition.Top;