using DevExpress.XtraCharts; using DevExpress.XtraReports.UI; using System; using System.Collections; using System.ComponentModel; using System.Drawing; namespace HStation.WinFrmUI { public partial class SimulationCommonReport : DevExpress.XtraReports.UI.XtraReport { public SimulationCommonReport() { InitializeComponent(); } /// /// 绑定数据 /// public void SetBindingData(SimulationPrintViewModel vm) { //A4设置 827 1169 this.PaperKind = DevExpress.Drawing.Printing.DXPaperKind.A4; this.Margins = new DevExpress.Drawing.DXMargins(50, 50, 50, 50); //内容宽度 float contentWidth = 727F;//内容宽度 float firstCaptionHeight = 30F;//一级标题高度 //727 1069 #region 页眉 var labForCorp = new XRLabel(); labForCorp.Name = "页眉"; labForCorp.Text = "杭州科维节能技术股份有限公司"; labForCorp.Multiline = true; labForCorp.LocationFloat = new DevExpress.Utils.PointFloat(482F, 16F); labForCorp.Padding = new DevExpress.XtraPrinting.PaddingInfo(2, 2, 0, 0, 100F); labForCorp.SizeF = new System.Drawing.SizeF(236F, 24F); labForCorp.StylePriority.UseTextAlignment = false; labForCorp.TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleCenter; this.TopMargin.Controls.Add(labForCorp); #endregion #region 页脚 var pageForCurrentNum = new XRPageInfo(); pageForCurrentNum.LocationFloat = new DevExpress.Utils.PointFloat(617F, 10.00001F); pageForCurrentNum.Name = "页脚"; pageForCurrentNum.Padding = new DevExpress.XtraPrinting.PaddingInfo(2, 2, 0, 0, 100F); pageForCurrentNum.SizeF = new System.Drawing.SizeF(100F, 23F); pageForCurrentNum.StylePriority.UseTextAlignment = false; pageForCurrentNum.TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleCenter; pageForCurrentNum.TextFormatString = "第{0}页"; this.BottomMargin.Controls.Add(pageForCurrentNum); #endregion #region 标题 float locationY = 0F; var labForTitle = new XRLabel(); labForTitle.AnchorHorizontal = ((DevExpress.XtraReports.UI.HorizontalAnchorStyles)((DevExpress.XtraReports.UI.HorizontalAnchorStyles.Left | DevExpress.XtraReports.UI.HorizontalAnchorStyles.Right))); labForTitle.Font = new DevExpress.Drawing.DXFont("Arial", 15F, DevExpress.Drawing.DXFontStyle.Bold); labForTitle.LocationFloat = new DevExpress.Utils.PointFloat(0F, 0F); labForTitle.Multiline = true; labForTitle.Name = "labTitle"; labForTitle.Padding = new DevExpress.XtraPrinting.PaddingInfo(2, 2, 0, 0, 96F); labForTitle.SizeF = new System.Drawing.SizeF(727F, 50F); labForTitle.StylePriority.UseFont = false; labForTitle.StylePriority.UseTextAlignment = false; labForTitle.Text = $"{vm.Project.Name}项目节能报告"; labForTitle.TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleCenter; this.Detail.Controls.Add(labForTitle); locationY += 50F; #endregion #region 一、项目概述 var labForDescription = CreateFirstCaption("一、项目概述", contentWidth, firstCaptionHeight, 0F, locationY); this.Detail.Controls.Add(labForDescription); locationY += firstCaptionHeight; #endregion #region 项目概述内容 var labForDescriptionContent = new XRLabel(); labForDescriptionContent.AnchorHorizontal = (DevExpress.XtraReports.UI.HorizontalAnchorStyles.Left | DevExpress.XtraReports.UI.HorizontalAnchorStyles.Right); labForDescriptionContent.Font = new DevExpress.Drawing.DXFont("Arial", 10F); labForDescriptionContent.LocationFloat = new DevExpress.Utils.PointFloat(0F, locationY); labForDescriptionContent.Multiline = true; labForDescriptionContent.Name = "labForDescriptionContent"; labForDescriptionContent.Padding = new DevExpress.XtraPrinting.PaddingInfo(2, 2, 0, 0, 96F); labForDescriptionContent.SizeF = new System.Drawing.SizeF(727F, 100F); labForDescriptionContent.StylePriority.UseFont = false; labForDescriptionContent.StylePriority.UseTextAlignment = false; labForDescriptionContent.Text = $" {vm.Project.Description}"; labForDescriptionContent.TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleLeft; this.Detail.Controls.Add(labForDescriptionContent); locationY += 100F; #endregion //二、水泵明细 var labForPumpList = new XRLabel(); labForPumpList.AnchorHorizontal = (DevExpress.XtraReports.UI.HorizontalAnchorStyles.Left | DevExpress.XtraReports.UI.HorizontalAnchorStyles.Right); labForPumpList.Font = new DevExpress.Drawing.DXFont("Arial", 12F, DevExpress.Drawing.DXFontStyle.Bold); labForPumpList.LocationFloat = new DevExpress.Utils.PointFloat(0F, locationY); labForPumpList.Multiline = true; labForPumpList.Name = "labForPumpList"; labForPumpList.Padding = new DevExpress.XtraPrinting.PaddingInfo(2, 2, 0, 0, 100F); labForPumpList.SizeF = new System.Drawing.SizeF(727F, 25F); labForPumpList.StylePriority.UseFont = false; labForPumpList.StylePriority.UseTextAlignment = false; labForPumpList.Text = "二、水泵明细"; labForPumpList.TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleLeft; this.Detail.Controls.Add(labForPumpList); locationY += 25F; //水泵明细内容 if (vm.PumpList != null && vm.PumpList.Count > 0) { // 创建 XRTable var tableForPumpList = new XRTable(); tableForPumpList.LocationF = new DevExpress.Utils.PointFloat(0F, locationY); tableForPumpList.SizeF = new SizeF(727F, 30F); // 设置大小 // 创建表头行 XRTableRow headerRowPumpList = new XRTableRow(); headerRowPumpList.BackColor = Color.LightGray; // 设置背景颜色 // 添加表头列 headerRowPumpList.Cells.Add(CreateTableCell("名称", 100)); headerRowPumpList.Cells.Add(CreateTableCell("编码", 100)); headerRowPumpList.Cells.Add(CreateTableCell("额定流量", 100)); headerRowPumpList.Cells.Add(CreateTableCell("额定扬程", 100)); headerRowPumpList.Cells.Add(CreateTableCell("额定功率", 100)); headerRowPumpList.Cells.Add(CreateTableCell("额定转速", 100)); // 将表头行添加到表格 tableForPumpList.Rows.Add(headerRowPumpList); //遍历水泵 foreach (var pump in vm.PumpList) { // 创建数据行 var dataRow = new XRTableRow(); dataRow.Cells.Add(new XRTableCell() { Text = pump.Name, WidthF = 100F, TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleCenter, Borders = DevExpress.XtraPrinting.BorderSide.All }); dataRow.Cells.Add(new XRTableCell() { Text = pump.Code, WidthF = 100F, TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleCenter, Borders = DevExpress.XtraPrinting.BorderSide.All }); dataRow.Cells.Add(new XRTableCell() { Text = pump.RatedQ.ToString(), WidthF = 100F, TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleCenter, Borders = DevExpress.XtraPrinting.BorderSide.All }); dataRow.Cells.Add(new XRTableCell() { Text = pump.RatedH.ToString(), WidthF = 100F, TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleCenter, Borders = DevExpress.XtraPrinting.BorderSide.All }); dataRow.Cells.Add(new XRTableCell() { Text = pump.RatedP.ToString(), WidthF = 100F, TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleCenter, Borders = DevExpress.XtraPrinting.BorderSide.All }); dataRow.Cells.Add(new XRTableCell() { Text = pump.RatedN.ToString(), WidthF = 100F, TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleCenter, Borders = DevExpress.XtraPrinting.BorderSide.All }); tableForPumpList.Rows.Add(dataRow); } // 将表格添加到Detail this.Detail.Controls.Add(tableForPumpList); locationY += 30F; locationY += 30F * vm.PumpList.Count; } if (vm.WorkingList != null && vm.WorkingList.Count > 0) { foreach (var working in vm.WorkingList) { //XRChart chart = new XRChart(); //chart.LocationF = new DevExpress.Utils.PointFloat(0F, locationY); //chart.WidthF = contentWidth; //chart.HeightF = 300F; //// 创建一个线系列 //Series series = new Series("Series1", ViewType.Spline); //// 添加数据点 //foreach (var item in working.PumpAnaly.Items[0].RatedCurveQH) //{ // series.Points.Add(new SeriesPoint(item.X, item.Y)); //} //chart.Series.Add(series); //Detail.Controls.Add(chart); var accuracyScaleChart = CreateAccuracyScale(working.Accuracy.Scale, 300F, 250F, locationY); Detail.Controls.Add(accuracyScaleChart); var accuracyFlowChart = CreateAccuracyItem(working.Accuracy.Flow?.AvgError ?? 0, 213F, 250F, 300F, locationY); Detail.Controls.Add(accuracyFlowChart); var accuracyPressChart = CreateAccuracyItem(working.Accuracy.Press?.AvgError ?? 0, 213F, 250F, 513F, locationY); Detail.Controls.Add(accuracyPressChart); //var chart = new XRChart(); //chart.BackColor = System.Drawing.Color.Transparent; //chart.BorderColor = System.Drawing.Color.Black; //chart.Borders = DevExpress.XtraPrinting.BorderSide.None; ////chart.Legend.LegendID = -1; //chart.Legend.Name = "Default Legend"; //chart.Legend.Visibility = DevExpress.Utils.DefaultBoolean.False; //chart.LocationFloat = new DevExpress.Utils.PointFloat(20F, locationY); //chart.Name = "xrChart6"; //chart.Padding = new DevExpress.XtraPrinting.PaddingInfo(10, 10, 20, 20, 96F); //chart.PaletteRepository.Add("Palette 1", new DevExpress.XtraCharts.Palette("Palette 1", DevExpress.XtraCharts.PaletteScaleMode.Repeat, new DevExpress.XtraCharts.PaletteEntry[] { //new DevExpress.XtraCharts.PaletteEntry(System.Drawing.Color.FromArgb(((int)(((byte)(103)))), ((int)(((byte)(174)))), ((int)(((byte)(197))))), System.Drawing.Color.FromArgb(((int)(((byte)(103)))), ((int)(((byte)(174)))), ((int)(((byte)(197)))))), //new DevExpress.XtraCharts.PaletteEntry(System.Drawing.Color.FromArgb(((int)(((byte)(232)))), ((int)(((byte)(236)))), ((int)(((byte)(240))))), System.Drawing.Color.FromArgb(((int)(((byte)(232)))), ((int)(((byte)(236)))), ((int)(((byte)(240))))))})); //chart.PaletteName = "Palette 1"; //var series = new DevExpress.XtraCharts.Series(); //series.LabelsVisibility = DevExpress.Utils.DefaultBoolean.False; //series.Name = "Series 1"; ////series.SeriesID = 0; //var doughnutSeriesView = new DevExpress.XtraCharts.DoughnutSeriesView(); //doughnutSeriesView.HoleRadiusPercent = 45; //doughnutSeriesView.TotalLabel.DXFont = new DevExpress.Drawing.DXFont("Tahoma", 12F, DevExpress.Drawing.DXFontStyle.Bold); //doughnutSeriesView.TotalLabel.Visible = true; //series.View = doughnutSeriesView; //chart.SeriesSerializable = new DevExpress.XtraCharts.Series[] { series }; //chart.SizeF = new System.Drawing.SizeF(175F, 185F); //chart.StylePriority.UseBackColor = false; //chart.StylePriority.UsePadding = false; //series.Points.Add(new SeriesPoint("误差", 15)); //series.Points.Add(new SeriesPoint("其他", 85)); //doughnutSeriesView.TotalLabel.TextPattern = string.Format("{0:0%}", 0.15); //this.Detail.Controls.Add(chart); } } } //创建一级标题 private XRLabel CreateFirstCaption(string caption, float sizeX, float sizeY, float locationX, float locationY) { var lab = new XRLabel(); lab.AnchorHorizontal = (DevExpress.XtraReports.UI.HorizontalAnchorStyles.Left | DevExpress.XtraReports.UI.HorizontalAnchorStyles.Right); lab.Font = new DevExpress.Drawing.DXFont("Arial", 12F, DevExpress.Drawing.DXFontStyle.Bold); lab.LocationFloat = new DevExpress.Utils.PointFloat(locationX, locationY); lab.Multiline = true; lab.Name = "lab"; lab.Padding = new DevExpress.XtraPrinting.PaddingInfo(2, 2, 0, 0, 100F); lab.SizeF = new System.Drawing.SizeF(sizeX, sizeY); lab.StylePriority.UseFont = false; lab.StylePriority.UseTextAlignment = false; lab.Text = caption; lab.TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleLeft; return lab; } //创建精度比例 private XRChart CreateAccuracyScale(SimulationPrintAccuracyScaleViewModel scale, float sizeX, float sizeY, float locationY) { var chart = new XRChart(); chart.BackColor = System.Drawing.Color.Transparent; chart.BorderColor = System.Drawing.Color.Black; chart.Borders = DevExpress.XtraPrinting.BorderSide.All; chart.Legend.Name = "Default Legend"; chart.Legend.Visibility = DevExpress.Utils.DefaultBoolean.False; chart.LocationFloat = new DevExpress.Utils.PointFloat(0F, locationY); chart.Name = "chart"; chart.Padding = new DevExpress.XtraPrinting.PaddingInfo(10, 10, 20, 20, 100F); var series = new DevExpress.XtraCharts.Series(); series.LabelsVisibility = DevExpress.Utils.DefaultBoolean.True; series.Name = "Series"; var doughnutSeriesView = new DevExpress.XtraCharts.DoughnutSeriesView(); doughnutSeriesView.HoleRadiusPercent = 45; doughnutSeriesView.TotalLabel.DXFont = new DevExpress.Drawing.DXFont("Tahoma", 12F, DevExpress.Drawing.DXFontStyle.Bold); doughnutSeriesView.TotalLabel.Visible = true; series.View = doughnutSeriesView; series.Label.LineVisibility = DevExpress.Utils.DefaultBoolean.True; series.Label.TextPattern = "{A}:{VP:P1}"; chart.SeriesSerializable = new DevExpress.XtraCharts.Series[] { series }; chart.SizeF = new System.Drawing.SizeF(sizeX, sizeY); chart.StylePriority.UseBackColor = false; chart.StylePriority.UsePadding = false; if (scale.Items != null && scale.Items.Count > 0) { foreach (var item in scale.Items) { series.Points.Add(new SeriesPoint(item.EvaluateItem, item.EvaluateCount)); } } doughnutSeriesView.TotalLabel.TextPattern = string.Format("{0:0%}", (scale.AvgError ?? 0) / 100F); return chart; } //创建精度项 private XRChart CreateAccuracyItem(double value, float sizeX, float sizeY, float locationX, float locationY) { var chart = new XRChart(); chart.BackColor = System.Drawing.Color.Transparent; chart.BorderColor = System.Drawing.Color.Black; chart.Borders = DevExpress.XtraPrinting.BorderSide.All; chart.Legend.Name = "Default Legend"; chart.Legend.Visibility = DevExpress.Utils.DefaultBoolean.False; chart.LocationFloat = new DevExpress.Utils.PointFloat(locationX, locationY); chart.Name = "chart"; chart.Padding = new DevExpress.XtraPrinting.PaddingInfo(10, 10, 20, 20, 100F); chart.PaletteRepository.Add("Palette 1", new DevExpress.XtraCharts.Palette("Palette 1", DevExpress.XtraCharts.PaletteScaleMode.Repeat, new DevExpress.XtraCharts.PaletteEntry[] { new DevExpress.XtraCharts.PaletteEntry(System.Drawing.Color.FromArgb(((int)(((byte)(103)))), ((int)(((byte)(174)))), ((int)(((byte)(197))))), System.Drawing.Color.FromArgb(((int)(((byte)(103)))), ((int)(((byte)(174)))), ((int)(((byte)(197)))))), new DevExpress.XtraCharts.PaletteEntry(System.Drawing.Color.FromArgb(((int)(((byte)(232)))), ((int)(((byte)(236)))), ((int)(((byte)(240))))), System.Drawing.Color.FromArgb(((int)(((byte)(232)))), ((int)(((byte)(236)))), ((int)(((byte)(240))))))})); chart.PaletteName = "Palette 1"; var series = new DevExpress.XtraCharts.Series(); series.LabelsVisibility = DevExpress.Utils.DefaultBoolean.False; series.Name = "Series"; var doughnutSeriesView = new DevExpress.XtraCharts.DoughnutSeriesView(); doughnutSeriesView.HoleRadiusPercent = 45; doughnutSeriesView.TotalLabel.DXFont = new DevExpress.Drawing.DXFont("Tahoma", 12F, DevExpress.Drawing.DXFontStyle.Bold); doughnutSeriesView.TotalLabel.Visible = true; series.View = doughnutSeriesView; chart.SeriesSerializable = new DevExpress.XtraCharts.Series[] { series }; chart.SizeF = new System.Drawing.SizeF(sizeX, sizeY); chart.StylePriority.UseBackColor = false; chart.StylePriority.UsePadding = false; var otherValue = 100 - value; series.Points.Add(new SeriesPoint("误差", value)); series.Points.Add(new SeriesPoint("其他", otherValue)); doughnutSeriesView.TotalLabel.TextPattern = string.Format("{0:0%}", value / 100f); return chart; } // 创建表头单元格 private XRTableCell CreateTableCell(string text, int width) { XRTableCell cell = new XRTableCell(); cell.Text = text; cell.Width = width; cell.TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleCenter; // 文本居中 cell.Borders = DevExpress.XtraPrinting.BorderSide.All; // 设置边框 return cell; } // 创建数据绑定单元格 private XRTableCell CreateTableCellWithBinding(string dataMember, int width) { XRTableCell cell = new XRTableCell(); cell.DataBindings.Add(new XRBinding("Text", null, dataMember)); // 绑定数据字段 cell.Width = width; cell.TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleLeft; // 文本左对齐 cell.Borders = DevExpress.XtraPrinting.BorderSide.All; // 设置边框 return cell; } } }