using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; using System; using System.Collections.Generic; using System.Data; using System.Data.OleDb; using System.IO; using System.Linq; using System.Runtime.CompilerServices; using System.Text; using System.Threading.Tasks; namespace APT.Utility { public class FileUtils { /// /// 读取Excel文件第一个Sheet保存到DataTable中 /// /// /// 开始行项索引 /// public static DataTable ReadExcelTable(string fileNamePath, int startRowIndex) { try { Dictionary startRowIndexs = new Dictionary(); startRowIndexs[0] = startRowIndex; var ds = ReadExcelByOledb(fileNamePath, startRowIndexs); if (ds != null && ds.Tables.Count > 0) return ds.Tables[0]; } catch { } return null; } /// /// 实际读取EXCELsheet /// /// /// /// private static DataTable DoReadExcelByOledb(IWorkbook workbook, int index, int startRowIndex) { DataTable dt = new DataTable(); ISheet sheet = workbook.GetSheetAt(index); if (sheet == null) throw new Exception("获取不到工作簿,工作簿索引:" + index); int rfirst = startRowIndex > 0 ? startRowIndex - 1 : sheet.FirstRowNum; int rlast = sheet.LastRowNum; if (rlast == 0) throw new Exception($"工作簿索引[{index}]的行数据为0,请确认"); IRow row = sheet.GetRow(rfirst); int cfirst = row.FirstCellNum; int clast = row.LastCellNum; //获取sheet页中表的字段值 for (int i = cfirst; i < clast; i++) { if (row.GetCell(i) != null) { var cell = row.GetCell(i); if (cell.CellType == CellType.Numeric) { //NPOI中数字和日期都是NUMERIC类型的,这里对其进行判断是否是日期类型 if (HSSFDateUtil.IsCellDateFormatted(cell))//日期类型 { dt.Columns.Add(cell.DateCellValue.ToString(), System.Type.GetType("System.String")); } else//其他数字类型 { dt.Columns.Add(cell.NumericCellValue.ToString(), System.Type.GetType("System.String")); } } else if (cell.CellType == CellType.Blank)//空数据类型 { dt.Columns.Add("", System.Type.GetType("System.String")); } else if (cell.CellType == CellType.Formula)//公式类型 { HSSFFormulaEvaluator eva = new HSSFFormulaEvaluator(workbook); dt.Columns.Add(eva.Evaluate(cell).StringValue, System.Type.GetType("System.String")); } else //其他类型都按字符串类型来处理 { dt.Columns.Add(cell.StringCellValue, System.Type.GetType("System.String")); } } } row = null; //获取sheet页中表的数据值 for (int i = rfirst + 1; i <= rlast; i++) { IRow ir = sheet.GetRow(i); if (ir == null) continue; DataRow r = dt.NewRow(); for (int j = cfirst; j < clast; j++) { var val = ""; if (ir.GetCell(j) != null) { try { var cell = ir.GetCell(j); if (cell.CellType == CellType.Numeric) { //NPOI中数字和日期都是NUMERIC类型的,这里对其进行判断是否是日期类型 if (HSSFDateUtil.IsCellDateFormatted(cell))//日期类型 { val = cell.DateCellValue.ToString(); } else//其他数字类型 { val = cell.NumericCellValue.ToString(); } } else if (cell.CellType == CellType.Blank)//空数据类型 { } else if (cell.CellType == CellType.Formula)//公式类型 { HSSFFormulaEvaluator eva = new HSSFFormulaEvaluator(workbook); val = eva.Evaluate(cell).StringValue; } else //其他类型都按字符串类型来处理 { val = cell.StringCellValue; } r[j] = val; } catch (Exception ex) { throw new Exception($"数据读取异常,行:{i + 1},列{j + 1},错误详情:{ex.Message}"); } } else { r[j] = val; //wyw 某个空格没数据 } } dt.Rows.Add(r); } return dt; } /// /// Oledb方式读取EXCEL /// /// 文件路径 /// public static DataSet ReadExcelByOledb(string fileNamePath, Dictionary startRowIndexs) { if (!File.Exists(fileNamePath)) return null; var extendName = System.IO.Path.GetExtension(fileNamePath); string connStr = ""; if (extendName == "xlsx") { connStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileNamePath + ";Extended Properties='Excel 12.0;HDR=Yes;IMEX=1;'"; } else { connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0;data source=" + fileNamePath; } DataSet dataSet = new DataSet(); // 读取Excel到DataSet using (FileStream fs = new FileStream(fileNamePath, FileMode.Open, FileAccess.Read)) { IWorkbook workbook = null; if (fileNamePath.IndexOf(".xlsx") > 0) // 2007版本 workbook = new XSSFWorkbook(fs); else if (fileNamePath.IndexOf(".xls") > 0) // 2003版本 workbook = new HSSFWorkbook(fs); try { for (int i = 0; i < workbook.NumberOfSheets; i++) { if (!startRowIndexs.ContainsKey(i)) continue; int startIndex = 0; if (startRowIndexs != null) startRowIndexs.TryGetValue(i, out startIndex); var t = DoReadExcelByOledb(workbook, i, startIndex); if (t != null) dataSet.Tables.Add(t); } } catch (Exception ex) { throw new Exception(ex.Message); } fs.Close(); } return dataSet; } /// /// 特殊导入页面处理 /// /// /// public static List ReadExcelByImport(string fileNamePath) { List importTempDatas = new List(); if (!File.Exists(fileNamePath)) return null; string connStr = ""; var extendName = System.IO.Path.GetExtension(fileNamePath); if (extendName == ".xlsx") { connStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileNamePath + ";Extended Properties='Excel 12.0;HDR=Yes;IMEX=1;'"; } else { connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0;data source=" + fileNamePath; } using (FileStream fs = new FileStream(fileNamePath, FileMode.Open, FileAccess.Read)) { IWorkbook workbook = null; if (fileNamePath.IndexOf(".xlsx") > 0) // 2007版本 workbook = new XSSFWorkbook(fs); else if (fileNamePath.IndexOf(".xls") > 0) // 2003版本 workbook = new HSSFWorkbook(fs); try { for (int i = 0; i < workbook.NumberOfSheets; i++) { int startIndex = 0; importTempDatas = DoReadExcelImport(workbook, i, startIndex); } } catch (Exception ex) { throw new Exception(ex.Message); } fs.Close(); } return importTempDatas; } private static List DoReadExcelImport(IWorkbook workbook, int index, int startRowIndex) { List tempDatas = new List(); ISheet sheet = workbook.GetSheetAt(index); if (sheet == null) throw new Exception("获取不到工作簿,工作簿索引:" + index); int rfirst = startRowIndex > 0 ? startRowIndex - 1 : sheet.FirstRowNum;//行首 int rlast = sheet.LastRowNum;//行尾 if (rlast == 0) throw new Exception($"工作簿索引[{index}]的行数据为0,请确认"); IRow row = sheet.GetRow(rfirst); int cfirst = row.FirstCellNum;//第一行第一列 int clast = row.LastCellNum;//第一行第三列 for (int i = rfirst + 2; i <= rlast; i++)//第三行数据 { IRow ir = sheet.GetRow(1); IRow ir1 = sheet.GetRow(i); for (int j = 0; j < ir.Cells.Count; j++) { ImportTempData tempData = new ImportTempData(); tempData.START_TIME = row.GetCell(2).StringCellValue + "-" + (ir.Cells[j].StringCellValue.Length < 2 ? "0" + ir.Cells[j].StringCellValue : ir.Cells[j].StringCellValue); tempData.Name = ir1.Cells[1].ToString(); tempData.QTY = ir1.Cells[j + 2].ToString(); tempDatas.Add(tempData); } } return tempDatas; } #region 历史数据导入页面处理 /// /// 历史数据导入页面处理 /// /// /// public static List ReadExcelByImportHistData(string fileNamePath) { List importHistDatas = new List(); if (!File.Exists(fileNamePath)) return null; using (FileStream fs = new FileStream(fileNamePath, FileMode.Open, FileAccess.Read)) { IWorkbook workbook = null; if (fileNamePath.IndexOf(".xlsx") > 0) // 2007版本 workbook = new XSSFWorkbook(fs); else if (fileNamePath.IndexOf(".xls") > 0) // 2003版本 workbook = new HSSFWorkbook(fs); try { for (int i = 0; i < workbook.NumberOfSheets; i++) { int startIndex = 2; DoReadExcelImportHistData(workbook, i, startIndex, importHistDatas); } } catch (Exception ex) { throw new Exception(ex.Message); } fs.Close(); } return importHistDatas; } private static List DoReadExcelImportHistData(IWorkbook workbook, int index, int startRowIndex, List histDatas) { ISheet sheet = workbook.GetSheetAt(index); DataTable dt = DoReadExcelByOledb(workbook, index, startRowIndex); if (sheet == null) throw new Exception("获取不到工作簿,工作簿索引:" + index); int rfirst = startRowIndex > 0 ? startRowIndex - 1 : sheet.FirstRowNum;//行首 int rlast = sheet.LastRowNum;//行尾 if (rlast < 2) throw new Exception("工作簿中的数据为空,请确认!" + index); IRow row = sheet.GetRow(rfirst + 1); int cfirst = row.FirstCellNum; int clast = row.LastCellNum; var timeStr = sheet.GetRow(1).GetCell(4).StringCellValue; var sTime = DateTime.Parse(timeStr); for (int i = rfirst - 1; i <= rlast - 2; i++)//第三行数据 { var nTime = sTime; DataRow ir = dt.Rows[i]; if (ir.Table.Rows.Count > 0) { for (int j = 4; j < clast; j++) { if (ir[j]?.ToString().Length != 0) { ImportHistData tempData = new ImportHistData { Name = ir[0].ToString(), Time = nTime, Data = decimal.Parse(ir[j].ToString()), }; histDatas.Add(tempData); } nTime = nTime.AddMonths(1); } } else break; } return histDatas; } #endregion #region 抄表卡数据导入页面处理 /// /// 年抄表卡数据导入页面处理 /// /// /// public static List ReadExcelByImportYearMeterReadData(string fileNamePath) { List importMeterReadDatas = new List(); if (!File.Exists(fileNamePath)) return null; using (FileStream fs = new FileStream(fileNamePath, FileMode.Open, FileAccess.Read)) { IWorkbook workbook = null; if (fileNamePath.IndexOf(".xlsx") > 0) // 2007版本 workbook = new XSSFWorkbook(fs); else if (fileNamePath.IndexOf(".xls") > 0) // 2003版本 workbook = new HSSFWorkbook(fs); try { for (int i = 0; i < workbook.NumberOfSheets; i++) { int startIndex = 2; DoReadExcelImportYearMeterReadData(workbook, i, startIndex, importMeterReadDatas); } } catch (Exception ex) { throw new Exception(ex.Message); } fs.Close(); } return importMeterReadDatas; } private static List DoReadExcelImportYearMeterReadData(IWorkbook workbook, int index, int startRowIndex, List importMeterReadDatas) { ISheet sheet = workbook.GetSheetAt(index); if (sheet == null) throw new Exception("获取不到工作簿,工作簿索引:" + index); int rfirst = startRowIndex > 0 ? startRowIndex - 1 : sheet.FirstRowNum;//行首 int rlast = sheet.LastRowNum;//行尾 if (rlast < 2) throw new Exception("工作簿中的数据为空,请确认!" + index); DataTable dt = DoReadExcelByOledb(workbook, index, startRowIndex); IRow row = sheet.GetRow(rfirst + 1); int clast = row.LastCellNum; //列尾 var timeStr = sheet.GetRow(1).GetCell(4).StringCellValue; var sTime = DateTime.Parse(timeStr); for (int i = rfirst - 1; i <= rlast - 2; i++)//第三行数据 { var nTime = sTime; DataRow ir = dt.Rows[i]; if (ir.Table.Rows.Count > 0) { for (int j = 4; j < clast; j++) { if (ir[j]?.ToString().Length > 0) { ImportMeterReadData meterReadData = new ImportMeterReadData { Name = ir[0].ToString(), Data = decimal.Parse(ir[j].ToString()), Time = nTime, }; if (meterReadData.Name == null) throw new Exception($"第{i + 1}行的器具为空,导入失败"); importMeterReadDatas.Add(meterReadData); } nTime = nTime.AddMonths(1); } } else break; } return importMeterReadDatas; } /// /// 月抄表卡数据导入页面处理 /// /// /// public static List ReadExcelByImportMonthMeterReadData(string fileNamePath) { List importMeterReadDatas = new List(); if (!File.Exists(fileNamePath)) return null; using (FileStream fs = new FileStream(fileNamePath, FileMode.Open, FileAccess.Read)) { IWorkbook workbook = null; if (fileNamePath.IndexOf(".xlsx") > 0) // 2007版本 workbook = new XSSFWorkbook(fs); else if (fileNamePath.IndexOf(".xls") > 0) // 2003版本 workbook = new HSSFWorkbook(fs); try { for (int i = 0; i < workbook.NumberOfSheets; i++) { int startIndex = 2; DoReadExcelImportMonthMeterReadData(workbook, i, startIndex, importMeterReadDatas); } } catch (Exception ex) { throw new Exception(ex.Message); } fs.Close(); } return importMeterReadDatas; } private static List DoReadExcelImportMonthMeterReadData(IWorkbook workbook, int index, int startRowIndex, List importMeterReadDatas) { ISheet sheet = workbook.GetSheetAt(index); if (sheet == null) throw new Exception("获取不到工作簿,工作簿索引:" + index); int rfirst = startRowIndex > 0 ? startRowIndex - 1 : sheet.FirstRowNum;//行首 int rlast = sheet.LastRowNum;//行尾 if (rlast < 2) throw new Exception("工作簿中的数据为空,请确认!" + index); IRow row = sheet.GetRow(rfirst + 1); int clast = row.LastCellNum; DataTable dt = DoReadExcelByOledb(workbook, index, startRowIndex); var timeStr = sheet.GetRow(1).GetCell(4).StringCellValue; var sTime = DateTime.Parse(timeStr); for (int i = rfirst - 1; i <= rlast - 2; i++)//第三行数据 { var nTime = sTime; DataRow ir = dt.Rows[i]; if (ir.Table.Rows.Count > 0) { for (int j = 4; j < clast; j++) { if (ir[j]?.ToString().Length > 0) { ImportMeterReadData meterReadData = new ImportMeterReadData { Name = ir[0].ToString(), Data = decimal.Parse(ir[j].ToString()), Time = nTime, }; if (meterReadData.Name == null) throw new Exception($"第{i + 1}行的器具为空,导入失败"); importMeterReadDatas.Add(meterReadData); } nTime = nTime.AddDays(1); } } else break; } return importMeterReadDatas; } /// /// 日抄表卡数据导入页面处理 /// /// /// public static List ReadExcelByImportDayMeterReadData(string fileNamePath) { List importMeterReadDatas = new List(); if (!File.Exists(fileNamePath)) return null; using (FileStream fs = new FileStream(fileNamePath, FileMode.Open, FileAccess.Read)) { IWorkbook workbook = null; if (fileNamePath.IndexOf(".xlsx") > 0) // 2007版本 workbook = new XSSFWorkbook(fs); else if (fileNamePath.IndexOf(".xls") > 0) // 2003版本 workbook = new HSSFWorkbook(fs); try { for (int i = 0; i < workbook.NumberOfSheets; i++) { int startIndex = 2; DoReadExcelImportDayMeterReadData(workbook, i, startIndex, importMeterReadDatas); } } catch (Exception ex) { throw new Exception(ex.Message); } fs.Close(); } return importMeterReadDatas; } private static List DoReadExcelImportDayMeterReadData(IWorkbook workbook, int index, int startRowIndex, List importMeterReadDatas) { ISheet sheet = workbook.GetSheetAt(index); if (sheet == null) throw new Exception("获取不到工作簿,工作簿索引:" + index); int rfirst = startRowIndex > 0 ? startRowIndex - 1 : sheet.FirstRowNum;//行首 int rlast = sheet.LastRowNum;//行尾 if (rlast < 2) throw new Exception("工作簿中的数据为空,请确认!" + index); IRow row = sheet.GetRow(rfirst + 1); int clast = row.LastCellNum; DataTable dt = DoReadExcelByOledb(workbook, index, startRowIndex); var timeStr = sheet.GetRow(1).GetCell(4).StringCellValue; var sTime = DateTime.Parse(timeStr); for (int i = rfirst - 1; i <= rlast - 2; i++)//第三行数据 { var nTime = sTime; DataRow ir = dt.Rows[i]; if (ir.Table.Rows.Count > 0) { for (int j = 4; j < clast; j++) { if (ir[j]?.ToString().Length > 0) { ImportMeterReadData meterReadData = new ImportMeterReadData { Name = ir[0].ToString(), Data = decimal.Parse(ir[j].ToString()), Time = nTime, }; if (meterReadData.Name == null) throw new Exception($"第{i + 1}行的器具为空,导入失败"); importMeterReadDatas.Add(meterReadData); } nTime = nTime.AddHours(1); } } else break; } return importMeterReadDatas; } #endregion #region 生产记录导入页面处理 /// /// 生产记录数据导入页面处理 /// /// /// public static List ReadExcelByImportProductRecordData(string fileNamePath) { List importMeterReadDatas = new List(); if (!File.Exists(fileNamePath)) return null; using (FileStream fs = new FileStream(fileNamePath, FileMode.Open, FileAccess.Read)) { IWorkbook workbook = null; if (fileNamePath.IndexOf(".xlsx") > 0) // 2007版本 workbook = new XSSFWorkbook(fs); else if (fileNamePath.IndexOf(".xls") > 0) // 2003版本 workbook = new HSSFWorkbook(fs); try { for (int i = 0; i < workbook.NumberOfSheets; i++) { int startIndex = 2; DoReadExcelImportProductRecordData(workbook, i, startIndex, importMeterReadDatas); } } catch (Exception ex) { throw new Exception(ex.Message); } fs.Close(); } return importMeterReadDatas; } private static List DoReadExcelImportProductRecordData(IWorkbook workbook, int index, int startRowIndex, List importMeterReadDatas) { ISheet sheet = workbook.GetSheetAt(index); DataTable dt = DoReadExcelByOledb(workbook, index, startRowIndex); if (sheet == null) throw new Exception("获取不到工作簿,工作簿索引:" + index); int rfirst = startRowIndex > 0 ? startRowIndex - 1 : sheet.FirstRowNum;//行首 int rlast = sheet.LastRowNum;//行尾 if (rlast < 2) throw new Exception("工作簿中的数据为空,请确认!" + index); IRow row = sheet.GetRow(rfirst + 1); for (int i = rfirst - 1; i <= rlast - 2; i++)//第三行数据 { DataRow ir = dt.Rows[i]; if (ir.Table.Rows.Count > 0) { var meterReadData = new ImportProductRecordData() { Product_Code = ir[0].ToString(), Product_Name = ir[1].ToString(), MeterNode_Name = ir[2].ToString(), Team_Name = ir[3].ToString(), Class_Name = ir[4].ToString(), Qty = decimal.Parse(ir[5].ToString()), Start_Time = DateTime.Parse(ir[6].ToString()), End_Time = DateTime.Parse(ir[7].ToString()), Modify_Time = DateTime.Parse(ir[8].ToString()), Order_Status = ir[9].ToString(), Remark = ir.Table.Rows.Count == 10 ? "" : ir[10].ToString(), }; importMeterReadDatas.Add(meterReadData); } else break; } return importMeterReadDatas; } #endregion #region 能源采购导入页面处理 /// /// 能源采购导入页面处理 /// /// /// public static List ReadExcelByImportEnergyPurchaseData(string fileNamePath) { List importEnergyPurchaseDatas = new List(); if (!File.Exists(fileNamePath)) return null; using (FileStream fs = new FileStream(fileNamePath, FileMode.Open, FileAccess.Read)) { IWorkbook workbook = null; if (fileNamePath.IndexOf(".xlsx") > 0) // 2007版本 workbook = new XSSFWorkbook(fs); else if (fileNamePath.IndexOf(".xls") > 0) // 2003版本 workbook = new HSSFWorkbook(fs); try { for (int i = 0; i < workbook.NumberOfSheets; i++) { int startIndex = 2; DoReadExcelImportEnergyPurchaseData(workbook, i, startIndex, importEnergyPurchaseDatas); } } catch (Exception ex) { throw new Exception(ex.Message); } fs.Close(); } return importEnergyPurchaseDatas; } private static List DoReadExcelImportEnergyPurchaseData(IWorkbook workbook, int index, int startRowIndex, List importEnergyPurchaseDatas) { ISheet sheet = workbook.GetSheetAt(index); DataTable dt = DoReadExcelByOledb(workbook, index, startRowIndex); if (sheet == null) throw new Exception("获取不到工作簿,工作簿索引:" + index); int rfirst = startRowIndex > 0 ? startRowIndex - 1 : sheet.FirstRowNum;//行首 int rlast = sheet.LastRowNum;//行尾 if (rlast < 2) throw new Exception("工作簿中的数据为空,请确认!" + index); IRow row = sheet.GetRow(rfirst + 1); for (int i = rfirst - 1; i <= rlast - 2; i++)//第三行数据 { DataRow ir = dt.Rows[i]; if (ir.Table.Rows.Count > 0) { var EnergyPurchaseData = new ImportEnergyPurchaseData() { Energy_Name = ir[0].ToString(), Qty = decimal.Parse(ir[3].ToString()), Batch = ir[4].ToString(), Plan_Date = DateTime.Parse(ir[5].ToString()), }; importEnergyPurchaseDatas.Add(EnergyPurchaseData); } else break; } return importEnergyPurchaseDatas; } #endregion #region 生产记录导入 /// /// 生产记录导入 /// /// /// public static List ReadExcelByImportProductionRecords(string fileNamePath) { var importMeterReadDatas = new List(); if (!File.Exists(fileNamePath)) return null; using (FileStream fs = new FileStream(fileNamePath, FileMode.Open, FileAccess.Read)) { IWorkbook workbook = null; if (fileNamePath.IndexOf(".xlsx") > 0) // 2007版本 workbook = new XSSFWorkbook(fs); else if (fileNamePath.IndexOf(".xls") > 0) // 2003版本 workbook = new HSSFWorkbook(fs); try { for (int i = 0; i < workbook.NumberOfSheets; i++) { int startIndex = 3; DoReadExcelImportProductionRecords(workbook, i, startIndex, importMeterReadDatas); } } catch (Exception ex) { throw new Exception(ex.Message); } fs.Close(); } return importMeterReadDatas; } private static void DoReadExcelImportProductionRecords(IWorkbook workbook, int index, int startRowIndex, List importMeterReadDatas) { ISheet sheet = workbook.GetSheetAt(index); DataTable dt = DoReadExcelByOledb(workbook, index, startRowIndex); if (sheet == null) throw new Exception("获取不到工作簿,工作簿索引:" + index); int rlast = sheet.LastRowNum;//行尾 if (rlast < startRowIndex) throw new Exception("工作簿中的数据为空,请确认!" + index); IRow row = sheet.GetRow(1); var nodeName = row.Cells[0].ToString(); var cloumn = sheet.GetRow(2).Cells; for (int i = 0; i < dt.Rows.Count; i++)//第三行数据 { DataRow ir = dt.Rows[i]; if (string.IsNullOrEmpty(ir[0].ToString())) continue; var items = GetTimeRatio(ir[0].ToString(), ir[1].ToString().Split(',')); var total = items.Sum(x => x.Minute); foreach (var item in items) { for (int j = 5; j < cloumn.Count; j++) { var model = new ImportProductRecordData { Product_Name = cloumn[j].ToString(), MeterNode_Name = nodeName, Class_Name = ir[2].ToString(), Team_Name = ir[3].ToString(), Start_Time = item.StartTime, End_Time = item.EndTime }; if (items.Count > 1) { var qty = decimal.Parse(ir[j].ToString()); var workHour = decimal.Parse(ir[4].ToString()); var ratio = total == 0 ? 0 : item.Minute / total; model.Qty = qty * ratio; model.WorkHour = workHour * ratio; } else { model.Qty = decimal.Parse(ir[j].ToString()); model.WorkHour = decimal.Parse(ir[4].ToString()); } importMeterReadDatas.Add(model); } } } } private static List GetTimeRatio(string date, string[] array) { var list = new List(); foreach (var item in array) { var split = item.Split('-'); var st = DateTime.Parse($"{date} {split[0]}"); var et = DateTime.Parse($"{date} {split[1]}"); var minute = (et - st).TotalMinutes; list.Add(new TimeRatio { StartTime = st, EndTime = et, Minute = (decimal)minute }); } return list; } #region 生产记录按部门导入 public static List ReadExcelByImportDeptRecords(string fileNamePath) { var importDeptReadDatas = new List(); if (!File.Exists(fileNamePath)) return null; using (FileStream fs = new FileStream(fileNamePath, FileMode.Open, FileAccess.Read)) { IWorkbook workbook = null; if (fileNamePath.IndexOf(".xlsx") > 0) // 2007版本 workbook = new XSSFWorkbook(fs); else if (fileNamePath.IndexOf(".xls") > 0) // 2003版本 workbook = new HSSFWorkbook(fs); try { for (int i = 0; i < workbook.NumberOfSheets; i++) { int startIndex = 3; DoReadExcelImportDeptRecords(workbook, i, startIndex, importDeptReadDatas); } } catch (Exception ex) { throw new Exception(ex.Message); } fs.Close(); } return importDeptReadDatas; } private static void DoReadExcelImportDeptRecords(IWorkbook workbook, int index, int startRowIndex, List importDeptReadDatas) { ISheet sheet = workbook.GetSheetAt(index); DataTable dt = DoReadExcelByOledb(workbook, index, startRowIndex); if (sheet == null) throw new Exception("获取不到工作簿,工作簿索引:" + index); int rlast = sheet.LastRowNum;//行尾 if (rlast < startRowIndex) throw new Exception("工作簿中的数据为空,请确认!" + index); IRow row = sheet.GetRow(1); var nodeName = row.Cells[0].ToString(); var cloumn = sheet.GetRow(2).Cells; for (int i = 0; i < dt.Rows.Count; i++)//第三行数据 { DataRow ir = dt.Rows[i]; if (string.IsNullOrEmpty(ir[0].ToString())) continue; for (int colIndex = 1; colIndex < cloumn.Count; colIndex++) { var model = new ImportDeptRecordData { Equip_Name = ir[0].ToString(), Dept_Name = nodeName, Qty = decimal.Parse(ir[colIndex].ToString()), Time = Convert.ToDateTime(cloumn[colIndex].ToString()) }; importDeptReadDatas.Add(model); } } } #endregion #endregion #region 生产计划导入 /// /// 生产计划导入 /// /// /// public static List ReadExcelByImportProductionPlans(string fileNamePath) { var importMeterReadDatas = new List(); if (!File.Exists(fileNamePath)) return null; using (FileStream fs = new FileStream(fileNamePath, FileMode.Open, FileAccess.Read)) { IWorkbook workbook = null; if (fileNamePath.IndexOf(".xlsx") > 0) // 2007版本 workbook = new XSSFWorkbook(fs); else if (fileNamePath.IndexOf(".xls") > 0) // 2003版本 workbook = new HSSFWorkbook(fs); try { for (int i = 0; i < workbook.NumberOfSheets; i++) { int startIndex = 3; DoReadExcelImportProductionPlans(workbook, i, startIndex, importMeterReadDatas); } } catch (Exception ex) { throw new Exception(ex.Message); } fs.Close(); } return importMeterReadDatas; } private static void DoReadExcelImportProductionPlans(IWorkbook workbook, int index, int startRowIndex, List importMeterReadDatas) { ISheet sheet = workbook.GetSheetAt(index); DataTable dt = DoReadExcelByOledb(workbook, index, startRowIndex); if (sheet == null) throw new Exception("获取不到工作簿,工作簿索引:" + index); int rlast = sheet.LastRowNum;//行尾 if (rlast < startRowIndex) throw new Exception("工作簿中的数据为空,请确认!" + index); IRow row = sheet.GetRow(1); var nodeName = row.Cells[0].ToString(); var cloumn = sheet.GetRow(2).Cells; for (int i = 0; i < dt.Rows.Count; i++)//第三行数据 { DataRow ir = dt.Rows[i]; if (string.IsNullOrEmpty(ir[0].ToString())) continue; for (int j = 1; j < cloumn.Count; j++) { var model = new ImportProductPlanData { Product_Name = cloumn[j].ToString(), MeterNode_Name = nodeName, Start_Time = Convert.ToDateTime(ir[0].ToString() + " 00:00:00"), End_Time = Convert.ToDateTime(ir[0].ToString() + " 23:59:59"), Qty = decimal.Parse(ir[j].ToString() == "" ? "0" : ir[j].ToString()) }; importMeterReadDatas.Add(model); } } } #endregion #region 公共方法 #endregion } public class TimeRatio { public DateTime StartTime { get; set; } public DateTime EndTime { get; set; } /// /// 间隔分钟数 /// public decimal Minute { get; set; } } }