report_generate.py 4.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. # -*- coding: utf-8 -*-
  2. """
  3. @author: yq
  4. @time: 2024/11/8
  5. @desc:
  6. """
  7. import os
  8. from typing import Dict
  9. from docx import Document
  10. from docx.enum.text import WD_ALIGN_PARAGRAPH
  11. from commom import GeneralException, f_get_datetime
  12. from entitys import MetricFucEntity
  13. from enums import ResultCodesEnum, PlaceholderPrefixEnum
  14. class Report():
  15. @staticmethod
  16. def _fill_value_placeholder(doc: Document, metric_value_dict: Dict[str, MetricFucEntity]):
  17. # 替换指标
  18. for paragraph in doc.paragraphs:
  19. text = paragraph.text
  20. for metric_code, metric_fuc_entity in metric_value_dict.items():
  21. placeholder = f"{PlaceholderPrefixEnum.VALUE.value}_{metric_code}"
  22. metric_value = metric_fuc_entity.value
  23. if metric_value:
  24. text = text.replace(placeholder, metric_value)
  25. # 段落中多个runs时执行,最后一个run改成替换好的文本,其他run置空
  26. if len(paragraph.runs[:-1]) > 0:
  27. for run in paragraph.runs[:-1]:
  28. run.text = ''
  29. paragraph.runs[-1].text = text
  30. @staticmethod
  31. def _fill_table_placeholder(doc: Document, metric_value_dict: Dict[str, MetricFucEntity]):
  32. # 替换表格
  33. for paragraph in doc.paragraphs:
  34. for metric_code, metric_fuc_entity in metric_value_dict.items():
  35. placeholder = f"{PlaceholderPrefixEnum.TABLE.value}_{metric_code}"
  36. metric_table = metric_fuc_entity.table
  37. if metric_table.empty:
  38. continue
  39. # 清除占位符
  40. if not placeholder in paragraph.text:
  41. continue
  42. for run in paragraph.runs:
  43. run.text = run.text.replace(placeholder, "")
  44. table = doc.add_table(rows=metric_table.shape[0] + 1, cols=metric_table.shape[1])
  45. table.alignment = WD_ALIGN_PARAGRAPH.CENTER
  46. paragraph._element.addnext(table._element)
  47. # 列名
  48. for column_idx, column_name in enumerate(metric_table.columns):
  49. cell = table.cell(0, column_idx)
  50. cell.text = str(column_name)
  51. for run in cell.paragraphs[0].runs:
  52. run.bold = True
  53. cell.paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
  54. # 值
  55. for row_idx, row in metric_table.iterrows():
  56. for column_idx, value in enumerate(row):
  57. cell = table.cell(row_idx + 1, column_idx)
  58. cell.text = str(value)
  59. cell.paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
  60. # @staticmethod
  61. # def _fill_image_placeholder(doc: Document, metric_value_dict: Dict[str, MetricFucEntity]):
  62. # # 替换图片
  63. # for paragraph in doc.paragraphs:
  64. # text = paragraph.text
  65. # for metric_code, metric_fuc_entity in metric_value_dict.items():
  66. # placeholder = f"{PlaceholderPrefixEnum.IMAGE.value}_{metric_code}"
  67. # metric_value = metric_fuc_entity.value
  68. # if metric_value:
  69. # text = text.replace(placeholder, metric_value)
  70. # # 段落中多个runs时执行,最后一个run改成替换好的文本,其他run置空
  71. # if len(paragraph.runs[:-1]) > 0:
  72. # for run in paragraph.runs[:-1]:
  73. # run.text = ''
  74. # paragraph.runs[-1].text = text
  75. @staticmethod
  76. def generate_report(metric_value_dict: Dict[str, MetricFucEntity], template_path: str):
  77. if os.path.exists(template_path):
  78. doc = Document(template_path)
  79. else:
  80. raise GeneralException(ResultCodesEnum.NOT_FOUND, message=f"监控模板文件【{template_path}】不存在")
  81. Report._fill_value_placeholder(doc, metric_value_dict)
  82. Report._fill_table_placeholder(doc, metric_value_dict)
  83. # Report._fill_image_placeholder(doc, metric_value_dict)
  84. new_path = template_path.replace(".docx", f"{f_get_datetime()}.docx")
  85. doc.save(f"./{new_path}")
  86. if __name__ == "__main__":
  87. pass