DocService.cs 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. using System.Drawing;
  2. using GxPress.Service.Interface.Doc;
  3. using Spire.Doc;
  4. using Spire.Doc.Documents;
  5. using GxPress.Service.Interface;
  6. using System.Threading.Tasks;
  7. using GxPress.Result.App.Flow;
  8. using GxPress.Common.Tools;
  9. using System;
  10. using System.Collections.Generic;
  11. using System.Linq;
  12. namespace GxPress.Service.Implement.Doc
  13. {
  14. public class DocService : IDocService
  15. {
  16. private readonly IFlowService _flowService;
  17. public DocService(IFlowService flowService)
  18. {
  19. _flowService = flowService;
  20. }
  21. public async Task<string> MakeDoc(int flowId, int userId)
  22. {
  23. //获取Flow
  24. var flowDto = await _flowService.GetFlowResult(flowId, userId);
  25. //创建一个Document实例
  26. Document doc = new Document();
  27. //添加一个section
  28. Section sec = doc.AddSection();
  29. //添加三个段落并写入文字
  30. Paragraph para1 = sec.AddParagraph();
  31. para1.AppendText(flowDto.Name);
  32. //将第一段作为标题,设置标题格式
  33. ParagraphStyle style1 = new ParagraphStyle(doc);
  34. style1.Name = "titleStyle";
  35. style1.CharacterFormat.Bold = true;
  36. style1.CharacterFormat.TextColor = Color.Black;
  37. style1.CharacterFormat.FontName = "楷体";
  38. style1.CharacterFormat.FontSize = 18f;
  39. doc.Styles.Add(style1);
  40. para1.ApplyStyle("titleStyle");
  41. //设置其余两个段落的格式
  42. ParagraphStyle style2 = new ParagraphStyle(doc);
  43. style2.Name = "paraStyle";
  44. style2.CharacterFormat.FontName = "楷体";
  45. style2.CharacterFormat.FontSize = 15f;
  46. doc.Styles.Add(style2);
  47. //设置三个段落的对齐方式
  48. para1.Format.HorizontalAlignment = HorizontalAlignment.Center;
  49. //设置段首缩进
  50. // para2.Format.FirstLineIndent = 30f;
  51. //设置段落之间的间距
  52. para1.Format.AfterSpacing = 15f;
  53. //创建表格
  54. var teable = CreateDocHeadTable(sec, flowDto);
  55. //流程
  56. // CreateDocFlowTable(teable, flowDto);
  57. //保存文档
  58. var ticks = DateTime.Now.Ticks.ToString();
  59. doc.SaveToFile($"wwwroot/cache/doc/{ticks}.docx", FileFormat.Docx2013);
  60. return $"/cache/doc/{ticks}.docx";
  61. }
  62. /// <summary>
  63. /// 创建表格
  64. /// </summary>
  65. /// <param name="section"></param>
  66. /// <returns></returns>
  67. private Table CreateDocHeadTable(Section section, FlowResult flowDto)
  68. {
  69. var site = new Dictionary<string, string>();
  70. site.Add("审批标号", flowDto.No);
  71. site.Add("所在部门", flowDto.DepartmentName);
  72. site.Add("提交时间", Convert.ToDateTime(flowDto.CreatedDate).ToString("yyyy-MM-dd HH:mm:ss"));
  73. Table table = section.AddTable(true);
  74. table.ResetCells(site.Count + flowDto.FormFields.Count + 2 + flowDto.Nodes.Count + 1, 4);
  75. TableRow row = table.Rows[0];
  76. row.IsHeader = true;
  77. int i = 0;
  78. foreach (var item in site)
  79. {
  80. //合并单元格
  81. table.ApplyHorizontalMerge(i, 0, 1);
  82. var para = table[i, 0].AddParagraph();
  83. var TR1 = para.AppendText(item.Key);
  84. //合并单元格
  85. table.ApplyHorizontalMerge(i, 2, 3);
  86. para = table[i, 2].AddParagraph();
  87. TR1 = para.AppendText(item.Value);
  88. i++;
  89. }
  90. foreach (var item in flowDto.FormFields)
  91. {
  92. table.ApplyHorizontalMerge(i, 0, 1);
  93. var TR2 = table[i, 0].AddParagraph().AppendText(item.Label);
  94. TR2.CharacterFormat.FontName = "Arial";
  95. TR2.CharacterFormat.FontSize = 10;
  96. table.ApplyHorizontalMerge(i, 2, 3);
  97. TR2 = table[i, 2].AddParagraph().AppendText(item.Value);
  98. TR2.CharacterFormat.FontName = "Arial";
  99. TR2.CharacterFormat.FontSize = 10;
  100. i++;
  101. }
  102. table.ApplyHorizontalMerge(i, 0, 3);
  103. var TR = table[i, 0].AddParagraph().AppendText("审核流程");
  104. TR.CharacterFormat.FontName = "Arial";
  105. TR.CharacterFormat.FontSize = 14;
  106. i++;
  107. //审核流程
  108. TR = table[i, 0].AddParagraph().AppendText("姓名");
  109. TR = table[i, 1].AddParagraph().AppendText("状态");
  110. TR = table[i, 2].AddParagraph().AppendText("备注");
  111. TR = table[i, 3].AddParagraph().AppendText("时间");
  112. i++;
  113. foreach (var item in flowDto.Nodes)
  114. {
  115. var TR3 = table[i, 0].AddParagraph().AppendText(item.Name);
  116. TR3.CharacterFormat.FontName = "Arial";
  117. TR3.CharacterFormat.FontSize = 10;
  118. TR3 = table[i, 1].AddParagraph().AppendText(item.Action);
  119. TR3.CharacterFormat.FontName = "Arial";
  120. TR3.CharacterFormat.FontSize = 10;
  121. TR3 = table[i, 2].AddParagraph().AppendText(item.Message);
  122. TR3.CharacterFormat.FontName = "Arial";
  123. TR3.CharacterFormat.FontSize = 10;
  124. TR3 = table[i, 3].AddParagraph().AppendText(Convert.ToDateTime(item.CreatedDate).ToString("yyyy-MM-dd HH:mm:ss"));
  125. TR3.CharacterFormat.FontName = "Arial";
  126. TR3.CharacterFormat.FontSize = 10;
  127. i++;
  128. }
  129. TR = table[i, 0].AddParagraph().AppendText("抄送人");
  130. TR.CharacterFormat.FontName = "Arial";
  131. TR.CharacterFormat.FontSize = 10;
  132. table.ApplyHorizontalMerge(i, 1, 3);
  133. TR = table[i, 0].AddParagraph().AppendText(StringUtils.ObjectCollectionToString(flowDto.CarbonCopyUsers.Select(n => n.Name), "丶"));
  134. TR.CharacterFormat.FontName = "Arial";
  135. TR.CharacterFormat.FontSize = 10;
  136. return table;
  137. }
  138. }
  139. }