lx
2025-08-05 5a4ad30aed8871832885526fcb0eaf049540384d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
using Aspose.Words;
using Aspose.Words.Tables;
using Aspose.Words.Drawing;
using SkiaSharp;
using static System.Net.Mime.MediaTypeNames;
using ErrorAnalysis.Service.Model;
using System.Drawing;
 
namespace ErrorAnalysis.Service
{
    public class WordReportHelper
    {
        /// <summary>
        /// 报告类型枚举值pdf和word
        /// </summary>
        public enum ReportType
        {
            Pdf,
            Word
        }
        /// <summary>
        /// 静态构造函数
        /// </summary>
        static WordReportHelper()
        {
            new License().SetLicense(new MemoryStream(Convert.FromBase64String("PExpY2Vuc2U+CiAgPERhdGE+CiAgICA8TGljZW5zZWRUbz5TdXpob3UgQXVuYm94IFNvZnR3YXJlIENvLiwgTHRkLjwvTGljZW5zZWRUbz4KICAgIDxFbWFpbFRvPnNhbGVzQGF1bnRlYy5jb208L0VtYWlsVG8+CiAgICA8TGljZW5zZVR5cGU+RGV2ZWxvcGVyIE9FTTwvTGljZW5zZVR5cGU+CiAgICA8TGljZW5zZU5vdGU+TGltaXRlZCB0byAxIGRldmVsb3BlciwgdW5saW1pdGVkIHBoeXNpY2FsIGxvY2F0aW9uczwvTGljZW5zZU5vdGU+CiAgICA8T3JkZXJJRD4yMDA2MDIwMTI2MzM8L09yZGVySUQ+CiAgICA8VXNlcklEPjEzNDk3NjAwNjwvVXNlcklEPgogICAgPE9FTT5UaGlzIGlzIGEgcmVkaXN0cmlidXRhYmxlIGxpY2Vuc2U8L09FTT4KICAgIDxQcm9kdWN0cz4KICAgICAgPFByb2R1Y3Q+QXNwb3NlLlRvdGFsIGZvciAuTkVUPC9Qcm9kdWN0PgogICAgPC9Qcm9kdWN0cz4KICAgIDxFZGl0aW9uVHlwZT5FbnRlcnByaXNlPC9FZGl0aW9uVHlwZT4KICAgIDxTZXJpYWxOdW1iZXI+OTM2ZTVmZDEtODY2Mi00YWJmLTk1YmQtYzhkYzBmNTNhZmE2PC9TZXJpYWxOdW1iZXI+CiAgICA8U3Vic2NyaXB0aW9uRXhwaXJ5PjIwMjEwODI3PC9TdWJzY3JpcHRpb25FeHBpcnk+CiAgICA8TGljZW5zZVZlcnNpb24+My4wPC9MaWNlbnNlVmVyc2lvbj4KICAgIDxMaWNlbnNlSW5zdHJ1Y3Rpb25zPmh0dHBzOi8vcHVyY2hhc2UuYXNwb3NlLmNvbS9wb2xpY2llcy91c2UtbGljZW5zZTwvTGljZW5zZUluc3RydWN0aW9ucz4KICA8L0RhdGE+CiAgPFNpZ25hdHVyZT5wSkpjQndRdnYxV1NxZ1kyOHFJYUFKSysvTFFVWWRrQ2x5THE2RUNLU0xDQ3dMNkEwMkJFTnh5L3JzQ1V3UExXbjV2bTl0TDRQRXE1aFAzY2s0WnhEejFiK1JIWTBuQkh1SEhBY01TL1BSeEJES0NGbWg1QVFZRTlrT0FxSzM5NVBSWmJRSGowOUNGTElVUzBMdnRmVkp5cUhjblJvU3dPQnVqT1oyeDc4WFE9PC9TaWduYXR1cmU+CjwvTGljZW5zZT4=")));
        }
 
        public static bool Create(string outPath, ReportModel model, ReportType reportType = ReportType.Pdf)
        {
            string filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Template", "JobPlanReportTemp.docx");
 
            Document doc = new Document(filePath);
            var section = doc.FirstSection;
 
            var tables = section.Body.Tables;
 
            foreach (Table table in tables) SetContentTable(doc, table, model);
 
 
 
 
            section.Body.Paragraphs.RemoveAt(section.Body.Paragraphs.Count - 1);
            DocumentBuilder builder = new DocumentBuilder(doc);
            var lastSection = doc.LastSection;
            var pageWidth = lastSection.PageSetup.PageWidth - lastSection.PageSetup.LeftMargin - lastSection.PageSetup.RightMargin;
 
            builder.MoveToSection(doc.IndexOf(lastSection));
            builder.MoveToDocumentEnd();
 
            var coImg = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "co.png");
            var erImg = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "er.png");
 
            AddImageToDocument(builder, pageWidth, coImg);
 
            var para = builder.InsertParagraph();
            var run = new Run(doc);
            para.ParagraphFormat.Alignment = ParagraphAlignment.Left;
            run.Font.Bold = true;
            run.Font.Size = 14;
            run.Text = "ERROR RATE PLOT";
            para.AppendChild(run);
 
            AddImageToDocument(builder, pageWidth, erImg);
 
            doc.Save(outPath, reportType == ReportType.Word ? SaveFormat.Docx : SaveFormat.Pdf);
 
            return true;
        }
 
 
        /// <summary>
        /// 设置内容表格
        /// </summary>
        /// <param name="doc">文档</param>
        /// <param name="table">表格</param>
        /// <param name="model">模型</param>
        private static void SetContentTable(Document doc, Table table, object model)
        {
            var properties = model?.GetType().GetProperties();
            foreach (Row row in table.Rows)
            {
                var cells = row.Cells;
                foreach (Cell cell in cells)
                {
                    var cellText = cell.GetText().Replace(ControlChar.Cell, "").Replace(ControlChar.ParagraphBreak, "");
                    if (cellText.StartsWith("$"))
                    {
                        var name = cellText.Trim().Replace("$", "");
                        var property = properties.FirstOrDefault(p => p.Name == name);
                        if (property != null)
                        {
                            var valStr = property.GetValue(model).ToString();
                            var run = new Run(doc, valStr);
                            if (name == "Pass" || name == "Speed" || name == "Duration")
                                run.Font.Color = Color.Red; run.Font.Bold = true;
 
                            cell.FirstParagraph.RemoveAllChildren();
                            cell.FirstParagraph.AppendChild(run);
                            cell.FirstParagraph.ParagraphFormat.Alignment = ParagraphAlignment.Right;
                        }
                    }
                }
            }
        }
 
        /// <summary>
        /// 向文档中添加图像。
        /// </summary>
        /// <param name="builder">文档构建器。</param>
        /// <param name="pageWidth">页面宽度。</param>
        /// <param name="imagePath">图像路径。</param>
        private static void AddImageToDocument(DocumentBuilder builder, double pageWidth, string imagePath)
        {
            using (FileStream picStream = new FileStream(imagePath, FileMode.Open, FileAccess.Read))
            {
                SKBitmap image;
                using (var skData = SKData.Create(picStream))
                {
                    image = SKBitmap.Decode(skData);
                }
                int originalWidth = image.Width;
                int originalHeight = image.Height;
                int height = (int)(originalHeight * (pageWidth / originalWidth));
                picStream.Seek(0, SeekOrigin.Begin);
 
                builder.InsertImage(image, pageWidth, height);
            }
        }
    }
}