public class ExChart
{
// ...
}
这个类定义了整个图表的结构,对应流程图中的所有步骤。
public ExChart(string name, ExRange range, bool flip, Rg.Rectangle3d boundary)
{
// ...
}
这对应流程图中的"创建 ExChart 对象"和"初始化图表"步骤(B和C)。
例如:
public void SetTitle(string title)
{
this.ComObj.Chart.HasTitle = true;
this.ComObj.Chart.ChartTitle.Text = title;
if (title == "") this.ComObj.Chart.HasTitle = false;
}
例如:
public void SetBarChart(BarChartType chartType, ChartFill fillType)
{
// ...
this.ComObj.Chart.ChartType = (XL.XlChartType)type;
}
这些方法实现了流程图中描述的各种图表类型的设置。
总的来说,这个ExChart类提供了一个全面的接口来创建和自定义Excel图表。它实现了流程图中描述的所有主要步骤,从创建图表对象,到设置各种属性,再到选择特定的图表类型。代码的结构和方法名称清晰地反映了流程图中的各个步骤,使得使用者可以方便地按照流程图的逻辑来使用这个类创建所需的图表。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Sd = System.Drawing;
using Rg = Rhino.Geometry;
using XL = Microsoft.Office.Interop.Excel;
using Grasshopper.Kernel.Data;
using Grasshopper.Kernel.Types;
namespace Bumblebee
{
// ExChart类:用于创建和管理Excel图表
public class ExChart
{
#region 成员变量
// Excel图表对象
public XL.ChartObject ComObj = null;
// 图表数据范围
protected ExRange range = null;
#endregion
#region 构造函数
///
/// 创建一个新的ExChart对象
///
/// 图表名称
/// 数据范围
/// 是否翻转行列
/// 图表边界
public ExChart(string name, ExRange range, bool flip, Rg.Rectangle3d boundary)
{
this.range = new ExRange(range);
bool isNew = true;
// 检查是否已存在同名图表
foreach(XL.ChartObject obj in range.ComObj.Worksheet.ChartObjects())
{
if(name == obj.Name)
{
this.ComObj = obj;
isNew = false;
break;
}
}
// 如果是新图表,则创建
if(isNew)this.ComObj = range.ComObj.Worksheet.ChartObjects().Add(boundary.Corner(0).X, boundary.Corner(0).Y, boundary.Width, boundary.Height);
// 设置图表数据源
this.ComObj.Chart.SetSourceData(range.ComObj);
// 设置图表方向(按行或按列)
if (flip)
{
this.ComObj.Chart.PlotBy = XL.XlRowCol.xlColumns;
}
else
{
this.ComObj.Chart.PlotBy = XL.XlRowCol.xlRows;
}
// 默认不显示图例
this.ComObj.Chart.HasLegend = false;
// 设置所有系列的标记样式为点
foreach(XL.Series series in this.ComObj.Chart.SeriesCollection())
{
series.MarkerStyle = XL.XlMarkerStyle.xlMarkerStyleDot;
}
// 设置图表名称
this.ComObj.Name = name;
}
///
/// 复制构造函数
///
public ExChart(ExChart chart)
{
this.ComObj = chart.ComObj;
this.range = new ExRange(chart.range);
}
#endregion
#region 属性
// 这里可以添加属性
#endregion
#region 方法
///
/// 设置填充颜色
///
/// 是否按系列设置
/// 颜色列表
public void SetFillColors(bool bySeries, List<Sd.Color> values)
{
int i = 0;
int c = values.Count - 1;
range.Worksheet.Freeze();
if (bySeries)
{
// 按系列设置颜色
foreach (XL.Series series in this.ComObj.Chart.SeriesCollection())
{
int j = i > c ? c : i;
series.Interior.Color = values[j];
i++;
}
}
else
{
// 按点设置颜色
foreach (XL.Series series in this.ComObj.Chart.SeriesCollection())
{
foreach (XL.Point point in series.Points())
{
int j = i > c ? c : i;
point.Interior.Color = values[j];
i++;
}
}
}
range.Worksheet.UnFreeze();
}
///
/// 设置轮廓颜色
///
/// 是否按系列设置
/// 颜色列表
public void SetStrokeColors(bool bySeries, List<Sd.Color> values)
{
// 实现类似于SetFillColors
}
///
/// 设置轮廓粗细
///
/// 是否按系列设置
/// 粗细值列表
public void SetStrokeWeights(bool bySeries, List<int> values)
{
// 实现类似于SetFillColors,但设置边框粗细
}
///
/// 设置字体名称
///
/// 是否按系列设置
/// 字体名称列表
public void SetFontNames(bool bySeries, List<double> values)
{
// 实现类似于SetFillColors,但设置字体名称
}
///
/// 设置图表标题
///
/// 标题文本
public void SetTitle(string title)
{
this.ComObj.Chart.HasTitle = true;
this.ComObj.Chart.ChartTitle.Text = title;
if (title == "") this.ComObj.Chart.HasTitle = false;
}
///
/// 设置数据标签
///
/// 标签类型
public void SetLabel(LabelType label)
{
switch (label)
{
default:
this.ComObj.Chart.ApplyDataLabels(XL.XlDataLabelsType.xlDataLabelsShowNone);
break;
case LabelType.Category:
this.ComObj.Chart.ApplyDataLabels(XL.XlDataLabelsType.xlDataLabelsShowLabel);
break;
case LabelType.Value:
this.ComObj.Chart.ApplyDataLabels(XL.XlDataLabelsType.xlDataLabelsShowValue);
break;
}
}
///
/// 设置图例位置
///
/// 图例位置
public void SetLegend(LegendLocations legend)
{
switch (legend)
{
case LegendLocations.None:
this.ComObj.Chart.HasLegend = false;
break;
case LegendLocations.Bottom:
this.ComObj.Chart.HasLegend = true;
this.ComObj.Chart.Legend.Position = XL.XlLegendPosition.xlLegendPositionBottom;
break;
case LegendLocations.Left:
this.ComObj.Chart.HasLegend = true;
this.ComObj.Chart.Legend.Position = XL.XlLegendPosition.xlLegendPositionLeft;
break;
case LegendLocations.Right:
this.ComObj.Chart.HasLegend = true;
this.ComObj.Chart.Legend.Position = XL.XlLegendPosition.xlLegendPositionRight;
break;
case LegendLocations.Top:
this.ComObj.Chart.HasLegend = true;
this.ComObj.Chart.Legend.Position = XL.XlLegendPosition.xlLegendPositionTop;
break;
}
}
///
/// 设置X轴标题
///
/// X轴标题文本
public void SetAxisX(string name)
{
XL.Axis axis = this.ComObj.Chart.Axes(XL.XlAxisType.xlValue, XL.XlAxisGroup.xlPrimary);
axis.HasTitle = true;
axis.AxisTitle.Text = name;
if (name == "") axis.HasTitle = false;
}
///
/// 设置Y轴标题
///
/// Y轴标题文本
public void SetAxisY(string name)
{
// 实现类似于SetAxisX
}
///
/// 设置X轴网格线
///
/// 网格线类型
public void SetGridX(GridType type)
{
XL.Axis axis = this.ComObj.Chart.Axes(XL.XlAxisType.xlValue, XL.XlAxisGroup.xlPrimary);
switch (type)
{
case GridType.None:
axis.HasMajorGridlines = false;
axis.HasMinorGridlines = false;
break;
case GridType.Primary:
axis.HasMajorGridlines = true;
axis.HasMinorGridlines = false;
break;
case GridType.All:
axis.HasMajorGridlines = true;
axis.HasMinorGridlines = true;
break;
}
}
///
/// 设置Y轴网格线
///
/// 网格线类型
public void SetGridY(GridType type)
{
// 实现类似于SetGridX
}
///
/// 设置条形图类型
///
/// 条形图类型
/// 填充类型
public void SetBarChart(BarChartType chartType, ChartFill fillType)
{
int type = 57;
switch (chartType)
{
case BarChartType.Basic:
type = 57;
break;
case BarChartType.Box:
type = 60;
break;
case BarChartType.Pyramid:
type = 109;
break;
case BarChartType.Cylinder:
type = 95;
break;
case BarChartType.Cone:
type = 102;
break;
}
type += (int)fillType;
this.ComObj.Chart.ChartType = (XL.XlChartType)type;
}
///
/// 设置柱状图类型
///
/// 柱状图类型
/// 填充类型
public void SetColumnChart(BarChartType chartType, ChartFill fillType)
{
// 实现类似于SetBarChart
}
///
/// 设置径向图类型
///
/// 径向图类型
public void SetRadialChart(RadialChartType chartType)
{
XL.XlChartType type = XL.XlChartType.xlPie;
switch (chartType)
{
case RadialChartType.Pie:
type = XL.XlChartType.xlPie;
break;
case RadialChartType.Donut:
type = XL.XlChartType.xlDoughnut;
break;
case RadialChartType.Radar:
type = XL.XlChartType.xlRadar;
break;
case RadialChartType.Pie3D:
type = XL.XlChartType.xl3DPie;
break;
case RadialChartType.RadarFilled:
type = XL.XlChartType.xlRadarFilled;
break;
}
this.ComObj.Chart.ChartType = type;
}
///
/// 设置散点图类型
///
/// 散点图类型
public void SetScatterChart(ScatterChartType chartType)
{
// 实现类似于SetRadialChart
}
///
/// 设置表面图类型
///
/// 表面图类型
public void SetSurfaceChart(SurfaceChartType chartType)
{
// 实现类似于SetRadialChart
}
///
/// 设置线图类型
///
/// 线图类型
/// 填充类型
public void SetLineChart(LineChartType chartType, ChartFill fillType)
{
XL.XlChartType type = XL.XlChartType.xlLine;
switch (chartType)
{
case LineChartType.Line:
switch (fillType)
{
case ChartFill.Stack:
type = XL.XlChartType.xlLineStacked;
break;
case ChartFill.Fill:
type = XL.XlChartType.xlLineStacked100;
break;
default:
type = XL.XlChartType.xlLine;
break;
}
break;
// ... 其他类型的设置 ...
}
this.ComObj.Chart.ChartType = type;
}
#endregion
#region 重写方法
///
/// 重写ToString方法,返回图表名称
///
public override string ToString()
{
return "Chart | " + this.ComObj.Name;
}
#endregion
}
}