using System.IO; using Yw.WinFrmUI.Phart; namespace HStation.WinFrmUI.Assets { public class ExcelConvertHelper { public static Yw.Vmo.PhartDiagramExGraphListVmo ParsePumpExcel(string fileName) { var qh = new List(); var qe = new List(); var qp = new List(); try { if (!File.Exists(fileName)) throw new Exception("文件不存在"); int line = 0; //初始化文件 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"); if (sheet1 == null) { sheet1 = theBook.GetSheetAt(0); if (sheet1 == null) throw new Exception("无Sheet数据"); } //标题行 int title_line_index = 0; //流量列 int col_index_q = 1; //扬程列 int col_index_h = 2; //效率列 int col_index_e = 3; //功率列 int col_index_p = 4; var row_title = sheet1.GetRow(title_line_index); if (row_title == null) { throw new Exception("第一行第一列不能空"); } //开始读取的行 int start_line = title_line_index + 1; var cell_0 = row_title.GetCell(0); if (cell_0 == null) { throw new Exception("无法读取表头文件"); } else if (cell_0.StringCellValue.Contains("序号")) { col_index_q = 1; col_index_h = 2; col_index_e = 3; col_index_p = 4; } else if (cell_0.StringCellValue.Contains("流量")) { col_index_q = 0; col_index_h = 1; col_index_e = 2; col_index_p = 3; } NPOI.SS.UserModel.IRow row_temp = null; NPOI.SS.UserModel.ICell cell; var list = new List<(double Q, double H, double P, double E)>(); for (line = start_line; line < 13; line++) { row_temp = sheet1.GetRow(line); if (row_temp == null) break; cell = row_temp.GetCell(col_index_q); if (cell == null) break; if (!ParseCellValue(cell, out double flow)) break; if (flow < 0) break; cell = row_temp.GetCell(col_index_h); if (cell == null) break; if (!ParseCellValue(cell, out double head)) break; if (head < 0) break; cell = row_temp.GetCell(col_index_e); if (cell == null) break; if (!ParseCellValue(cell, out double eff)) { eff = -1; } cell = row_temp.GetCell(col_index_p); if (cell == null) break; if (!ParseCellValue(cell, out double power)) { power = -1; } if (eff > 0) { power = Yw.Pump.CalculationHelper.CalcuP(flow, head, eff); } else { eff = Yw.Pump.CalculationHelper.CalcuE(flow, head, power); } if (eff > 99) { throw new Exception("效率大于100%"); } qh.Add(new Yw.Geometry.Point2d(flow, head)); qe.Add(new Yw.Geometry.Point2d(flow, eff)); qp.Add(new Yw.Geometry.Point2d(flow, power)); } if (qh == null || qh.Count < 4) { return null; } var feat_type = Yw.Ahart.eFeatType.Cubic; var vmo = new Yw.Vmo.PhartDiagramExGraphListVmo(); vmo.DiagramType = (int)HStation.PhartRelation.eDiagramType.Feat; vmo.GraphList = new List(); var graph_qh = new Yw.Vmo.PhartGraphVmo() { Name = "扬程线", GraphType = (int)Yw.Ahart.eCurveType.QH, GraphParas = new QHGraphParasViewModel() { Hz = 50, }.ToJson(), GeometryParas = new Yw.WinFrmUI.Phart.CurveGeometryParasViewModel { DefinePoints = qh }.ToJson(), GeometryStyle = (int)HStation.PhartRelation.eGeometryStyle.FeatCurve, GeometryInfo = qh.ToDbString(Yw.Ahart.eCurveType.QH, feat_type) }; vmo.GraphList.Add(graph_qh); if (qe != null && qe.Count > 3) { var graph_qe = new Yw.Vmo.PhartGraphVmo() { Name = "效率线", GraphType = (int)Yw.Ahart.eCurveType.QE, GraphParas = new QEGraphParasViewModel() { Hz = 50, }.ToJson(), GeometryParas = new Yw.WinFrmUI.Phart.CurveGeometryParasViewModel { DefinePoints = qe }.ToJson(), GeometryStyle = (int)HStation.PhartRelation.eGeometryStyle.FeatCurve, GeometryInfo = qe.ToDbString(Yw.Ahart.eCurveType.QE, feat_type) }; vmo.GraphList.Add(graph_qe); } if (qp != null && qp.Count > 3) { var graph_qp = new Yw.Vmo.PhartGraphVmo() { Name = "功率线", GraphType = (int)Yw.Ahart.eCurveType.QP, GraphParas = new QPGraphParasViewModel() { Hz = 50, }.ToJson(), GeometryParas = new Yw.WinFrmUI.Phart.CurveGeometryParasViewModel { DefinePoints = qp }.ToJson(), GeometryStyle = (int)HStation.PhartRelation.eGeometryStyle.FeatCurve, GeometryInfo = qp.ToDbString(Yw.Ahart.eCurveType.QP, feat_type) }; vmo.GraphList.Add(graph_qp); } return vmo; } catch (Exception ex) { throw; } } private static bool ParseCellValue(NPOI.SS.UserModel.ICell cell, out double cell_value) { cell_value = 0; if (cell.CellType == NPOI.SS.UserModel.CellType.Numeric) { cell_value = cell.NumericCellValue; return true; } if (cell.CellType == NPOI.SS.UserModel.CellType.String) { if (double.TryParse(cell.StringCellValue, out double value)) { cell_value = value; return true; } } return false; } } }