using DevExpress.CodeParser; using DevExpress.Spreadsheet; using HStation.Assets; using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; using System.IO; namespace HStation.WinFrmUI { public class ElbowExcelHelper { public static string ParseElbowExcel(string fileName, out List list) { list = new List(); if (!File.Exists(fileName)) return "文件不存在"; int line = 0; NPOI.SS.UserModel.IWorkbook workbook; using (FileStream file = new(fileName, FileMode.Open, FileAccess.Read)) { if (Path.GetExtension(fileName).ToLower() == ".xls") { workbook = new HSSFWorkbook(file); } else if (Path.GetExtension(fileName).ToLower() == ".xlsx") { workbook = new XSSFWorkbook(file); } else { return "不支持的文件格式"; } } ISheet sheet_ql = workbook.GetSheet("sheet1"); if (sheet_ql == null) { return "表格不符合格式"; } //标题行 int title_line_index = 0; //名称列 int col_index_name = 0; //类型列 int col_index_type = 1; //口径列 int col_index_caliber = 2; //材料列 int col_index_materials = 3; //系数列 int col_index_coefficient = 4; //角度列 int col_index_angle = 5; //备注列 int col_index_descriptions = 6; 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; for (line = start_line; line < 1000; line++) { row_temp = sheet_ql.GetRow(line); if (row_temp == null) break; var name = row_temp.GetCell(col_index_name); if (name == null) break; var type = row_temp.GetCell(col_index_type); eElbowType? eElbowType = null; switch (type.StringCellValue) { case "短径": eElbowType = HStation.Assets.eElbowType.Short; break; case "中径": eElbowType = HStation.Assets.eElbowType.Middle; break; case "长径": eElbowType = HStation.Assets.eElbowType.Long; break; } cell = row_temp.GetCell(col_index_caliber); if (cell == null) break; if (!ParseCellValue(cell, out double? caliber)) break; if (caliber < 0) break; var material = row_temp.GetCell(col_index_materials); if (material == null) break; cell = row_temp.GetCell(col_index_coefficient); if (cell == null) break; if (!ParseCellValue(cell, out double coefficient)) break; if (coefficient < 0) break; cell = row_temp.GetCell(col_index_angle); if (cell == null) break; if (!ParseCellValue(cell, out int angle)) break; if (angle < 0) break; list.Add(new Vmo.AssetsElbowMainVmo { Name = name.StringCellValue, Caliber = caliber, ElbowType = eElbowType, Material = material.StringCellValue, MinorLoss = coefficient, Angle = angle, Description = row_temp.GetCell(col_index_descriptions)?.StringCellValue, }); } if (list == null || !list.Any()) { return ("表格不符合格式"); } return ""; } 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; } //转换可以为空 private static bool ParseCellValue(NPOI.SS.UserModel.ICell cell, out double? cell_value) { cell_value = null; 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; } else if (cell.StringCellValue == null) { return true; } } if (cell.CellType == NPOI.SS.UserModel.CellType.Blank) { return true; } return false; } private static bool ParseCellValue(NPOI.SS.UserModel.ICell cell, out int cell_value) { cell_value = 0; if (cell.CellType == NPOI.SS.UserModel.CellType.Numeric) { cell_value = (int)cell.NumericCellValue; return true; } if (cell.CellType == NPOI.SS.UserModel.CellType.String) { if (int.TryParse(cell.StringCellValue, out int value)) { cell_value = value; return true; } } return false; } public static void ExportElbowTemplate(string file_path) { NPOI.HSSF.UserModel.HSSFWorkbook theBook = new NPOI.HSSF.UserModel.HSSFWorkbook(); var theSheet1 = theBook.CreateSheet("Sheet1"); NPOI.SS.UserModel.IRow rowTile1 = theSheet1.CreateRow(0); rowTile1.CreateCell(0).SetCellValue("名称"); rowTile1.CreateCell(1).SetCellValue("类型"); rowTile1.CreateCell(2).SetCellValue("口径"); rowTile1.CreateCell(3).SetCellValue("材料"); rowTile1.CreateCell(4).SetCellValue("局阻系数"); rowTile1.CreateCell(5).SetCellValue("角度"); rowTile1.CreateCell(6).SetCellValue("备注"); theSheet1.ForceFormulaRecalculation = true; using FileStream fs = File.OpenWrite(file_path); theBook.Write(fs); } } }