lx
2025-07-25 94ed3edb9e96c8bfa24d808dfc690cbd111a60e6
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
using Aspose.Words;
using Aspose.Words.Tables;
using Aspose.Words.Drawing;
using SkiaSharp;
using static System.Net.Mime.MediaTypeNames;
using ErrorAnalysis.Service.Model;
 
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 property = properties.FirstOrDefault(p => p.Name == cellText.Trim().Replace("$", ""));
                        if (property != null)
                        {
                            var valStr = property.GetValue(model).ToString();
 
                            cell.FirstParagraph.RemoveAllChildren();
                            cell.FirstParagraph.AppendChild(new Run(doc, valStr));
                            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);
            }
        }
    }
}