using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; using System; using System.Collections.Generic; using System.IO; namespace AStation.WinFrmUI.Chart { /// /// ExcelFileHelper /// public class CurveExpressFileHelper { public static List ImportByExcel(string fileName, out string msg) { msg = string.Empty; if (!File.Exists(fileName)) { msg = "文件不存在!"; return default; } var list = new List(); int line = 0; try { //初始化文件 HSSFWorkbook theBook = null; using (FileStream file = new FileStream(fileName, FileMode.Open, FileAccess.Read)) { theBook = new HSSFWorkbook(file); } //检查表格是否符合 NPOI.SS.UserModel.ISheet sheet1 = theBook.GetSheet("Sheet1"); if (sheet1 == null) { sheet1 = theBook.GetSheetAt(0); if (sheet1 == null) { msg = "请将数据放在Sheet1中!"; return default; } } //标题行 int titleLineIndex = 0; //流量列 int colIndexQ = 1; //扬程列 int colIndexH = 2; //效率列 int colIndexE = 3; //功率列 int colIndexP = 4; var rowTitle = sheet1.GetRow(titleLineIndex); if (rowTitle == null) { msg = "第一行第一列不能空!"; return default; } //开始读取的行 int startLine = titleLineIndex + 1; var cell_0 = rowTitle.GetCell(0); if (cell_0 == null) { msg = "无法读取表头文件"; return default; } else if (cell_0.StringCellValue.Contains("序号")) { colIndexQ = 1; colIndexH = 2; colIndexE = 3; colIndexP = 4; } else if (cell_0.StringCellValue.Contains("流量")) { colIndexQ = 0; colIndexH = 1; colIndexE = 2; colIndexP = 3; } double q, h, eta, power; NPOI.SS.UserModel.IRow rowTemp = null; NPOI.SS.UserModel.ICell cell; var index = 1; for (line = startLine; line < 1000; line++) { q = h = eta = power = -1; rowTemp = sheet1.GetRow(line); if (rowTemp == null) break; cell = rowTemp.GetCell(colIndexQ); if (cell == null) break; if (cell.CellType == NPOI.SS.UserModel.CellType.Numeric) q = cell.NumericCellValue; else if (cell.CellType == NPOI.SS.UserModel.CellType.String) q = Convert.ToDouble(cell.StringCellValue); else continue; if (q < 0) break; cell = rowTemp.GetCell(colIndexH); if (cell == null) break; if (cell.CellType == NPOI.SS.UserModel.CellType.Numeric) h = cell.NumericCellValue; else if (cell.CellType == NPOI.SS.UserModel.CellType.String) h = Convert.ToDouble(cell.StringCellValue); else if (cell.CellType == NPOI.SS.UserModel.CellType.Blank) break; if (h < 0) break; cell = rowTemp.GetCell(colIndexE); if (cell == null) break; if (cell.CellType == NPOI.SS.UserModel.CellType.Numeric) eta = cell.NumericCellValue; else if (cell.CellType == NPOI.SS.UserModel.CellType.String) eta = Convert.ToDouble(cell.StringCellValue); else eta = -1; cell = rowTemp.GetCell(colIndexP); if (cell == null) break; if (cell.CellType == NPOI.SS.UserModel.CellType.Numeric) power = cell.NumericCellValue; else if (cell.CellType == NPOI.SS.UserModel.CellType.String) power = Convert.ToDouble(cell.StringCellValue); else power = -1; if (eta > 0) { power = AStation.Curve.PumpCalculateHelper.CalculateP(q, h, eta); } else { eta = AStation.Curve.PumpCalculateHelper.CalculateE(q, h, power); } if (eta > 99) { throw new Exception("效率大于100%"); } list.Add(new AStation.Curve.GroupPoint(index++, q, h, eta, power)); } if (list.Count < 4) { msg = "导入点过少,请手动添加点,点数至少4个点"; return default; } } catch (Exception err) { msg = string.Format("读取Excel出错!错误原因:{0},行号: {1}", err.Message, line); } return list; } public static Model.PumpCurveInfo ImportByCurveExpress(string fileName, out string msg) { msg = string.Empty; if (!File.Exists(fileName)) { msg = "文件不存在!"; return default; } var strInfo = File.ReadAllText(fileName); if (string.IsNullOrEmpty(strInfo)) { msg = "无数据!"; return default; } var express = Model.PumpCurveInfo.ToModel(strInfo); if (express == null) { msg = "解析失败!"; return default; } return express; } public static bool ExportCurveExpress(string fileName, Model.PumpCurveInfo featCurveExpressGroup, out string msg) { msg = string.Empty; if (featCurveExpressGroup == null) { msg = "表达式为空!"; return default; } try { var str = featCurveExpressGroup.ToJson(); File.WriteAllText(fileName, str); } catch (Exception ex) { msg = ex.Message; } return true; } public static bool Export2Excel(string fileName, Model.PumpCurveInfo featCurveExpressGroup, out string msg, int fitPointNumQH = 12) { msg = string.Empty; if (featCurveExpressGroup == null) { msg = "曲线表达式为空!"; return default; } return Export2Excel(fileName, featCurveExpressGroup.CurveQH, featCurveExpressGroup.CurveQE, featCurveExpressGroup.CurveQP, out msg, fitPointNumQH); } public static bool Export2Excel(string fileName, AStation.Curve.CurveExpress curveExpressQH, AStation.Curve.CurveExpress curveExpressQE, AStation.Curve.CurveExpress curveExpressQP, out string msg, int fitPointNumQH = 12) { msg = string.Empty; if (curveExpressQH == null) { msg = "流量扬程曲线为空!"; return default; } if (!File.Exists(fileName)) { File.Create(fileName); } try { HSSFWorkbook theBook = null; using (FileStream file = new FileStream(fileName, FileMode.Open, FileAccess.Read)) { theBook = new HSSFWorkbook(file); if (theBook == null) { msg = "Excel初始化失败!"; return default; } var dsi = NPOI.HPSF.PropertySetFactory.CreateDocumentSummaryInformation(); dsi.Company = "EvenTech"; theBook.DocumentSummaryInformation = dsi; var si = NPOI.HPSF.PropertySetFactory.CreateSummaryInformation(); si.Subject = "yiwei"; theBook.SummaryInformation = si; } ISheet theSheet1 = theBook.CreateSheet("Sheet1"); theSheet1.ForceFormulaRecalculation = true; IRow rowTile = theSheet1.CreateRow(0); rowTile.CreateCell(0).SetCellValue("序号"); rowTile.CreateCell(1).SetCellValue("流量"); rowTile.CreateCell(2).SetCellValue("扬程"); rowTile.CreateCell(3).SetCellValue("效率"); rowTile.CreateCell(4).SetCellValue("功率"); //均匀插值点,计算点坐标 double rQmin = curveExpressQH.Min; double rQmax = curveExpressQH.Max; double space = (rQmax - rQmin) / (fitPointNumQH - 1); double Q = rQmin; double H, E, P; for (int i = 0; i < fitPointNumQH; i++) { H = AStation.Curve.FitHelper.GetFitPointY(curveExpressQH, Q); P = AStation.Curve.FitHelper.GetFitPointY(curveExpressQP, Q); var eta = AStation.Curve.FitHelper.GetFitPointY(curveExpressQE, Q); int col = 0; IRow rowtemp = theSheet1.CreateRow(i + 1); rowtemp.CreateCell(col).SetCellValue(i + 1);//序号 col++; rowtemp.CreateCell(col).SetCellValue(DoubleTrans(Q)); col++; rowtemp.CreateCell(col).SetCellValue(DoubleTrans(H)); col++; if (curveExpressQE != null && Q <= curveExpressQE.Max && Q >= curveExpressQE.Min) { if (Q < 0.1) E = 0; else E = AStation.Curve.FitHelper.GetFitPointY(curveExpressQE, Q); rowtemp.CreateCell(col).SetCellValue(DoubleTrans(E)); col++; } if (curveExpressQP != null && Q <= curveExpressQP.Max && Q >= curveExpressQP.Min) { P = AStation.Curve.FitHelper.GetFitPointY(curveExpressQP, Q); rowtemp.CreateCell(col).SetCellValue(DoubleTrans(P)); col++; } Q = Q + space; if (Q > curveExpressQH.Max * 0.9999) Q = curveExpressQH.Max * 0.9999; } using (FileStream fs = File.OpenWrite(fileName)) { theBook.Write(fs); } } catch (Exception ex) { msg = ex.Message; } return true; } private static string DoubleTrans(double doubleValue) { if (doubleValue < 1) return doubleValue.ToString("0.0000"); else if (doubleValue < 10) return doubleValue.ToString("0.000"); else if (doubleValue < 100) return doubleValue.ToString("0.00"); else return doubleValue.ToString("0.0"); } } }