Shuxia Ning
2025-01-10 4d95d752823b1f5362c5d639001444b260b90395
WinFrmUI/Yw.WinFrmUI.Phart.Core/00-core/01-helper/PhartExcelHelper.cs
@@ -46,6 +46,30 @@
        }
        public static void ExportValveTemplate(string file_path)
        {
            NPOI.HSSF.UserModel.HSSFWorkbook theBook = new NPOI.HSSF.UserModel.HSSFWorkbook();
            var theSheet1 = theBook.CreateSheet("流量损失");
            NPOI.SS.UserModel.IRow rowTile1 = theSheet1.CreateRow(0);
            rowTile1.CreateCell(0).SetCellValue("开度 %");
            rowTile1.CreateCell(1).SetCellValue("流量 m³/h");
            rowTile1.CreateCell(2).SetCellValue("水头损失 m");
            var theSheet2 = theBook.CreateSheet("开度损失");
            NPOI.SS.UserModel.IRow rowTile2 = theSheet2.CreateRow(0);
            rowTile2.CreateCell(0).SetCellValue("开度 %");
            rowTile2.CreateCell(1).SetCellValue("损失系数 k");
            theSheet1.ForceFormulaRecalculation = true;
            theSheet2.ForceFormulaRecalculation = true;
            using FileStream fs = File.OpenWrite(file_path);
            theBook.Write(fs);
        }
        #endregion
        #region Parse
@@ -263,6 +287,161 @@
            return "";
        }
        public static string ParseValveExcel(string fileName, out List<(Yw.Ahart.eCurveType CurveType, List<Yw.Geometry.Point2d> DefPointList, int Opening)> list)
        {
            list = new List<(Ahart.eCurveType CurveType, List<Geometry.Point2d> DefPointList, int Opening)>();
            if (!File.Exists(fileName))
                return "文件不存在";
            int line = 0;
            //初始化文件
            NPOI.HSSF.UserModel.HSSFWorkbook theBook = null;
            using (FileStream file = new(fileName, FileMode.Open, FileAccess.Read))
                theBook = new NPOI.HSSF.UserModel.HSSFWorkbook(file);
            //检查表格是否符合
            NPOI.SS.UserModel.ISheet sheet_ql = theBook.GetSheet("流量损失");
            if (sheet_ql != null)
            {
                //标题行
                int title_line_index = 0;
                //开度列
                int col_index_opening = 0;
                //流量列
                int col_index_flow = 1;
                //水头损失列
                int col_index_head_loss = 2;
                var row_title = sheet_ql.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 ("无法读取表头文件");
                }
                NPOI.SS.UserModel.IRow row_temp = null;
                NPOI.SS.UserModel.ICell cell;
                var cell_value_list = new List<(double Opening, double Flow, double HeadLoss)>();
                for (line = start_line; line < 1000; line++)
                {
                    row_temp = sheet_ql.GetRow(line);
                    if (row_temp == null)
                        break;
                    cell = row_temp.GetCell(col_index_opening);
                    if (cell == null)
                        break;
                    if (!ParseCellValue(cell, out double opening))
                        break;
                    if (opening < 0 || opening > 100)
                        break;
                    cell = row_temp.GetCell(col_index_flow);
                    if (cell == null)
                        break;
                    if (!ParseCellValue(cell, out double flow))
                        break;
                    if (flow < 0)
                        break;
                    cell = row_temp.GetCell(col_index_head_loss);
                    if (cell == null)
                        break;
                    if (!ParseCellValue(cell, out double head_loss))
                        break;
                    if (head_loss < 0)
                        break;
                    cell_value_list.Add((opening, flow, head_loss));
                }
                var opening_group = cell_value_list.GroupBy(x => x.Opening);
                foreach (var item in opening_group)
                {
                    var pt_list = item.Select(x => new Yw.Geometry.Point2d(x.Flow, x.HeadLoss));
                    list.Add((Yw.Ahart.eCurveType.QL, pt_list.ToList(), (int)item.Key));
                }
            }
            //检查表格是否符合
            NPOI.SS.UserModel.ISheet sheet_ol = theBook.GetSheet("开度损失");
            if (sheet_ol != null)
            {
                //标题行
                int title_line_index = 0;
                //开度列
                int col_index_opening = 0;
                //损失系数列
                int col_index_k = 1;
                var row_title = sheet_ol.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 ("无法读取表头文件");
                }
                NPOI.SS.UserModel.IRow row_temp = null;
                NPOI.SS.UserModel.ICell cell;
                var pt_list = new List<Yw.Geometry.Point2d>();
                for (line = start_line; line < 1000; line++)
                {
                    row_temp = sheet_ol.GetRow(line);
                    if (row_temp == null)
                        break;
                    cell = row_temp.GetCell(col_index_opening);
                    if (cell == null)
                        break;
                    if (!ParseCellValue(cell, out double opening))
                        break;
                    if (opening < 0 || opening > 100)
                        break;
                    cell = row_temp.GetCell(col_index_k);
                    if (cell == null)
                        break;
                    if (!ParseCellValue(cell, out double k))
                        break;
                    if (k < 0)
                        break;
                    pt_list.Add(new Geometry.Point2d(opening, k));
                }
                list.Add((Yw.Ahart.eCurveType.OL, pt_list.ToList(), 100));
            }
            if (list == null || !list.Any())
            {
                return ("表格不符合格式");
            }
            return "";
        }
        private static bool ParseCellValue(NPOI.SS.UserModel.ICell cell, out double cell_value)
        {
            cell_value = 0;