/// <summary> /// 绘制动态曲线图 /// </summary> /// <param name="p_dicDate_ChosenDatum"></param> /// <param name="arrChosenTags"></param> /// <param name="arrDataDisplacement"></param> /// <returns></returns> /// <remarks></remarks> private Chart DrawDynamicChart(Dictionary <DateTime, object[]> p_dicDate_ChosenDatum, string[] arrChosenTags, object[,] arrDataDisplacement) { //dic_Date_ChosenDatum以每一天的日期来索引这一天的监测数据,监测数据只包含列表中选择了的监测点 Chart r_myChart = default(Chart); F_shtDrawing.Activate(); //--------------------------------------------------------------- 在工作表“标高图”中添加图表 r_myChart = F_shtDrawing.Shapes.AddChart(XlChartType.xlLineMarkers).Chart; //---------- 选定模板 string t_path = System.IO.Path.Combine(System.Convert.ToString(My.Settings.Default.Path_Template), Constants.FolderOrFileName.File_Template.Chart_Horizontal_Dynamic); // 如果监测曲线图所使用的"Chart模板"有问题,则在chart.ChartArea.Copy方法(或者是chartObject.Copy方法)中可能会出错。 r_myChart.ApplyChartTemplate(t_path); //-------------------- 获取图表中的信息文本框 F_textbox_Info = r_myChart.Shapes[0].TextFrame2; //Chart中的Shapes集合的第一个元素的下标值为0 //textbox_Info.AutoSize = Microsoft.Office.Core.MsoAutoSize.msoAutoSizeShapeToFitText //------------------------ 设置曲线的数据 DateTime Date_theFirstCurve = System.Convert.ToDateTime(p_dicDate_ChosenDatum.Keys(0)); SeriesCollection mySeriesCollection = r_myChart.SeriesCollection(); Series series = mySeriesCollection.Item(1); series.Name = Date_theFirstCurve.ToString(); //系列名称 series.XValues = arrChosenTags; //X轴的数据 series.Values = p_dicDate_ChosenDatum.Item(Date_theFirstCurve); //Y轴的数据 // this.F_TheFirstseriesTag = new clsDrawing_Mnt_RollingBase.SeriesTag(series, Date_theFirstCurve); //------------------------ 设置X、Y轴的格式——监测点位编号 dynamic with_3 = r_myChart.Axes(XlAxisType.xlCategory); with_3.AxisTitle.Text = GetAxisLabel(DrawingType.Monitor_Dynamic, this.F_MonitorType, XlAxisType.xlCategory); //-设置Y轴的格式——测点位移 Axis axes = r_myChart.Axes(XlAxisType.xlValue); //由数据的最小与最大值来划分表格区间 float imin = (float)(F_AppDrawing.WorksheetFunction.Min(arrDataDisplacement)); float imax = (float)(F_AppDrawing.WorksheetFunction.Max(arrDataDisplacement)); //主要与次要刻度单位,先确定刻度单位是为了后面将坐标轴的区间设置为主要刻度单位的倍数 float unit = float.Parse(Strings.Format((imax - imin) / ClsDrawing_Mnt_OtherDynamics.cstChartParts_Y, "0.0E+00")); //这里涉及到有效数字的处理的问题 axes.MajorUnit = unit; axes.MinorUnitIsAuto = true; //坐标轴上显示的总区间 axes.MinimumScale = F_AppDrawing.WorksheetFunction.Floor_Precise(imin, axes.MajorUnit); axes.MaximumScale = F_AppDrawing.WorksheetFunction.Ceiling_Precise(imax, axes.MajorUnit); //坐标轴标题 axes.AxisTitle.Text = GetAxisLabel(DrawingType.Monitor_Dynamic, this.F_MonitorType, XlAxisType.xlValue); return(r_myChart); }
/// <summary> /// 构造函数 /// </summary> /// <param name="DataSheet">图表对应的数据工作表</param> /// <param name="DrawingChart">Excel图形所在的Chart对象</param> /// <param name="ParentApp">此图表所在的Excel类的实例对象</param> /// <param name="DateSpan">此图表的TimeSpan跨度</param> /// <param name="CanRoll">是图表是否可以滚动,即是动态图还是静态图</param> /// <param name="Date_ChosenDatum">一个字典,其关键字为监测数据表中有数据的每一天的日期, /// 对应的值为当天每一个被选择的监测点的监测数据,监测数据只包含列表中选择了的监测点</param> /// <param name="Info">记录数据信息的文本框</param> /// <remarks></remarks> public ClsDrawing_Mnt_OtherDynamics(Worksheet DataSheet, Chart DrawingChart, Cls_ExcelForMonitorDrawing ParentApp, DateSpan DateSpan, DrawingType type, bool CanRoll, TextFrame2 Info, MonitorInfo DrawingTag, MntType MonitorType, Dictionary <DateTime, object[]> Date_ChosenDatum, clsDrawing_Mnt_RollingBase.SeriesTag SeriesTag) : base(DataSheet, DrawingChart, ParentApp, type, CanRoll, Info, DrawingTag, MonitorType, DateSpan, SeriesTag) { // ------------------------------------ //为进行滚动的那条数据曲线添加数据标签 //在数据点旁边显示数据值 this.MovingSeries.ApplyDataLabels(); //设置数据标签的格式 DataLabels dataLBs = this.MovingSeries.DataLabels(); dataLBs.NumberFormat = "0.00"; dataLBs.Format.TextFrame2.TextRange.Font.Size = 8; dataLBs.Format.TextFrame2.TextRange.Font.Fill.ForeColor.RGB = Information.RGB(0, 0, 0); dataLBs.Format.TextFrame2.TextRange.Font.Name = AMEApplication.FontName_TNR; P_dicDate_ChosenDatum = Date_ChosenDatum; //包括第一列,但是不包括第一行的日期。 // '' -----对图例进行更新--------- //Call LegendRefresh(Me.List_HasCurve) }