using PCHMI; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Data.OleDb; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.Serialization.Formatters.Binary; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using static System.Net.Mime.MediaTypeNames; namespace CowainHmi.Alarm { public class AlarmExcelHelper { public static DataTable ReadReleaseExcel(string fileName, BindingList bindingList) { OleDbConnection oleDbConnection = null; try { string text = new FILE().GET_RELEASE_DIR() + $"\\DATA\\{fileName}.xls"; //string text = Environment.CurrentDirectory + $"\\DATA\\{fileName}.xls"; if (!File.Exists(text)) { SaveBindingListToExcel(bindingList, fileName); } if (File.Exists(text)) { OleDbDataAdapter dataAdapter = new OleDbDataAdapter(); oleDbConnection = new OleDbConnection(CONFIG.Is64Str() + "Data Source=" + text + ";Extended Properties=Excel 8.0;"); try { oleDbConnection.Open(); OleDbCommand selectCommand = new OleDbCommand("SELECT * FROM [Sheet1$]", oleDbConnection); dataAdapter.SelectCommand = selectCommand; DataTable dt = new DataTable(); dataAdapter.Fill(dt); return dt; } catch (Exception ex) { new PClass().WErrTxt("读取报警表格异常:" + ex.ToString()); } finally { oleDbConnection.Close(); } } } finally { oleDbConnection?.Close(); } return null; } public static DataTable ReadErrExcel(string fileName) { OleDbConnection oleDbConnection = null; try { string text = System.Windows.Forms.Application.StartupPath + $"\\DATA\\{fileName}.xls"; if (File.Exists(text)) { OleDbDataAdapter dataAdapter = new OleDbDataAdapter(); oleDbConnection = new OleDbConnection(CONFIG.Is64Str() + "Data Source=" + text + ";Extended Properties=Excel 8.0;"); try { oleDbConnection.Open(); OleDbCommand selectCommand = new OleDbCommand("SELECT * FROM [Sheet1$]", oleDbConnection); dataAdapter.SelectCommand = selectCommand; DataTable dt = new DataTable(); dataAdapter.Fill(dt); return dt; } catch (Exception ex) { new PClass().WErrTxt("读取报警表格异常:" + ex.ToString()); } finally { oleDbConnection.Close(); } } } finally { oleDbConnection?.Close(); } return null; } /// /// 更新实时报警表格 /// public static void UpdateAlarmRT(string pid, string type, string group, string id, string error, bool rw, string fileName) { OleDbConnection oleDbConnection = null; try { if (PClass.SystemRun) { string text = System.Windows.Forms.Application.StartupPath + $"\\UDTA\\{fileName}.xls"; if (!File.Exists(text)) { new JUDGE_DIR().CreateExcelFile(text, "AlarmLog", new string[] { "PLC", "DTIM", "报警类别", "报警组", "ID", "ErrText", "TP", }); } oleDbConnection = new OleDbConnection(CONFIG.Is64Str() + "Data Source=" + text + ";Extended Properties=Excel 8.0;"); oleDbConnection.Open(); DataTable dt = GetAlarmRT(fileName); var dr = dt.Select($"报警类别='{type}' and 报警组='{group}' and ID='{id}'").FirstOrDefault(); string sql = String.Empty; if (dr == null) { if (rw) { sql = $"insert into [AlarmLog$] (PLC,报警类别,报警组,ID,DTIM,TP,ErrText) values('{pid}','{type}','{group}','{id}','{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fffff")}','1','{error}')"; } } else { if (rw) { //更新记录 sql = $"UPDATE [AlarmLog$] SET DTIM='{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fffff")}',TP='1' WHERE 报警类别='{type}' and 报警组='{group}' and ID='{id}' "; } else { //删除记录 sql = $"UPDATE [AlarmLog$] SET DTIM='{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fffff")}',TP='0' WHERE 报警类别='{type}' and 报警组='{group}' and ID='{id}' "; } } if (!string.IsNullOrEmpty(sql)) { new OleDbCommand(sql, oleDbConnection).ExecuteNonQuery(); } } } finally { oleDbConnection?.Close(); } } public static DataTable GetAlarmRT(string fileName) { OleDbConnection oleDbConnection = null; try { string text = System.Windows.Forms.Application.StartupPath + $"\\UDTA\\{fileName}.xls"; if (File.Exists(text)) { OleDbDataAdapter dataAdapter = new OleDbDataAdapter(); oleDbConnection = new OleDbConnection(CONFIG.Is64Str() + "Data Source=" + text + ";Extended Properties=Excel 8.0;"); try { oleDbConnection.Open(); OleDbCommand selectCommand = new OleDbCommand("SELECT * FROM [AlarmLog$]", oleDbConnection); dataAdapter.SelectCommand = selectCommand; DataTable dt = new DataTable(); dataAdapter.Fill(dt); return dt; } catch (Exception ex) { new PClass().WErrTxt("读取实时报警记录错误:" + ex.ToString()); } finally { oleDbConnection.Close(); } } } finally { oleDbConnection?.Close(); } return null; } public static void SaveAlarmLog(string pid, string type, string group, string id, string tp, string error) { OleDbConnection oleDbConnection = null; try { if (PClass.SystemRun) { string text = System.Windows.Forms.Application.StartupPath + "\\UDTA\\AlarmDirectory"; text = text + "\\" + DateTime.Now.ToLocalTime().ToString("yyMMdd") + ".xls"; if (!File.Exists(text)) { new JUDGE_DIR().CreateExcelFile(text, "AlarmLog", new string[] { "PLC", "报警类别", "报警组", "ID", "DTIM", "TP", "ErrText" }); } oleDbConnection = new OleDbConnection(CONFIG.Is64Str() + "Data Source=" + text + ";Extended Properties=Excel 8.0;"); oleDbConnection.Open(); string sql = $"insert into [AlarmLog$] (PLC,报警类别,报警组,ID,DTIM,TP,ErrText) values('{pid}','{type}','{group}','{id}','{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fffff")}','{tp}','{error}')"; new OleDbCommand(sql, oleDbConnection).ExecuteNonQuery(); } } finally { oleDbConnection?.Close(); } } public static DataTable GetAlarmLog(string fileName) { OleDbConnection oleDbConnection = null; string text = System.Windows.Forms.Application.StartupPath + "\\UDTA\\AlarmDirectory";//Application.StartupPath为文件执行路径 text = text + "\\" + fileName + ".xls"; if (File.Exists(text))//判断文件是否存在 { OleDbDataAdapter dataAdapter = new OleDbDataAdapter(); oleDbConnection = new OleDbConnection(CONFIG.Is64Str() + "Data Source=" + text + ";Extended Properties=Excel 8.0;"); try { oleDbConnection.Open(); OleDbCommand selectCommand = new OleDbCommand("SELECT * FROM [AlarmLog$]", oleDbConnection); dataAdapter.SelectCommand = selectCommand; DataTable dt = new DataTable(); dataAdapter.Fill(dt); return dt; } catch (Exception ex) { new PClass().WErrTxt("读取历史报警记录错误:" + ex.ToString()); } finally { oleDbConnection.Close(); } } return null; } public static BindingList GetDataList(DataTable dt) { if (dt == null) { return null; } var list = new BindingList(); var plist = new List(typeof(T).GetProperties()); foreach (DataRow item in dt.Rows) { T s = Activator.CreateInstance(); for (int i = 0; i < dt.Columns.Count; i++) { PropertyInfo info = plist.Find(p => p.Name == dt.Columns[i].ColumnName); if (info != null) { try { if (!Convert.IsDBNull(item[i])) { object v = null; if (info.PropertyType.ToString().Contains("System.Nullable")) { v = Convert.ChangeType(item[i], Nullable.GetUnderlyingType(info.PropertyType)); } else { v = Convert.ChangeType(item[i], info.PropertyType); } info.SetValue(s, v, null); } } catch (Exception ex) { } } } list.Add(s); } return list; } public class EnumItemModel { public string EnumName { get; set; } public int EnumValue { get; set; } public string Description { get; set; } public T EnumItem { get; set; } } public static List> GetEnumItems() where T : Enum { // 获取枚举的类型信息 Type enumType = typeof(T); // 获取枚举的名称数组和值数组 string[] enumNames = Enum.GetNames(enumType); Array enumValues = Enum.GetValues(enumType); // 创建一个列表来存储枚举项模型对象 List> enumItems = new List>(); // 遍历枚举的名称和值数组 for (int i = 0; i < enumNames.Length; i++) { string name = enumNames[i]; //int value = 0; int value = Convert.ToInt32(enumValues.GetValue(i)); string description = GetEnumDescription(enumType, name); // 创建一个枚举项模型对象,并将其添加到列表中 EnumItemModel enumItem = new EnumItemModel { EnumName = name, EnumValue = value, Description = description, EnumItem = (T)Enum.Parse(typeof(T), name) }; enumItems.Add(enumItem); } // 返回枚举项列表 return enumItems; } public static string GetEnumDescription(Type enumType, string enumName) { // 使用反射获取枚举项的描述属性 FieldInfo fieldInfo = enumType.GetField(enumName); DescriptionAttribute[] attributes = (DescriptionAttribute[])fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), false); // 如果存在描述属性,则返回描述值,否则返回空字符串 return (attributes.Length > 0) ? attributes[0].Description : string.Empty; } public static BindingList DeepCopyList(BindingList other) { using (MemoryStream ms = new MemoryStream()) { BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(ms, other); ms.Position = 0; return (BindingList)formatter.Deserialize(ms); } } public static void SaveBindingListToExcel(BindingList bindingList, string fileName) { string filePath = new FILE().GET_RELEASE_DIR() + $"\\DATA\\{fileName}.xls"; //string filePath = Environment.CurrentDirectory + $"\\DATA\\{fileName}.xls"; File.Delete(filePath); // 创建数据表 DataTable dataTable = new DataTable(typeof(T).Name); // 添加列 PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(T)); foreach (PropertyDescriptor prop in properties) { dataTable.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType); } // 添加行 foreach (T item in bindingList) { DataRow row = dataTable.NewRow(); foreach (PropertyDescriptor prop in properties) { row[prop.Name] = prop.GetValue(item) ?? DBNull.Value; } dataTable.Rows.Add(row); } // 使用OleDb写入Excel using (OleDbConnection conn = new OleDbConnection(CONFIG.Is64Str() + "Data Source=" + filePath + ";Extended Properties=Excel 8.0;")) { conn.Open(); string sheetName = "Sheet1"; using (OleDbCommand cmd = new OleDbCommand($"CREATE TABLE [{sheetName}] ({string.Join(",", dataTable.Columns.Cast().Select(c => $"[{c.ColumnName}] {GetOleDbType(c.DataType)}"))})", conn)) { cmd.ExecuteNonQuery(); } using (OleDbDataAdapter adapter = new OleDbDataAdapter($"SELECT * FROM [{sheetName}]", conn)) { using (OleDbCommandBuilder builder = new OleDbCommandBuilder(adapter)) { adapter.Update(dataTable); } } } } private static string GetOleDbType(Type dataType) { if (dataType == typeof(string)) return "Text"; else if (dataType == typeof(int)) return "Integer"; else if (dataType == typeof(double)) return "Double"; else if (dataType == typeof(DateTime)) return "DateTime"; else return "Variant"; } } }