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);
|
}
|
}
|
}
|
}
|