duheng
2025-03-28 d5a2d7e66f9c8046bd88b8269e61aac5a2a265e2
WinFrmUI/PBS.WinFrmUI.DataAnalysis/FlowPressAnalysis.cs
@@ -1,5 +1,7 @@
using DevExpress.Utils;
using DevExpress.XtraCharts;
using DevExpress.XtraGrid.Columns;
using DevExpress.XtraGrid.Views.Grid;
using System.Data;
using System.IO;
using Yw.WinFrmUI;
@@ -23,17 +25,17 @@
            if (dlg.ShowDialog() != System.Windows.Forms.DialogResult.OK)
                return;
            var datalist = new List<FlowPressChartViewModel>();
            ParseExcel(dlg.FileName, out datalist);
            var datatable = new DataTable();
            ParseExcel(dlg.FileName, out datalist,out datatable);
            if (datalist.Any())
            {
                SetBindingData(datalist);
                SetBindingData(datalist,datatable);
            }
        }
        #region Private Variable
        private XYDiagram _diagram;
        private XYDiagramDefaultPane _default_pane;
        private XYDiagramPane _bottom_pane;
        private AxisX _axis_x_flow;
        private AxisY _axis_y_head;
@@ -49,11 +51,16 @@
            this.chartControl1.RuntimeHitTesting = true;
            this.chartControl1.Legend.Visibility = DefaultBoolean.True;
            _diagram = (XYDiagram)this.chartControl1.Diagram;
            _diagram.EnableAxisXScrolling = true;
            _diagram.EnableAxisYScrolling = true;
            _diagram.EnableAxisXZooming = true;
            _diagram.EnableAxisYZooming = true;
            _default_pane = _diagram.DefaultPane;
            _bottom_pane = (XYDiagramPane)_diagram.FindPaneByName("BottomPanel");
            _diagram.AxisX.TimeSpanScaleOptions.MeasureUnit = TimeSpanMeasureUnit.Minute;
            _diagram.AxisX.TimeSpanScaleOptions.ScaleMode = ScaleMode.Continuous;
            _axis_x_flow = _diagram.AxisX;
            _axis_y_head = _diagram.AxisY;
@@ -61,20 +68,21 @@
            _axis_y_eff.Alignment = AxisAlignment.Far;
            _axis_x_flow.Visibility = DefaultBoolean.False;
            _axis_x_flow.GridLines.Visible = false;
            _axis_y_head.Visibility = DefaultBoolean.False;
            _axis_y_head.GridLines.Visible = false;
            _axis_y_eff.Visibility = DefaultBoolean.False;
            _axis_y_eff.GridLines.Visible = false;
            this.chartControl1.CrosshairEnabled = DefaultBoolean.True;
        }
        /// <summary>
        /// 设置图表
        /// </summary>
        public void SetBindingData(List<FlowPressChartViewModel> vm_list)
        public void SetBindingData(List<FlowPressChartViewModel> vm_list,DataTable dataTable)
        {
            var view = gridControl1.MainView as GridView;
            view.Columns.Clear();
            this.chartControl1.BeginInit();
            this.chartControl1.Series.Clear();
@@ -96,10 +104,15 @@
            AxisYBase axis_y = null;
            XYDiagramPaneBase pane = null;
            var colTime = new GridColumn();
            colTime.FieldName = "时间";
            colTime.Caption = "时间";
            colTime.Visible = true;
            view.Columns.Add(colTime);
            foreach (var vm in vm_list)
            {
                if (vm.Name.Contains("压力"))
                if (!vm.Name.Contains("压力"))
                {
                    axis_x = _axis_x_flow;
                    axis_y = _axis_y_head;
@@ -112,11 +125,26 @@
                    pane = _default_pane;
                }
                var col = new GridColumn();
                col.FieldName = vm.Name;
                col.Caption = vm.Name;
                col.Visible = true;
                view.Columns.Add(col);
                AddLineSeries(vm.Name, axis_x, axis_y, pane, vm.Datas);
            }
            var min_x = vm_list.SelectMany(x => x.Datas).Min(x => TimeSpan.Parse(x.Time));
            var max_x = vm_list.SelectMany(x => x.Datas).Max(x => TimeSpan.Parse(x.Time));
            _axis_x_flow.NumericScaleOptions.AutoGrid = false;
            _axis_x_flow.WholeRange.SideMarginsValue = 0;
            _axis_x_flow.VisualRange.SideMarginsValue = 0;
            _axis_x_flow.WholeRange.SetMinMaxValues(min_x, max_x);
            _axis_x_flow.VisualRange.SetMinMaxValues(min_x, max_x);
            gridControl1.DataSource = dataTable;
            this.chartControl1.EndInit();
        }
@@ -153,13 +181,17 @@
            view.EmptyPointOptions.Color = Color.Transparent;
            view.Pane = pane;
            var series_pt_list = pt_list.Select(x => new SeriesPoint(x.Time, x.Y)).ToArray();
            var series_pt_list = pt_list.Select(x => new SeriesPoint(TimeSpan.Parse(x.Time), x.Y)).ToArray();
            var series = new DevExpress.XtraCharts.Series();
            series.Tag = id;
            series.ShowInLegend = false;
            series.ArgumentScaleType = DevExpress.XtraCharts.ScaleType.DateTime;
            //series.ShowInLegend = false;
            series.Name = id;
            series.ArgumentScaleType = DevExpress.XtraCharts.ScaleType.TimeSpan;
            series.TimeSpanSummaryOptions.MeasureUnit = TimeSpanMeasureUnit.Minute;
            series.LabelsVisibility = DevExpress.Utils.DefaultBoolean.False;
            series.CrosshairEnabled = DefaultBoolean.False;
            series.CrosshairEnabled = DefaultBoolean.True;
            series.CrosshairLabelPattern = id + ":{V:N2}";
            series.ToolTipEnabled = DefaultBoolean.False;
            series.SeriesPointsSorting = SortingMode.None;
            series.Visible = true;
@@ -168,98 +200,117 @@
            this.chartControl1.Series.Add(series);
        }
        public static string ParseExcel(string fileName, out List<FlowPressChartViewModel> datalist)
        public static string ParseExcel(string fileName, out List<FlowPressChartViewModel> datalist,out DataTable dataTable)
        {
            datalist = new List<FlowPressChartViewModel>();
            try
            dataTable = new DataTable();
            if (!File.Exists(fileName))
                return "文件不存在";
            int line = 0;
            //初始化文件
            NPOI.HSSF.UserModel.HSSFWorkbook theBook = null;
            using (FileStream file = new FileStream(fileName, FileMode.Open, FileAccess.ReadWrite))
            {
                if (!File.Exists(fileName))
                    return "文件不存在";
                int line = 0;
                theBook = new NPOI.HSSF.UserModel.HSSFWorkbook(file);
            }
                //初始化文件
                NPOI.HSSF.UserModel.HSSFWorkbook theBook = null;
                using (FileStream file = new FileStream(fileName, FileMode.Open, FileAccess.ReadWrite))
                {
                    theBook = new NPOI.HSSF.UserModel.HSSFWorkbook(file);
                }
                //检查表格是否符合
                NPOI.SS.UserModel.ISheet sheet1 = theBook.GetSheet("Sheet1");
            //检查表格是否符合
            NPOI.SS.UserModel.ISheet sheet1 = theBook.GetSheet("Sheet1");
            if (sheet1 == null)
            {
                sheet1 = theBook.GetSheetAt(0);
                if (sheet1 == null)
                    return ("无Sheet数据");
            }
            //标题行
            int title_line_index = 0;
            var row_title = sheet1.GetRow(title_line_index);
            if (row_title == null)
            {
                return ("第一行第一列不能空");
            }
            //开始读取的行
            int start_line = title_line_index + 1;
            var cell_0 = row_title.GetCell(0);
            if (cell_0 == null)
            {
                return ("无法读取表头文件");
            }
            var totalcell = row_title.Cells.Count;
            for (int i = 0; i < totalcell; i++)
            {
                var row_cell = row_title.GetCell(i);
                if (i > 0)
                {
                    sheet1 = theBook.GetSheetAt(0);
                    if (sheet1 == null)
                        return ("无Sheet数据");
                    if (row_cell != null)
                    {
                        datalist.Add(new FlowPressChartViewModel()
                        {
                            Name = row_cell.StringCellValue,
                            Datas = new List<TimeChartViewModel>()
                        });
                    }
                    dataTable.Columns.Add(row_cell.StringCellValue, typeof(double));
                }
                //标题行
                int title_line_index = 0;
                var row_title = sheet1.GetRow(title_line_index);
                if (row_title == null)
                else
                {
                    return ("第一行第一列不能空");
                }
                    dataTable.Columns.Add(row_cell.StringCellValue, typeof(string));
                //开始读取的行
                int start_line = title_line_index + 1;
                var cell_0 = row_title.GetCell(0);
                if (cell_0 == null)
                {
                    return ("无法读取表头文件");
                }
            }
                var totalcell = row_title.Cells.Count;
            NPOI.SS.UserModel.IRow row_temp = null;
            NPOI.SS.UserModel.ICell cell;
            for (line = start_line; line < 10000; line++)
            {
                row_temp = sheet1.GetRow(line);
                if (row_temp == null)
                    break;
                var rowData = new object[totalcell];
                for (int i = 0; i < totalcell; i++)
                {
                    if (i > 0)
                    {
                        var row_cell = row_title.GetCell(i);
                        if (row_cell != null)
                        {
                            datalist.Add(new FlowPressChartViewModel()
                            {
                                Name = row_cell.StringCellValue,
                                Datas = new List<TimeChartViewModel>()
                            });
                        }
                    }
                }
                NPOI.SS.UserModel.IRow row_temp = null;
                NPOI.SS.UserModel.ICell cell;
                for (line = start_line; line < 10000; line++)
                {
                    row_temp = sheet1.GetRow(line);
                    if (row_temp == null)
                        break;
                    for (int i = 0; i < totalcell; i++)
                    try
                    {
                        if (i > 0)
                        {
                            var cell_temp = row_temp.GetCell(i);
                            datalist[i].Datas.Add(new TimeChartViewModel()
                            double yvalue = cell_temp.NumericCellValue;
                            var timevalue = row_temp.GetCell(0).NumericCellValue;
                            //double.TryParse(cell_temp.StringCellValue,out yvalue);
                            datalist[i - 1].Datas.Add(new TimeChartViewModel()
                            {
                                Time = row_temp.GetCell(0).StringCellValue,
                                Y = row_temp.GetCell(i).NumericCellValue,
                                Time = DateTime.FromOADate(timevalue).ToString("HH:mm:ss"),
                                Y = yvalue,
                            });
                            rowData[i] = yvalue;
                        }
                        else
                        {
                            var timevalue = row_temp.GetCell(0).NumericCellValue;
                            rowData[i] = DateTime.FromOADate(timevalue).ToString("HH:mm:ss");
                        }
                    }
                    catch (Exception ex)
                    {
                        var a = ex.Message;
                    }
                }
                return "";
                dataTable.Rows.Add(rowData);
            }
            }
            catch (Exception ex)
            {
                return "文件异常!";
            }
            return "";
        }
    }
}