lixiaojun
2025-02-19 294b81166f21e12247e784d6bf404f5f34b2ee19
WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/13-print/99-test/XtraReport1.cs
@@ -1,15 +1,7 @@
using Aspose.Words.Drawing.Charts;
using DevExpress.CodeParser;
using DevExpress.XtraBars.Docking;
using DevExpress.Charts.Native;
using DevExpress.Utils;
using DevExpress.XtraCharts;
using DevExpress.XtraReports.UI;
using DevExpress.XtraSpreadsheet.Model;
using NPOI.POIFS.NIO;
using Org.BouncyCastle.Tls;
using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
namespace HStation.WinFrmUI
{
@@ -22,105 +14,971 @@
        private SimulationPrintViewModel _printViewModel;
        public void SetBingdingData(SimulationPrintViewModel viewModel)
        public void SetBingdingData(SimulationPrintViewModel vm)
        {
            _printViewModel = viewModel;
            ininal();
        }
            // A4设置 827 1169
            this.PaperKind = DevExpress.Drawing.Printing.DXPaperKind.A4;
            this.Margins = new DevExpress.Drawing.DXMargins(50, 50, 50, 50);
        private void ininal()
        {
            this.DataSource = _printViewModel.PumpList;
            this.xrLabel1.DataBindings.Add("Text", _printViewModel.Project, "Name");
            this.xrTable2.DataBindings.Add("Text", _printViewModel.PumpList, "Name");
            this.xrTable2.DataBindings.Add("Text", _printViewModel.PumpList, "BeginGroup");
            // 内容宽度
            float contentWidth = 727F; // 内容宽度
            float firstCaptionHeight = 30F; // 一级标题高度
            float pageHeight = 1069F; // 页面可用高度
            float currentY = 0F; // 当前Y坐标
            // 创建 XRChart 控件实例
            XRChart xrChart = new XRChart();
            foreach (var item in GenerateAllChartData(1))
            #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 标题
            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, currentY);
            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);
            currentY += 50F;
            #endregion 标题
            #region 一、项目概述
            var labForDescription = CreateFirstCaption("一、项目概述", contentWidth, firstCaptionHeight, 0F, currentY);
            this.Detail.Controls.Add(labForDescription);
            currentY += 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, currentY);
            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);
            currentY += 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, currentY);
            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);
            currentY += 25F;
            // 水泵明细内容
            if (vm.PumpList != null && vm.PumpList.Count > 0)
            {
                // 创建一个系列(曲线)
                Series series = new Series(item.SeriesName, ViewType.Spline);
                // 创建 XRTable
                var tableForPumpList = new XRTable();
                tableForPumpList.LocationF = new DevExpress.Utils.PointFloat(0F, currentY);
                tableForPumpList.SizeF = new SizeF(727F, 30F + vm.PumpList.Count * 25F); // 设置大小
                // 设置系列的数据筛选条件
                series.FilterString = $"SeriesName = '{item.SeriesName}'";
                // 创建表头行
                XRTableRow headerRowPumpList = new XRTableRow();
                headerRowPumpList.BackColor = Color.LightGray; // 设置背景颜色
                // 设置系列的数据绑定
                series.ArgumentDataMember = "XValue";
                series.ValueDataMembers.AddRange(new string[] { "YValue" });
                // 添加表头列
                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));
                // 将系列添加到图表的系列集合中
                xrChart.Series.Add(series);
                // 将表头行添加到表格
                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);
                currentY += tableForPumpList.HeightF;
                //currentY += vm.PumpList.Count*10;
            }
            xrChart.DataSource = GenerateAllChartData(1);
            //Detail1.Controls.Add(xrChart);
        }
        public class ChartDataPoint
        {
            public double XValue { get; set; } // 横坐标值
            public double YValue { get; set; } // 纵坐标值
            public string SeriesName { get; set; } // 系列名称,用于区分不同的线
        }
        public List<ChartDataPoint> GenerateAllChartData(int i)
        {
            List<ChartDataPoint> series1Data = new List<ChartDataPoint>();
            foreach (var item in _printViewModel.WorkingList.First().PumpAnaly.Items[i].RatedCurveQE)
            var labForWorking = CreateFirstCaption("三、工况视图", contentWidth, firstCaptionHeight, 0F, currentY);
            this.Detail.Controls.Add(labForWorking);
            currentY += firstCaptionHeight;
            var labForAccuracy = CreateFirstCaption("(1)、精度评估", contentWidth - 25F, 15F, 20F, currentY);
            this.Detail.Controls.Add(labForAccuracy);
            currentY += firstCaptionHeight;
            if (vm.WorkingList != null && vm.WorkingList.Count > 0)
            {
                series1Data.Add(new ChartDataPoint
                foreach (var working in vm.WorkingList)
                {
                    XValue = item.X,
                    YValue = item.Y,
                    SeriesName = _printViewModel.WorkingList.First().PumpAnaly.Items[i].Name
                });
            };
                    /*XRChart chart = new XRChart();
                    chart.LocationF = new DevExpress.Utils.PointFloat(0F, currentY);
                    chart.WidthF = contentWidth;
                    chart.HeightF = 300F;
            List<ChartDataPoint> series2Data = new List<ChartDataPoint>();
            foreach (var item in _printViewModel.WorkingList.First().PumpAnaly.Items[i].CurrentCurveQH)
            {
                series2Data.Add(new ChartDataPoint
                {
                    XValue = item.X,
                    YValue = item.Y,
                    SeriesName = _printViewModel.WorkingList.First().PumpAnaly.Items[i].Name
                });
            };
                    // 创建一个线系列
                    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);
                    Series series2 = new Series("Series2", ViewType.Spline);
                    // 添加数据点
                    foreach (var item in working.PumpAnaly.Items[0].CurrentCurveQE)
                    {
                        series2.Points.Add(new SeriesPoint(item.X, item.Y));
                    }
                    chart.Series.Add(series2);
                    Series series3 = new Series("Series3", ViewType.Spline);
                    // 添加数据点
                    foreach (var item in working.PumpAnaly.Items[0].CurrentCurveQP)
                    {
                        series3.Points.Add(new SeriesPoint(item.X, item.Y));
                    }
                    chart.Series.Add(series3);
            List<ChartDataPoint> series3Data = new List<ChartDataPoint>();
            foreach (var item in _printViewModel.WorkingList.First().PumpAnaly.Items[i].CurrentCurveQP)
                    Detail.Controls.Add(chart);
                    currentY += chart.HeightF;*/
                    /*          var accuracyFlowChart = CreateAccuracyItem(working.Accuracy.Flow?.AvgError ?? 0, 213F, 250F, 300F, currentY);
                              if (currentY + accuracyFlowChart.HeightF > pageHeight)
                              {
                                  accuracyFlowChart.LocationF = new DevExpress.Utils.PointFloat(accuracyFlowChart.LocationF.X, currentY);
                              }
                              Detail.Controls.Add(accuracyFlowChart);
                              currentY += accuracyFlowChart.HeightF;
                              var accuracyPressChart = CreateAccuracyItem(working.Accuracy.Press?.AvgError ?? 0, 213F, 250F, 513F, currentY);
                              if (currentY + accuracyPressChart.HeightF > pageHeight)
                              {
                                  accuracyPressChart.LocationF = new DevExpress.Utils.PointFloat(accuracyPressChart.LocationF.X, currentY);
                              }
                              Detail.Controls.Add(accuracyPressChart);
                              currentY += accuracyPressChart.HeightF;*/
                    var accuracyScaleChart = CreateAccuracyScale(working.Accuracy.Scale, 300F, 230F, currentY);
                    Detail.Controls.Add(accuracyScaleChart);
                    var accuracyFlowChart = CreateAccuracyItem(working.Accuracy.Flow?.AvgError ?? 0, 213F, 230F, 300F, currentY);
                    Detail.Controls.Add(accuracyFlowChart);
                    var accuracyPressChart = CreateAccuracyItem(working.Accuracy.Press?.AvgError ?? 0, 213F, 230F, 513F, currentY);
                    Detail.Controls.Add(accuracyPressChart);
                    currentY += accuracyScaleChart.HeightF;
                }
                currentY += 20F;
            }
            var labForAccuracyList = CreateFirstCaption("(1.1)、评估列表", contentWidth - 25F, 15F, 20F, currentY);
            this.Detail.Controls.Add(labForAccuracyList);
            currentY += firstCaptionHeight;
            #region 评估列表
            if (vm.WorkingList != null && vm.WorkingList.Count > 0)
            {
                series3Data.Add(new ChartDataPoint
                foreach (var working in vm.WorkingList)
                {
                    XValue = item.X,
                    YValue = item.Y,
                    SeriesName = _printViewModel.WorkingList.First().PumpAnaly.Items[i].Name
                });
            };
            // 合并所有系列的数据
            List<ChartDataPoint> allData = new List<ChartDataPoint>();
            allData.AddRange(series1Data);
            allData.AddRange(series2Data);
            allData.AddRange(series3Data);
            return allData;
                    if (working.Accuracy.Items != null && working.Accuracy.Items.Count > 0)
                    {                // 创建 XRTable
                        var tableForAccuracyList = new XRTable();
                        tableForAccuracyList.LocationF = new DevExpress.Utils.PointFloat(0F, currentY);
                        tableForAccuracyList.SizeF = new SizeF(727F, 30F + working.Accuracy.Items.Count * 25F); // 设置大小
                        // 创建表头行
                        XRTableRow headerRowAccuracyList = new XRTableRow();
                        headerRowAccuracyList.BackColor = Color.LightGray; // 设置背景颜色
                        // 添加表头列
                        headerRowAccuracyList.Cells.Add(CreateTableCell("评估构件", 100));
                        headerRowAccuracyList.Cells.Add(CreateTableCell("评估项", 100));
                        headerRowAccuracyList.Cells.Add(CreateTableCell("监测值", 100));
                        headerRowAccuracyList.Cells.Add(CreateTableCell("计算值", 100));
                        headerRowAccuracyList.Cells.Add(CreateTableCell("评估误差", 100));
                        // 将表头行添加到表格
                        tableForAccuracyList.Rows.Add(headerRowAccuracyList);
                        foreach (var item in working.Accuracy.Items)
                        {
                            // 创建数据行
                            var dataRow = new XRTableRow();
                            dataRow.Cells.Add(new XRTableCell()
                            {
                                Text = item.EvaluateName,
                                WidthF = 100F,
                                TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleCenter,
                                Borders = DevExpress.XtraPrinting.BorderSide.All
                            });
                            dataRow.Cells.Add(new XRTableCell()
                            {
                                Text = item.EvaluateItem,
                                WidthF = 100F,
                                TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleCenter,
                                Borders = DevExpress.XtraPrinting.BorderSide.All
                            });
                            dataRow.Cells.Add(new XRTableCell()
                            {
                                Text = item.MonitorValue.ToString(),
                                WidthF = 100F,
                                TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleCenter,
                                Borders = DevExpress.XtraPrinting.BorderSide.All
                            });
                            dataRow.Cells.Add(new XRTableCell()
                            {
                                Text = item.CalcuValue.ToString(),
                                WidthF = 100F,
                                TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleCenter,
                                Borders = DevExpress.XtraPrinting.BorderSide.All
                            });
                            dataRow.Cells.Add(new XRTableCell()
                            {
                                Text = item.EvaluateError?.ToString(),
                                WidthF = 100F,
                                TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleCenter,
                                Borders = DevExpress.XtraPrinting.BorderSide.All
                            });
                            tableForAccuracyList.Rows.Add(dataRow);
                        }
                        // 将表格添加到Detail
                        this.Detail.Controls.Add(tableForAccuracyList);
                        currentY += tableForAccuracyList.HeightF;
                    }
                }
                currentY += 20F;
            }
            #endregion 评估列表
            #region 水泵分析
            var labForPump = CreateFirstCaption("(2)、水泵分析", contentWidth - 25F, 15F, 20F, currentY);
            this.Detail.Controls.Add(labForPump);
            currentY += 20F;
            if (vm.WorkingList != null && vm.WorkingList.Count > 0)
            {
                foreach (var working in vm.WorkingList)
                {
                    if (working.PumpAnaly != null && working.PumpAnaly.Items != null && working.PumpAnaly.Items.Count > 0)
                    {
                        foreach (var item in working.PumpAnaly.Items)
                        {
                            var label = CreateFirstCaption(item.Name, contentWidth - 25F, 15F, 20F, currentY);
                            this.Detail.Controls.Add(label);
                            currentY += 20F;
                            XRChart chart = new XRChart();
                            ((System.ComponentModel.ISupportInitialize)(chart)).BeginInit();
                            chart.LocationF = new DevExpress.Utils.PointFloat(0F, currentY);
                            chart.WidthF = contentWidth;
                            chart.HeightF = 700F;
                            chart.Legend.Visibility = DevExpress.Utils.DefaultBoolean.False;
                            // 创建 XY 图表
                            XYDiagram xyDiagram = new XYDiagram();
                            ((System.ComponentModel.ISupportInitialize)(xyDiagram)).BeginInit();
                            // 配置主 X 轴
                            xyDiagram.AxisX.Title.Text = "流量(m³/h)";
                            xyDiagram.AxisX.Title.Visibility = DefaultBoolean.True;
                            xyDiagram.AxisX.Visibility = DefaultBoolean.True;
                            xyDiagram.AxisX.Alignment = AxisAlignment.Far; // 将 X 轴设置在图表底部
                            // 配置主 Y 轴
                            xyDiagram.AxisY.Title.Text = "扬程/m";
                            xyDiagram.AxisY.Title.Visibility = DefaultBoolean.True;
                            xyDiagram.AxisY.Visibility = DefaultBoolean.True;
                            // 创建两个面板
                            XYDiagramPane pane1 = new XYDiagramPane();
                            pane1.Name = "Pane 1";
                            xyDiagram.Panes.Add(pane1);
                            XYDiagramPane pane2 = new XYDiagramPane();
                            pane2.Name = "Pane 2";
                            xyDiagram.Panes.Add(pane2);
                            // 创建次要 Y 轴
                            SecondaryAxisY secondaryAxisY1 = new SecondaryAxisY("Secondary Y-Axis 1");
                            secondaryAxisY1.Title.Text = "功率";
                            secondaryAxisY1.Title.Visibility = DefaultBoolean.True;
                            secondaryAxisY1.Visibility = DefaultBoolean.True;
                            xyDiagram.SecondaryAxesY.Add(secondaryAxisY1);
                            SecondaryAxisY secondaryAxisY2 = new SecondaryAxisY("Secondary Y-Axis 2");
                            secondaryAxisY2.Title.Text = "效率";
                            secondaryAxisY2.Title.Visibility = DefaultBoolean.True;
                            secondaryAxisY2.Visibility = DefaultBoolean.True;
                            xyDiagram.SecondaryAxesY.Add(secondaryAxisY2);
                            chart.Diagram = xyDiagram;
                            ((System.ComponentModel.ISupportInitialize)(xyDiagram)).EndInit();
                            ((System.ComponentModel.ISupportInitialize)(chart)).EndInit();
                            // 创建第一个系列
                            Series series1 = new Series("Series 1", ViewType.Spline);
                            foreach (var qh in item.RatedCurveQH)
                            {
                                series1.Points.Add(new SeriesPoint(qh.X, qh.Y));
                            }
                            series1.LabelsVisibility = DefaultBoolean.False;
                            chart.Series.Add(series1);
                            // 创建第二个系列
                            Series series2 = new Series("Series 2", ViewType.Spline);
                            foreach (var qe in item.RatedCurveQE)
                            {
                                series2.Points.Add(new SeriesPoint(qe.X, qe.Y));
                            }
((XYDiagramSeriesViewBase)series2.View).Pane = pane2;
                            ((XYDiagramSeriesViewBase)series2.View).AxisY = secondaryAxisY2;
                            series2.LabelsVisibility = DefaultBoolean.False;
                            chart.Series.Add(series2);
                            // 创建第三个系列
                            Series series3 = new Series("Series 3", ViewType.Spline);
                            foreach (var qp in item.RatedCurveQP)
                            {
                                series3.Points.Add(new SeriesPoint(qp.X, qp.Y));
                            }
((XYDiagramSeriesViewBase)series3.View).Pane = pane1;
                            ((XYDiagramSeriesViewBase)series3.View).AxisY = secondaryAxisY1;
                            series3.LabelsVisibility = DefaultBoolean.False;
                            chart.Series.Add(series3);
                            Detail.Controls.Add(chart);
                            currentY += chart.HeightF;
                        }
                    }
                }
                currentY += 20F;
            }
            #endregion 水泵分析
            #region 监测分析
            var labForMonitor = CreateFirstCaption("(3)、监测分析", contentWidth - 25F, 15F, 20F, currentY);
            this.Detail.Controls.Add(labForMonitor);
            currentY += 20F;
            if (vm.WorkingList != null && vm.WorkingList.Count > 0)
            {
                foreach (var working in vm.WorkingList)
                {
                    if (working.MonitorAnaly.Items != null && working.MonitorAnaly.Items.Count > 0)
                    {                // 创建 XRTable
                        var tableForMonitorList = new XRTable();
                        tableForMonitorList.LocationF = new DevExpress.Utils.PointFloat(0F, currentY);
                        tableForMonitorList.SizeF = new SizeF(727F, 30F + working.MonitorAnaly.Items.Count * 25F); // 设置大小
                        // 创建表头行
                        XRTableRow headerRowMonitorList = new XRTableRow();
                        headerRowMonitorList.BackColor = Color.LightGray; // 设置背景颜色
                        // 添加表头列
                        headerRowMonitorList.Cells.Add(CreateTableCell("构件", 100));
                        headerRowMonitorList.Cells.Add(CreateTableCell("属性", 100));
                        headerRowMonitorList.Cells.Add(CreateTableCell("计算值", 100));
                        headerRowMonitorList.Cells.Add(CreateTableCell("单位", 100));
                        // 将表头行添加到表格
                        tableForMonitorList.Rows.Add(headerRowMonitorList);
                        foreach (var item in working.MonitorAnaly.Items)
                        {
                            // 创建数据行
                            var dataRow = new XRTableRow();
                            dataRow.Cells.Add(new XRTableCell()
                            {
                                Text = item.VisualName,
                                WidthF = 100F,
                                TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleCenter,
                                Borders = DevExpress.XtraPrinting.BorderSide.All
                            });
                            dataRow.Cells.Add(new XRTableCell()
                            {
                                Text = item.PropName,
                                WidthF = 100F,
                                TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleCenter,
                                Borders = DevExpress.XtraPrinting.BorderSide.All
                            });
                            dataRow.Cells.Add(new XRTableCell()
                            {
                                Text = item.CalcuValue?.ToString(),
                                WidthF = 100F,
                                TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleCenter,
                                Borders = DevExpress.XtraPrinting.BorderSide.All
                            });
                            dataRow.Cells.Add(new XRTableCell()
                            {
                                Text = item.UnitName,
                                WidthF = 100F,
                                TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleCenter,
                                Borders = DevExpress.XtraPrinting.BorderSide.All
                            });
                            tableForMonitorList.Rows.Add(dataRow);
                        }
                        // 将表格添加到Detail
                        this.Detail.Controls.Add(tableForMonitorList);
                        currentY += tableForMonitorList.HeightF;
                        currentY += 20F;
                    }
                }
            }
            #endregion 监测分析
            #region 能耗分析
            var labForEnergyAnaly = CreateFirstCaption("(4)、能耗分析", contentWidth - 25F, 15F, 20F, currentY);
            this.Detail.Controls.Add(labForEnergyAnaly);
            currentY += 20F;
            if (vm.WorkingList != null && vm.WorkingList.Count > 0)
            {
                foreach (var working in vm.WorkingList)
                {
                    if (working.EnergyAnaly != null)
                    {
                        if (working.EnergyAnaly.Items != null && working.EnergyAnaly.Items.Count > 0)
                        {
                            var group = working.EnergyAnaly.Items.GroupBy(x => x.BeginGroup).ToArray();
                            foreach (var item in group)
                            {
                                var label = CreateFirstCaption(item.Key, contentWidth - 25F, 15F, 20F, currentY);
                                this.Detail.Controls.Add(label);
                                currentY += 20F;
                                XRChart chartQh = new XRChart();
                                chartQh.LocationF = new DevExpress.Utils.PointFloat(0F, currentY);
                                chartQh.WidthF = contentWidth;
                                chartQh.HeightF = 300F;
                                XRChart chartQE = new XRChart();
                                chartQE.LocationF = new DevExpress.Utils.PointFloat(0F, currentY + chartQh.HeightF);
                                chartQE.WidthF = contentWidth;
                                chartQE.HeightF = 300F;
                                XRChart chartQP = new XRChart();
                                chartQP.LocationF = new DevExpress.Utils.PointFloat(0F, currentY + chartQh.HeightF + chartQE.HeightF);
                                chartQP.WidthF = contentWidth;
                                chartQP.HeightF = 300F;
                                foreach (var valve in item)
                                {
                                    // 创建一个线系列
                                    Series series = new Series(valve.Code, ViewType.Spline);
                                    // 添加数据点
                                    foreach (var qh in valve.CurrentCurveQH)
                                    {
                                        series.Points.Add(new SeriesPoint(qh.X.ToString(), qh.Y.ToString()));
                                    }
                                    chartQh.Series.Add(series);
                                    Series series2 = new Series("Series2", ViewType.Spline);
                                    // 添加数据点
                                    foreach (var qe in valve.CurrentCurveQE)
                                    {
                                        series2.Points.Add(new SeriesPoint(qe.X.ToString(), qe.Y.ToString()));
                                    }
                                    chartQE.Series.Add(series2);
                                    Series series3 = new Series("Series3", ViewType.Spline);
                                    // 添加数据点
                                    foreach (var qp in valve.CurrentCurveQP)
                                    {
                                        series3.Points.Add(new SeriesPoint(qp.X.ToString(), qp.Y.ToString()));
                                    }
                                    chartQP.Series.Add(series3);
                                }
                                this.Detail.Controls.Add(chartQh);
                                this.Detail.Controls.Add(chartQE);
                                this.Detail.Controls.Add(chartQP);
                                currentY += chartQh.HeightF + chartQE.HeightF + chartQP.HeightF;
                            }
                        }
                    }
                }
            }
            #endregion 能耗分析
            //能效明细
            var labForEnergyDetails = CreateFirstCaption("(4.1)、能效明细", contentWidth - 25F, 15F, 20F, currentY);
            this.Detail.Controls.Add(labForEnergyDetails);
            currentY += 20F;
            if (vm.WorkingList != null && vm.WorkingList.Count > 0)
            {
                foreach (var working in vm.WorkingList)
                {
                    if (working.EnergyAnaly.Items != null && working.EnergyAnaly.Items.Count > 0)
                    {
                        // 创建 XRTable
                        var tableForEnergyDetails = new XRTable();
                        tableForEnergyDetails.LocationF = new DevExpress.Utils.PointFloat(0F, currentY);
                        tableForEnergyDetails.SizeF = new SizeF(727F, 30F + working.EnergyAnaly.Items.Count * 25F); // 设置大小
                        // 创建表头行
                        XRTableRow headerRowEnergyDetails = new XRTableRow();
                        headerRowEnergyDetails.BackColor = Color.LightGray; // 设置背景颜色
                        // 添加表头列
                        headerRowEnergyDetails.Cells.Add(CreateTableCell("分组", 100));
                        headerRowEnergyDetails.Cells.Add(CreateTableCell("名称", 100));
                        headerRowEnergyDetails.Cells.Add(CreateTableCell("运行状态", 100));
                        headerRowEnergyDetails.Cells.Add(CreateTableCell("设定评率(hz)", 100));
                        headerRowEnergyDetails.Cells.Add(CreateTableCell("设定流量(m³/h)", 100));
                        headerRowEnergyDetails.Cells.Add(CreateTableCell("进口压力(m)", 100));
                        headerRowEnergyDetails.Cells.Add(CreateTableCell("出口压力(m)", 100));
                        headerRowEnergyDetails.Cells.Add(CreateTableCell("扬程(m)", 100));
                        headerRowEnergyDetails.Cells.Add(CreateTableCell("功率(Kw)", 100));
                        headerRowEnergyDetails.Cells.Add(CreateTableCell("效率(%)", 100));
                        // 将表头行添加到表格
                        tableForEnergyDetails.Rows.Add(headerRowEnergyDetails);
                        foreach (var item in working.EnergyAnaly.Items)
                        {
                            // 创建数据行
                            var dataRow = new XRTableRow();
                            dataRow.Cells.Add(new XRTableCell()
                            {
                                Text = item.BeginGroup,
                                WidthF = 100F,
                                TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleCenter,
                                Borders = DevExpress.XtraPrinting.BorderSide.All
                            });
                            dataRow.Cells.Add(new XRTableCell()
                            {
                                Text = item.Name,
                                WidthF = 100F,
                                TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleCenter,
                                Borders = DevExpress.XtraPrinting.BorderSide.All
                            });
                            dataRow.Cells.Add(new XRTableCell()
                            {
                                Text = item.LinkStatus,
                                WidthF = 100F,
                                TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleCenter,
                                Borders = DevExpress.XtraPrinting.BorderSide.All
                            });
                            dataRow.Cells.Add(new XRTableCell()
                            {
                                Text = item.CurrentHz.ToString(),
                                WidthF = 100F,
                                TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleCenter,
                                Borders = DevExpress.XtraPrinting.BorderSide.All
                            });
                            dataRow.Cells.Add(new XRTableCell()
                            {
                                Text = item.RatedHz.ToString(),
                                WidthF = 100F,
                                TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleCenter,
                                Borders = DevExpress.XtraPrinting.BorderSide.All
                            });
                            tableForEnergyDetails.Rows.Add(dataRow);
                        }
                        // 将表格添加到Detail
                        this.Detail.Controls.Add(tableForEnergyDetails);
                        currentY += tableForEnergyDetails.HeightF;
                        currentY += 20F;
                    }
                }
            }
            #region 损失曲线
            var labForLossCurve = CreateFirstCaption("(5)、损失曲线", contentWidth - 25F, 15F, 20F, currentY);
            this.Detail.Controls.Add(labForLossCurve);
            currentY += 20F;
            if (vm.WorkingList != null && vm.WorkingList.Count > 0)
            {
                foreach (var working in vm.WorkingList)
                {
                    if (working.LossCurve != null && working.LossCurve.Items != null)
                    {
                        XRChart chart = new XRChart();
                        chart.LocationF = new DevExpress.Utils.PointFloat(0F, currentY);
                        chart.WidthF = contentWidth;
                        chart.HeightF = 300F;
                        // 创建一个线系列
                        Series series = new Series("Series1", ViewType.Area);
                        Series series2 = new Series("Series2", ViewType.Area);
                        Series series3 = new Series("Series3", ViewType.Area);
                        // 添加数据点
                        foreach (var item in working.LossCurve.End.Items)
                        {
                            series.Points.Add(new SeriesPoint(item.X, item.Y));
                        }
                        // 添加数据点
                        foreach (var item in working.LossCurve.Start.Items)
                        {
                            series2.Points.Add(new SeriesPoint(item.X, item.Y));
                        }   // 添加数据点
                        foreach (var item in working.LossCurve.Elev.Items)
                        {
                            series3.Points.Add(new SeriesPoint(item.X, item.Y));
                        }
                        chart.Series.Add(series);
                        chart.Series.Add(series2);
                        chart.Series.Add(series3);
                        Detail.Controls.Add(chart);
                        currentY += chart.HeightF;
                    }
                }
            }
            #endregion 损失曲线
            #region 损失统计
            var labForLossStatistics = CreateFirstCaption("(6)、损失统计", contentWidth - 25F, 15F, 20F, currentY);
            this.Detail.Controls.Add(labForLossStatistics);
            currentY += 20F;
            if (vm.WorkingList != null && vm.WorkingList.Count > 0)
            {
                foreach (var working in vm.WorkingList)
                {
                    var accuracyScaleChart = CreateLossStatistics(working.LossStatistics, 350F, 230F, 0F, currentY);
                    Detail.Controls.Add(accuracyScaleChart);
                    var EnergyLossChart = CreateEnergyLoss(working.LossStatistics, 377F, 230F, 350F, currentY);
                    Detail.Controls.Add(EnergyLossChart);
                    currentY += accuracyScaleChart.HeightF;
                    var CategoryChart = CreateCategory(working.LossStatistics, 727F, 230F, 0F, currentY);
                    Detail.Controls.Add(CategoryChart);
                }
            }
            #endregion 损失统计
        }
        public class Product
        //创建一级标题
        private XRLabel CreateFirstCaption(string caption, float sizeX, float sizeY, float locationX, float locationY)
        {
            public string Name { get; set; }
            public decimal Code { get; set; }
            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;
        }
        public List<Product> CreateSampleProductList()
        //创建精度比例
        private XRChart CreateAccuracyScale(SimulationPrintAccuracyScaleViewModel scale, float sizeX, float sizeY, float locationY)
        {
            List<Product> products = new List<Product>
    {
        new Product { Name = "苹果", Code = 5.99m },
        new Product { Name = "香蕉", Code = 3.99m },
        new Product { Name = "橙子", Code = 4.99m }
    };
            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);
            return products;
            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 != null)
            {
                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 CreateLossStatistics(HydroLossStatisticsViewModel statistics, 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);
            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", 8F, 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 (statistics != null)
            {
                if (statistics.Input.Items != null && statistics.Input.Items.Count > 0)
                {
                    foreach (var item in statistics.Input.Items)
                    {
                        series.Points.Add(new SeriesPoint(item.EnergyName.ToString(), item.EnergyValue));
                    }
                }
                doughnutSeriesView.TotalLabel.TextPattern = $"总能量:{statistics.Input.TotalEnergyValue:P0}";
            }
            return chart;
        }
        //创建能量统计
        private XRChart CreateCategory(HydroLossStatisticsViewModel statistics, 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.SizeF = new System.Drawing.SizeF(sizeX, sizeY);
            chart.StylePriority.UseBackColor = false;
            chart.StylePriority.UsePadding = false;
            if (statistics != null)
            {
                if (statistics.Category != null && statistics.Category.Items.Count > 0)
                {
                    foreach (var item in statistics.Category.Items)
                    {
                        var series1 = new Series(item.EnergyName, ViewType.Bar);
                        series1.Points.Add(new SeriesPoint(item.EnergyName.ToString(), item.EnergyValue));
                        // 获取系列视图并转换为 BarSeriesView 类型
                        BarSeriesView barSeriesView = (BarSeriesView)series1.View;
                        series1.Label.TextPattern = "{V} KW";
                        // 设置柱子宽度,这里设置为 0.8,可根据需要调整
                        barSeriesView.BarWidth = 2.5;
                        // 将系列添加到图表中
                        chart.Series.Add(series1);
                    }
                }
            }
            return chart;
        }
        //创建能量损失
        private XRChart CreateEnergyLoss(HydroLossStatisticsViewModel statistics, 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);
            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", 8F, 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 (statistics != null)
            {
                if (statistics.Catalog != null && statistics.Catalog.Items.Count > 0)
                {
                    foreach (var item in statistics.Catalog.Items)
                    {
                        series.Points.Add(new SeriesPoint(item.EnergyName.ToString(), item.EnergyValue));
                    }
                }
                doughnutSeriesView.TotalLabel.TextPattern = $"总损失:{statistics.Input.TotalEnergyValue:P0}";
            }
            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;
        }
    }
}