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 { /// /// 报告类型枚举值pdf和word /// public enum ReportType { Pdf, Word } /// /// 静态构造函数 /// 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; } /// /// 设置内容表格 /// /// 文档 /// 表格 /// 模型 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; } } } } } /// /// 向文档中添加图像。 /// /// 文档构建器。 /// 页面宽度。 /// 图像路径。 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); } } } }