使用 OWC11 创建柱状图






4.78/5 (38投票s)
使用 Office Web Components 创建柱状图(简单、堆积或 100% 堆积柱状图)的表示方法。
引言
这是我写给任何开源网站的第一篇文章。由于我从本网站获得了许多有用的文章,如果我能为这个伟大的网站做出贡献,我将感到高兴。这是一个简单的应用程序,用于在 .NET 应用程序中使用 OWC11 进行图表表示以获得一些知识。
Office Web Components (OWC) 是一组 OLE 类,在 Microsoft Office 2000、Office XP 和 Office 2003 中实现为 ActiveX 控件。Office Web Components 已在 Office 2007 中停产,并且不包含在内,除非作为 Office Project Server 2007 的一部分。任何符合 COM 标准的组件对象模型编程语言都可以使用 OWC。
背景
任何使用 Office Web Components 11 的应用程序都需要在系统上安装 OWC 11 包。OWC 11 是一个单独的下载,可在 Microsoft 网站 或 Microsoft Office 2003 安装套件中获得。Office Web Components 11 不需要 Microsoft Office 的支持。
Office 2003 Web Components 默认不提供事件处理。我们需要进行一些修改。因此,请先参考此链接:如何:在 Visual Studio.NET 中处理 Office 2003 Web Components 的事件。使用此链接,我们可以获得AxOWC11.dll。将此新编译的AxOWC11.dll添加到工具箱。现在,工具箱包含AxChartSpace
控件、AxPivotTable
控件和AxSpreadsheet
控件。
柱状图
柱状图将值和系列组显示为一组垂直列,这些列按类别分组。值由 Y 轴测量的列高表示。类别标签显示在 X 轴上。柱状图通常用于比较类别之间的值。有三种类型的柱状图
- Column
- 堆积柱状图
- 100% 堆积柱状图
柱状图按类别分组显示系列作为单独的列。每列的高度由系列值决定。
堆积柱状图为每个类别显示所有堆积在单个柱子中的系列。每列的高度由该类别所有系列值的总和决定。
100% 堆积柱状图为每个类别显示所有堆积在单个柱子中的系列。每列的高度始终是图表的完整高度。系列值显示为每列的百分比。
上述柱状图的定义摘自 MSDN。有关更多详细信息,请参考:柱状图。
创建图表的步骤
首先,在工具箱属性窗口中,选择AxChartSpace
控件并将其拖到设计界面上。完成此步骤后,我们的窗体将如下所示
现在,在代码窗口中,编写以下语句
Imports owc11 = Microsoft.Office.Interop.Owc11
由于代码仅显示如何创建柱状图,因此代码效率不高。在这里,我们跳过了一些填充DataGridView
中虚拟数据的语句。现在,我们声明两个变量来保存类别(与 X 轴相关)和值(与 Y 轴相关)的数据
Dim categories(3)
For i As Integer = 0 To 3
categories(i) = DataGridView1.Columns(i + 1).HeaderText.ToString
Next
Dim values(3)
Dim chConstants
要清除图表工作区的内容,请使用以下语句。以下语句将删除可能已存在的任何旧图表,并将一个图表添加到图表空间。
AxChartSpace1.Clear()
AxChartSpace1.Charts.Add()
chConstants = AxChartSpace1.Constants
现在,向现有图表添加系列。使用以下语句,您可以添加任意数量的系列。
AxChartSpace1.Charts(0).SeriesCollection.Add()
现在,我们按如下方式为每个系列提供数据
Dim MaxTotal As Integer = 0
For j As Integer = 0 To DataGridView1.Rows.Count - 2
AxChartSpace1.Charts(0).SeriesCollection(j).SetData(chConstants.chDimCategories, _
chConstants.chDataLiteral, categories)
For i As Integer = 1 To DataGridView1.Columns.Count - 1
values(i - 1) = Val(DataGridView1.Rows(j).Cells(i).Value)
Next
AxChartSpace1.Charts(0).SeriesCollection(j).SetData(chConstants.chDimValues, _
chConstants.chDataLiteral, values)
AxChartSpace1.Charts(0).SeriesCollection(j).Caption = _
DataGridView1.Rows(j).Cells(0).Value
MaxTotal = MaxTotal + Val(DataGridView1.Rows(j).Cells(4).Value)
Next
我们也可以按如下方式设置每个系列的颜色
AxChartSpace1.Charts(0).SeriesCollection(0).Interior.Color = "DarkOrange"
AxChartSpace1.Charts(0).SeriesCollection(1).Interior.Color = "Cyan"
AxChartSpace1.Charts(0).SeriesCollection(2).Interior.Color = "Yellow"
AxChartSpace1.Charts(0).SeriesCollection(3).Interior.Color = "Red"
AxChartSpace1.Charts(0).SeriesCollection(4).Interior.Color = "Black"
请注意以上语句中的一个细节。我将系列颜色提供为字符串。它不支持Color
枚举。此时,我们决定要哪种类型的图表(简单、堆积或 100% 堆积柱状图)。此外,我们可以绘制 3D 效果的图表。对于简单和 3D 堆积柱状图,请使用以下语句。
If cboChartType.Text = "3D" Then
AxChartSpace1.Charts(0).Type = owc11.ChartChartTypeEnum.chChartTypeColumnStacked3D
'(See Figure-2)
Else
AxChartSpace1.Charts(0).Type = owc11.ChartChartTypeEnum.chChartTypeColumnStacked
(See Figure-3)
End If
对于简单和 3D 100% 堆积柱状图,请使用以下语句
If cboChartType.Text = "3D" Then
AxChartSpace1.Charts(0).Type = owc11.ChartChartTypeEnum.chChartTypeColumnStacked1003D
(see Figure-4)
Else
AxChartSpace1.Charts(0).Type = owc11.ChartChartTypeEnum.chChartTypeColumnStacked100
(see Figure-5)
End If
最后,对于简单和 3D 柱状图,请使用以下语句
If cboChartType.Text = "3D" Then
AxChartSpace1.Charts(0).Type = owc11.ChartChartTypeEnum.chChartTypeColumn3D
(see Figure-6)
End If
除了上述语句外,我们向所有图表提供数据的方式也决定了获得正确结果。在所有图表中,变量MaxTotal
也起着决定图表缩放的作用。
AxChartSpace1.Charts(0).Axes(1).Scaling.Maximum = MaxTotal
AxChartSpace1.Charts(0).Axes(1).MajorUnit = MaxTotal / 4
AxChartSpace1.Charts(0).Axes(1).Scaling.Minimum = 0
现在,在最后一步,我们为图表轴分配适当的标题和字体,如下所示
AxChartSpace1.Charts(0).Axes(0).HasTitle = True
AxChartSpace1.Charts(0).Axes(0).Title.Caption = "Time Range"
AxChartSpace1.Charts(0).Axes(0).Title.Font.Name = "Arial"
AxChartSpace1.Charts(0).Axes(0).Title.Font.Size = 9
AxChartSpace1.Charts(0).Axes(1).HasTitle = True
AxChartSpace1.Charts(0).Axes(1).Title.Caption = "Number of Members"
AxChartSpace1.Charts(0).Axes(1).Title.Font.Name = "Arial"
AxChartSpace1.Charts(0).Axes(1).Title.Font.Size = 9
关注点
当我在实际应用程序中使用 OWC 11 图表控件时,会得到一些奇怪的结果。如果我们将变量categories
声明如下
Dim categories(3) As String
那么图表对象将不显示任何系列。但是,图例显示了所有系列名称。还有一点,如果我们先更改系列颜色再提供数据,那么系列将不会显示正确的颜色。
希望您喜欢这个小教程。将来,我将为您提供更多内容。我期待您的宝贵建议。
最后,请原谅我的英语。