using DevExpress.Utils.About; using DevExpress.Utils.Extensions; using IStation.Model; using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; using System; using System.Collections.Generic; using System.IO; using System.Linq; namespace IStation.WinFrmUI { /// /// 导出 WaterDesk 所需数据 /// public partial class ExportWaterDeskHelper { public class TimeValue { public TimeValue() { } public TimeValue(DateTime t,double v) { this.Time= t; this.Value= v; } public DateTime Time { get; set; } public double Value { get; set; } } public class DataColumn { public string Title { get; set; } public int Index { get; set; } public List TimeValueList { get; set; } } static BLL.StationSignalRecordPacket _packet = new BLL.StationSignalRecordPacket(); /// /// 导出全部 /// /// /// /// /// /// /// public static bool Export(long monitorDataSourcesId, long stationId, int year, int month, int timeStep = 300) { var station = new BLL.Station().GetByID(stationId); if (station == null) return default; var bllSummary = new BLL.MonitorDataSetSummary(); var yearMonths = bllSummary.GetYearMonth(monitorDataSourcesId); if (yearMonths == null || !yearMonths.Any()) return default; var bllEquipment = new BLL.Equipment(); var enginePumps = bllEquipment.GetEnginePumpListByBelongTypeAndBelongID(IStation.ObjectType.Station, stationId); if (enginePumps == null || !enginePumps.Any()) return default; var bllMonitorPoint = new BLL.MonitorPoint(); var bllEquipmentMonitorMapping = new BLL.EquipmentMonitorMapping(); var bllMonitorDataSet = new BLL.MonitorDataSet(); var dataColumnDict = new Dictionary>(); var pumpParasDict = new Dictionary(); var pumpMonitorPointDict = new Dictionary>(); var stationMonitorPointList = new List(); var signalIds = new List(); foreach (var enginePump in enginePumps) { var pump = bllEquipment.GetChildPumpByEnginePumpID(enginePump.ID); if (pump == null) continue; var equipmentMonitorMappings = bllEquipmentMonitorMapping.GetByEquipmentID(enginePump.ID); if (equipmentMonitorMappings == null || !equipmentMonitorMappings.Any()) continue; var monitorPointIds = equipmentMonitorMappings.Select(x => x.MonitorPointID).ToList(); var monitorPoints = bllMonitorPoint.GetExSignalWithSignalTypeByIds(monitorPointIds); monitorPoints = monitorPoints?.Where(x => !string.IsNullOrEmpty(x.TagName)).ToList(); monitorPoints = monitorPoints?.Where(x => x.SignalType!=IStation.SignalType.频率).ToList(); monitorPoints = monitorPoints?.Where(x => x.Flags!=null&&!x.Flags.Contains(Flags.总站)).ToList(); if (monitorPoints == null || !monitorPoints.Any()) continue; pumpParasDict.Add(enginePump.SortCode, pump.RatedParas); pumpMonitorPointDict.Add(enginePump.SortCode, monitorPoints); signalIds.AddRange(monitorPoints.Select(x => x.SignalID)); foreach (var item in monitorPoints) { dataColumnDict[item.TagName] = new List(); } } var monitorPoints_station = bllMonitorPoint.GetExSignalWithSignalTypeByBelongTypeAndBelongID(IStation.ObjectType.Station, stationId); monitorPoints_station = monitorPoints_station?.Where(x => !string.IsNullOrEmpty(x.TagName)).ToList(); stationMonitorPointList = monitorPoints_station? .Where(x => x.Flags != null && x.Flags.Contains(IStation.Flags.总站)).ToList(); if (stationMonitorPointList != null && stationMonitorPointList.Any()) { signalIds.AddRange(stationMonitorPointList.Select(x => x.SignalID)); foreach (var item in stationMonitorPointList) { dataColumnDict[item.TagName] = new List(); } } signalIds = signalIds.Distinct().ToList(); var monthSignalRecordPackets = new List(yearMonths.Count); var summaries = bllSummary.GetAllByDate(monitorDataSourcesId, year, month); if (summaries == null || !summaries.Any()) return default; var minTime = summaries.Min(x => x.MinTime); var maxTime = summaries.Max(x => x.MaxTime); var totalSeconds = (int)(maxTime - minTime).TotalSeconds; var startDay = minTime.AddDays(1); var days = (maxTime - minTime).Days; var capacity = _packet.CalcuCapacity(days, timeStep);// 每个月的数据量 var findIndexDict = new Dictionary();// 查找数据下标 var recordDict = new Dictionary();// 数据字典 signalIds.ForEach(x => { findIndexDict.Add(x, 0); recordDict.Add(x, IStation.Error.Default); }); var signalRecordPackets = bllMonitorDataSet.GetSignalRecordPacket(monitorDataSourcesId, signalIds, year, month); if (signalRecordPackets == null || !signalRecordPackets.Any()) return default; for (int i = 0; i <= days; i++) //按天整理数据 { var day = startDay.AddDays(i); for (int seconds = 0; seconds < _packet.TotalSecondsOfDay; seconds += timeStep) //00点的数据不要 { var realTime = day.AddSeconds(seconds); _packet.GetRecordDict(realTime, signalRecordPackets, findIndexDict, recordDict, timeStep, out bool existRecord); if (!existRecord) continue; if (stationMonitorPointList != null && stationMonitorPointList.Any()) { foreach (var stationMonitorPoint in stationMonitorPointList) { var time = realTime; var value = recordDict[stationMonitorPoint.SignalID]; if (stationMonitorPoint.SignalType == IStation.SignalType.压力) { value = Model.CurveCalcuHelper.Mpa2M(value); } else if (stationMonitorPoint.SignalType == IStation.SignalType.瞬时流量) { value = value < 0 ? 0 : value; } var timeValue = new TimeValue(time, value); dataColumnDict[stationMonitorPoint.TagName].Add(timeValue); } } foreach (var pumpMonitorPointItem in pumpMonitorPointDict) { var key = pumpMonitorPointItem.Key; var pumpParas = pumpParasDict[key]; var pumpMonitorPointList = pumpMonitorPointItem.Value; foreach (var pumpMonitorPoint in pumpMonitorPointList) { var time = realTime; var value = recordDict[pumpMonitorPoint.SignalID]; if (pumpMonitorPoint.SignalType == IStation.SignalType.转速) { value = value / pumpParas.Nr; value = value < 0 ? 0 : value; value = value > 1 ? 1 : value; } else if (pumpMonitorPoint.SignalType == IStation.SignalType.频率) { value = value / 50; value = value < 0 ? 0 : value; value = value > 1 ? 1 : value; } else if (pumpMonitorPoint.SignalType == IStation.SignalType.压力) { value = Model.CurveCalcuHelper.Mpa2M(value); } else if (pumpMonitorPoint.SignalType == IStation.SignalType.瞬时流量) { value = value < 0 ? 0 : value; } var timeValue = new TimeValue(time, value); dataColumnDict[pumpMonitorPoint.TagName].Add(timeValue); } } } } var pressure_monitor_points = monitorPoints_station.Where(x => x.SignalType == IStation.SignalType.压力).ToList(); var flow_monitor_points = monitorPoints_station.Where(x => x.SignalType == IStation.SignalType.瞬时流量).ToList(); var mode_excel_data_column_list = new List(); var pressure_scada_data_column_list = new List(); var flow_scada_data_column_list = new List(); var index = 0; foreach (var item in dataColumnDict) { var dataColumn = new DataColumn(); dataColumn.Title = item.Key; dataColumn.Index = index; dataColumn.TimeValueList = item.Value; if (pressure_monitor_points.Exists(p => p.TagName == item.Key)) { pressure_scada_data_column_list.Add(dataColumn); continue; } if (flow_monitor_points.Exists(p => p.TagName == item.Key)) { flow_scada_data_column_list.Add(dataColumn); } mode_excel_data_column_list.Add(dataColumn); index++; } var root_folder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "WaterDesk模型验证数据"); if (!Directory.Exists(root_folder)) { Directory.CreateDirectory(root_folder); } var stationName = station.Name; var mode_excel_file_name = root_folder + "\\" + $"{stationName}-模式.xls"; Export2Excel(mode_excel_file_name, mode_excel_data_column_list); var pressure_scada_file_name = root_folder + "\\" + $"{stationName}-压力-Scada.csv"; ExportCSV(pressure_scada_file_name, pressure_scada_data_column_list); var flow_scada_file_name = root_folder + "\\" + $"{stationName}-流量-Scada.csv"; ExportCSV(flow_scada_file_name, flow_scada_data_column_list); return true; } /// /// 按天导出 /// /// /// /// /// public static bool Export(long monitorDataSourcesId, long stationId, int timeStep = 300) { var station = new BLL.Station().GetByID(stationId); if (station == null) return default; var bllSummary = new BLL.MonitorDataSetSummary(); var yearMonths = bllSummary.GetYearMonth(monitorDataSourcesId); if (yearMonths == null || !yearMonths.Any()) return default; var bllEquipment = new BLL.Equipment(); var enginePumps = bllEquipment.GetEnginePumpListByBelongTypeAndBelongID(IStation.ObjectType.Station, stationId); if (enginePumps == null || !enginePumps.Any()) return default; var bllMonitorPoint = new BLL.MonitorPoint(); var bllEquipmentMonitorMapping = new BLL.EquipmentMonitorMapping(); var bllMonitorDataSet = new BLL.MonitorDataSet(); var dataColumnDict = new Dictionary>(); var dataColumnDayDict = new Dictionary>(); var pumpParasDict = new Dictionary(); var pumpMonitorPointDict = new Dictionary>(); var stationMonitorPointList = new List(); var signalIds = new List(); foreach (var enginePump in enginePumps) { var pump = bllEquipment.GetChildPumpByEnginePumpID(enginePump.ID); if (pump == null) continue; var equipmentMonitorMappings = bllEquipmentMonitorMapping.GetByEquipmentID(enginePump.ID); if (equipmentMonitorMappings == null || !equipmentMonitorMappings.Any()) continue; var monitorPointIds = equipmentMonitorMappings.Select(x => x.MonitorPointID).ToList(); var monitorPoints = bllMonitorPoint.GetExSignalWithSignalTypeByIds(monitorPointIds); monitorPoints = monitorPoints?.Where(x => !string.IsNullOrEmpty(x.TagName)).ToList(); monitorPoints = monitorPoints?.Where(x => x.SignalType != IStation.SignalType.频率).ToList(); monitorPoints = monitorPoints?.Where(x => x.Flags != null && !x.Flags.Contains(Flags.总站)).ToList(); if (monitorPoints == null || !monitorPoints.Any()) continue; pumpParasDict.Add(enginePump.SortCode, pump.RatedParas); pumpMonitorPointDict.Add(enginePump.SortCode, monitorPoints); signalIds.AddRange(monitorPoints.Select(x => x.SignalID)); foreach (var item in monitorPoints) { dataColumnDict[item.TagName] = new List(); dataColumnDayDict[item.TagName] = new List(); } } var monitorPoints_station = bllMonitorPoint.GetExSignalWithSignalTypeByBelongTypeAndBelongID(IStation.ObjectType.Station, stationId); monitorPoints_station = monitorPoints_station?.Where(x => !string.IsNullOrEmpty(x.TagName)).ToList(); stationMonitorPointList = monitorPoints_station? .Where(x => x.Flags != null && x.Flags.Contains(IStation.Flags.总站)).ToList(); if (stationMonitorPointList != null && stationMonitorPointList.Any()) { signalIds.AddRange(stationMonitorPointList.Select(x => x.SignalID)); foreach (var item in stationMonitorPointList) { dataColumnDict[item.TagName] = new List(); dataColumnDayDict[item.TagName] = new List(); } } signalIds = signalIds.Distinct().ToList(); var monthSignalRecordPackets = new List(yearMonths.Count); var root_folder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "WaterDesk模型验证数据"); if (!Directory.Exists(root_folder)) { Directory.CreateDirectory(root_folder); } var root_day_folder = Path.Combine(root_folder, "Day"); if (!Directory.Exists(root_day_folder)) { Directory.CreateDirectory(root_day_folder); } var stationName = station.Name; var pressure_monitor_points = monitorPoints_station.Where(x => x.SignalType == IStation.SignalType.压力).ToList(); var flow_monitor_points = monitorPoints_station.Where(x => x.SignalType == IStation.SignalType.瞬时流量).ToList(); foreach (var yearMonth in yearMonths) { var year = yearMonth.Year; var month = yearMonth.Month; var summaries = bllSummary.GetAllByDate(monitorDataSourcesId, year, month); if (summaries == null || !summaries.Any()) return default; var minTime = summaries.Min(x => x.MinTime); var maxTime = summaries.Max(x => x.MaxTime); var totalSeconds = (int)(maxTime - minTime).TotalSeconds; var startDay = minTime; var days = (maxTime - minTime).Days; var capacity = _packet.CalcuCapacity(days, timeStep);// 每个月的数据量 var findIndexDict = new Dictionary();// 查找数据下标 var recordDict = new Dictionary();// 数据字典 signalIds.ForEach(x => { findIndexDict.Add(x, 0); recordDict.Add(x, IStation.Error.Default); }); var signalRecordPackets = bllMonitorDataSet.GetSignalRecordPacket(monitorDataSourcesId, signalIds, year, month); if (signalRecordPackets == null || !signalRecordPackets.Any()) return default; for (int i = 0; i <= days; i++) //按天整理数据 { var day = startDay.AddDays(i); dataColumnDayDict.ForEach(x => x.Value.Clear()); var mode_excel_day_data_column_list = new List(); for (int seconds = 0; seconds < _packet.TotalSecondsOfDay; seconds += timeStep) //00点的数据不要 { var realTime = day.AddSeconds(seconds); _packet.GetRecordDict(realTime, signalRecordPackets, findIndexDict, recordDict, timeStep, out bool existRecord); if (!existRecord) continue; if (stationMonitorPointList != null && stationMonitorPointList.Any()) { foreach (var stationMonitorPoint in stationMonitorPointList) { var time = realTime; var value = recordDict[stationMonitorPoint.SignalID]; if (stationMonitorPoint.SignalType == IStation.SignalType.压力) { value = Model.CurveCalcuHelper.Mpa2M(value); } else if (stationMonitorPoint.SignalType == IStation.SignalType.瞬时流量) { value = value < 0 ? 0 : value; } var timeValue = new TimeValue(time, value); dataColumnDict[stationMonitorPoint.TagName].Add(timeValue); dataColumnDayDict[stationMonitorPoint.TagName].Add(timeValue); } } foreach (var pumpMonitorPointItem in pumpMonitorPointDict) { var key = pumpMonitorPointItem.Key; var pumpParas = pumpParasDict[key]; var pumpMonitorPointList = pumpMonitorPointItem.Value; foreach (var pumpMonitorPoint in pumpMonitorPointList) { var time = realTime; var value = recordDict[pumpMonitorPoint.SignalID]; if (pumpMonitorPoint.SignalType == IStation.SignalType.转速) { if (key==23&&time.Month==8&&time.Day==1) { } value = value / pumpParas.Nr; value = value < 0 ? 0 : value; value = value > 1 ? 1 : value; } else if (pumpMonitorPoint.SignalType == IStation.SignalType.频率) { value = value / 50; value = value < 0 ? 0 : value; value = value > 1 ? 1 : value; } else if (pumpMonitorPoint.SignalType == IStation.SignalType.压力) { value = Model.CurveCalcuHelper.Mpa2M(value); } else if (pumpMonitorPoint.SignalType == IStation.SignalType.瞬时流量) { value = value < 0 ? 0 : value; } var timeValue = new TimeValue(time, value); dataColumnDict[pumpMonitorPoint.TagName].Add(timeValue); dataColumnDayDict[pumpMonitorPoint.TagName].Add(timeValue); } } } var index_day = 0; for (int j = 0; j < dataColumnDayDict.Count; j++) { var dayItem = dataColumnDayDict.ElementAt(j); if (pressure_monitor_points.Exists(p => p.TagName == dayItem.Key)) { continue; } var dataColumn = new DataColumn(); dataColumn.Title = dayItem.Key; dataColumn.Index = index_day; dataColumn.TimeValueList = dayItem.Value; mode_excel_day_data_column_list.Add(dataColumn); index_day++; } var mode_excel_day_file_name = root_day_folder + "\\" + $"{day.ToString("D")}-{stationName}-模式.xls"; Export2Excel(mode_excel_day_file_name, mode_excel_day_data_column_list); } } var mode_excel_data_column_list = new List(); var pressure_scada_data_column_list = new List(); var flow_scada_data_column_list = new List(); var index = 0; foreach (var item in dataColumnDict) { var dataColumn = new DataColumn(); dataColumn.Title = item.Key; dataColumn.Index = index; dataColumn.TimeValueList = item.Value; if (pressure_monitor_points.Exists(p => p.TagName == item.Key)) { pressure_scada_data_column_list.Add(dataColumn); continue; } if (flow_monitor_points.Exists(p => p.TagName == item.Key)) { flow_scada_data_column_list.Add(dataColumn); } mode_excel_data_column_list.Add(dataColumn); index++; } //var mode_excel_file_name = root_folder + "\\" + $"{stationName}-模式.xls"; //Export2Excel(mode_excel_file_name, mode_excel_data_column_list); var pressure_scada_file_name = root_folder + "\\" + $"{stationName}-压力-Scada.csv"; ExportCSV(pressure_scada_file_name, pressure_scada_data_column_list); var flow_scada_file_name = root_folder + "\\" + $"{stationName}-流量-Scada.csv"; ExportCSV(flow_scada_file_name, flow_scada_data_column_list); return true; } /// /// 按天导出 /// /// /// /// /// /// /// public static bool ExportByDay(long monitorDataSourcesId, long stationId, int year, int month, int timeStep = 300) { var station = new BLL.Station().GetByID(stationId); if (station == null) return default; var bllSummary = new BLL.MonitorDataSetSummary(); var yearMonths = bllSummary.GetYearMonth(monitorDataSourcesId); if (yearMonths == null || !yearMonths.Any()) return default; var bllEquipment = new BLL.Equipment(); var enginePumps = bllEquipment.GetEnginePumpListByBelongTypeAndBelongID(IStation.ObjectType.Station, stationId); if (enginePumps == null || !enginePumps.Any()) return default; var bllMonitorPoint = new BLL.MonitorPoint(); var bllEquipmentMonitorMapping = new BLL.EquipmentMonitorMapping(); var bllMonitorDataSet = new BLL.MonitorDataSet(); var dataColumnDict = new Dictionary>(); var dataColumnDayDict = new Dictionary>(); var pumpParasDict = new Dictionary(); var pumpMonitorPointDict = new Dictionary>(); var stationMonitorPointList = new List(); var signalIds = new List(); foreach (var enginePump in enginePumps) { var pump = bllEquipment.GetChildPumpByEnginePumpID(enginePump.ID); if (pump == null) continue; var equipmentMonitorMappings = bllEquipmentMonitorMapping.GetByEquipmentID(enginePump.ID); if (equipmentMonitorMappings == null || !equipmentMonitorMappings.Any()) continue; var monitorPointIds = equipmentMonitorMappings.Select(x => x.MonitorPointID).ToList(); var monitorPoints = bllMonitorPoint.GetExSignalWithSignalTypeByIds(monitorPointIds); monitorPoints = monitorPoints?.Where(x => !string.IsNullOrEmpty(x.TagName)).ToList(); monitorPoints = monitorPoints?.Where(x => x.SignalType != IStation.SignalType.频率).ToList(); monitorPoints = monitorPoints?.Where(x => x.Flags!=null&&!x.Flags.Contains(Flags.总站)).ToList(); if (monitorPoints == null || !monitorPoints.Any()) continue; pumpParasDict.Add(enginePump.SortCode, pump.RatedParas); pumpMonitorPointDict.Add(enginePump.SortCode, monitorPoints); signalIds.AddRange(monitorPoints.Select(x => x.SignalID)); foreach (var item in monitorPoints) { dataColumnDict[item.TagName] = new List(); dataColumnDayDict[item.TagName] = new List(); } } var monitorPoints_station = bllMonitorPoint.GetExSignalWithSignalTypeByBelongTypeAndBelongID(IStation.ObjectType.Station, stationId); monitorPoints_station = monitorPoints_station?.Where(x => !string.IsNullOrEmpty(x.TagName)).ToList(); stationMonitorPointList = monitorPoints_station? .Where(x => x.Flags != null && x.Flags.Contains(IStation.Flags.总站)).ToList(); if (stationMonitorPointList != null && stationMonitorPointList.Any()) { signalIds.AddRange(stationMonitorPointList.Select(x => x.SignalID)); foreach (var item in stationMonitorPointList) { dataColumnDict[item.TagName] = new List(); dataColumnDayDict[item.TagName] = new List(); } } signalIds = signalIds.Distinct().ToList(); var monthSignalRecordPackets = new List(yearMonths.Count); var summaries = bllSummary.GetAllByDate(monitorDataSourcesId, year, month); if (summaries == null || !summaries.Any()) return default; var minTime = summaries.Min(x => x.MinTime); var maxTime = summaries.Max(x => x.MaxTime); var totalSeconds = (int)(maxTime - minTime).TotalSeconds; var startDay = minTime.AddDays(1); var days = (maxTime - minTime).Days; var capacity = _packet.CalcuCapacity(days, timeStep);// 每个月的数据量 var findIndexDict = new Dictionary();// 查找数据下标 var recordDict = new Dictionary();// 数据字典 signalIds.ForEach(x => { findIndexDict.Add(x, 0); recordDict.Add(x, IStation.Error.Default); }); var signalRecordPackets = bllMonitorDataSet.GetSignalRecordPacket(monitorDataSourcesId, signalIds, year, month); if (signalRecordPackets == null || !signalRecordPackets.Any()) return default; var root_folder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "WaterDesk模型验证数据"); if (!Directory.Exists(root_folder)) { Directory.CreateDirectory(root_folder); } var root_day_folder = Path.Combine(root_folder, "Day"); if (!Directory.Exists(root_day_folder)) { Directory.CreateDirectory(root_day_folder); } var stationName = station.Name; var pressure_monitor_points = monitorPoints_station.Where(x => x.SignalType == IStation.SignalType.压力).ToList(); var flow_monitor_points = monitorPoints_station.Where(x => x.SignalType == IStation.SignalType.瞬时流量).ToList(); for (int i = 0; i <= days; i++) //按天整理数据 { var day = startDay.AddDays(i); dataColumnDayDict.ForEach(x => x.Value.Clear()); var mode_excel_day_data_column_list = new List(); for (int seconds = 0; seconds < _packet.TotalSecondsOfDay; seconds += timeStep) //00点的数据不要 { var realTime = day.AddSeconds(seconds); _packet.GetRecordDict(realTime, signalRecordPackets, findIndexDict, recordDict, timeStep, out bool existRecord); if (!existRecord) continue; if (stationMonitorPointList != null && stationMonitorPointList.Any()) { foreach (var stationMonitorPoint in stationMonitorPointList) { var time = realTime; var value = recordDict[stationMonitorPoint.SignalID]; if (stationMonitorPoint.SignalType == IStation.SignalType.压力) { value = Model.CurveCalcuHelper.Mpa2M(value); } else if (stationMonitorPoint.SignalType == IStation.SignalType.瞬时流量) { value = value < 0 ? 0 : value; } var timeValue = new TimeValue(time, value); dataColumnDict[stationMonitorPoint.TagName].Add(timeValue); dataColumnDayDict[stationMonitorPoint.TagName].Add(timeValue); } } foreach (var pumpMonitorPointItem in pumpMonitorPointDict) { var key = pumpMonitorPointItem.Key; var pumpParas = pumpParasDict[key]; var pumpMonitorPointList = pumpMonitorPointItem.Value; foreach (var pumpMonitorPoint in pumpMonitorPointList) { var time = realTime; var value = recordDict[pumpMonitorPoint.SignalID]; if (pumpMonitorPoint.SignalType == IStation.SignalType.转速) { value = value / pumpParas.Nr; value = value < 0 ? 0 : value; value = value > 1 ? 1 : value; } else if (pumpMonitorPoint.SignalType == IStation.SignalType.频率) { value = value / 50; value = value < 0 ? 0 : value; value = value > 1 ? 1 : value; } else if (pumpMonitorPoint.SignalType == IStation.SignalType.压力) { value = Model.CurveCalcuHelper.Mpa2M(value); } else if (pumpMonitorPoint.SignalType == IStation.SignalType.瞬时流量) { value = value < 0 ? 0 : value; } var timeValue = new TimeValue(time, value); dataColumnDict[pumpMonitorPoint.TagName].Add(timeValue); dataColumnDayDict[pumpMonitorPoint.TagName].Add(timeValue); } } } var index_day = 0; for (int j = 0; j < dataColumnDayDict.Count; j++) { var dayItem = dataColumnDayDict.ElementAt(j); if (pressure_monitor_points.Exists(p => p.TagName == dayItem.Key)) { continue; } var dataColumn = new DataColumn(); dataColumn.Title = dayItem.Key; dataColumn.Index = index_day; dataColumn.TimeValueList = dayItem.Value; mode_excel_day_data_column_list.Add(dataColumn); index_day++; } var mode_excel_day_file_name = root_day_folder + "\\" + $"{day.ToString("D")}-{stationName}-模式.xls"; Export2Excel(mode_excel_day_file_name, mode_excel_day_data_column_list); } var mode_excel_data_column_list = new List(); var pressure_scada_data_column_list = new List(); var flow_scada_data_column_list = new List(); var index = 0; foreach (var item in dataColumnDict) { var dataColumn = new DataColumn(); dataColumn.Title = item.Key; dataColumn.Index = index; dataColumn.TimeValueList = item.Value; if (pressure_monitor_points.Exists(p => p.TagName == item.Key)) { pressure_scada_data_column_list.Add(dataColumn); continue; } if (flow_monitor_points.Exists(p => p.TagName == item.Key)) { flow_scada_data_column_list.Add(dataColumn); } mode_excel_data_column_list.Add(dataColumn); index++; } var mode_excel_file_name = root_folder + "\\" + $"{stationName}-模式.xls"; Export2Excel(mode_excel_file_name, mode_excel_data_column_list); var pressure_scada_file_name = root_folder + "\\" + $"{stationName}-压力-Scada.csv"; ExportCSV(pressure_scada_file_name, pressure_scada_data_column_list); var flow_scada_file_name = root_folder + "\\" + $"{stationName}-流量-Scada.csv"; ExportCSV(flow_scada_file_name, flow_scada_data_column_list); return true; } public static bool Export2Excel(string fileName, List dataColumnList) { //try //{ HSSFWorkbook theBook = new HSSFWorkbook(); var theSheet1 = theBook.CreateSheet("Sheet1"); IRow rowTile = theSheet1.CreateRow(0); foreach (var info in dataColumnList) { rowTile.CreateCell(info.Index).SetCellValue(info.Title); } foreach (var item in dataColumnList) { for (int i = 1; i < item.TimeValueList.Count; i++) { var record = item.TimeValueList[i-1]; IRow row; if (theSheet1.LastRowNum < i) { row = theSheet1.CreateRow(i); } else { row = theSheet1.GetRow(i); } row.CreateCell(item.Index).SetCellValue(record.Value == IStation.Error.Default ? 0 : record.Value); } } //强制Excel在打开时重新计算所有公式 theSheet1.ForceFormulaRecalculation = true; using (FileStream fs = File.OpenWrite(fileName)) { theBook.Write(fs); } //} //catch (Exception ex) //{ // XtraMessageBox.Show(ex.Message); //} return true; } public static void ExportCSV(string fileName, List dataColumnList) { using (var fs = new FileStream(fileName, System.IO.FileMode.Create, System.IO.FileAccess.Write, FileShare.ReadWrite)) using (var sw = new StreamWriter(fs, System.Text.Encoding.UTF8)) { sw.WriteLine("ScadaID,Time,Value"); foreach (var item in dataColumnList) { for (int i = 0; i < item.TimeValueList.Count; i++) { var r = item.TimeValueList[i]; var v = r.Value == IStation.Error.Default ? 0 : r.Value; sw.WriteLine($"{item.Title},{r.Time:yyyy-MM-dd HH:mm:ss},{v}"); } } } } } }