Переглянути джерело

add: word表格及值替换

yq 5 місяців тому
батько
коміт
1028144b3a

+ 1 - 1
entitys/metric_entity.py

@@ -36,7 +36,7 @@ class MetricFucEntity():
         self._image_path = image_path
 
     @property
-    def table(self):
+    def table(self) -> pd.DataFrame:
         return self._table
 
     @property

+ 2 - 2
enums/__init__.py

@@ -4,7 +4,7 @@
 @time: 2024/10/30
 @desc: 枚举值
 """
-
+from .placeholder_prefix_enum import PlaceholderPrefixEnum
 from .result_codes_enum import ResultCodesEnum
 
-__all__ = ['ResultCodesEnum']
+__all__ = ['ResultCodesEnum', 'PlaceholderPrefixEnum']

+ 15 - 0
enums/placeholder_prefix_enum.py

@@ -0,0 +1,15 @@
+# -*- coding:utf-8 -*-
+"""
+@author: yq
+@time: 2023/9/18
+@desc: 模板占位符前缀
+"""
+
+from enum import Enum
+
+
+class PlaceholderPrefixEnum(Enum):
+
+    VALUE = ""
+    TABLE = "table"
+    IMAGE = "image"

+ 97 - 0
monitor/report_generate.py

@@ -0,0 +1,97 @@
+# -*- coding: utf-8 -*-
+"""
+@author: yq
+@time: 2024/11/8
+@desc: 
+"""
+import os
+from typing import Dict
+
+from commom import GeneralException
+from entitys import MetricFucEntity
+from docx import Document
+from docx.enum.text import WD_ALIGN_PARAGRAPH
+
+from enums import ResultCodesEnum, PlaceholderPrefixEnum
+
+
+class Report():
+
+    @staticmethod
+    def _fill_value_placeholder(doc: Document, metric_value_dict: Dict[str, MetricFucEntity]):
+        # 替换指标
+        for paragraph in doc.paragraphs:
+            text = paragraph.text
+            for metric_code, metric_fuc_entity in metric_value_dict.items():
+                placeholder = f"{PlaceholderPrefixEnum.VALUE.value}_{metric_code}"
+                metric_value = metric_fuc_entity.value
+                if metric_value:
+                    text = text.replace(placeholder, metric_value)
+            # 段落中多个runs时执行,最后一个run改成替换好的文本,其他run置空
+            if len(paragraph.runs[:-1]) > 0:
+                for run in paragraph.runs[:-1]:
+                    run.text = ''
+                paragraph.runs[-1].text = text
+
+    @staticmethod
+    def _fill_table_placeholder(doc: Document, metric_value_dict: Dict[str, MetricFucEntity]):
+        # 替换表格
+        for paragraph in doc.paragraphs:
+            for metric_code, metric_fuc_entity in metric_value_dict.items():
+                placeholder = f"{PlaceholderPrefixEnum.TABLE.value}_{metric_code}"
+                metric_table = metric_fuc_entity.table
+                if not metric_table:
+                    continue
+                # 清除占位符
+                if placeholder in paragraph.text:
+                    for run in paragraph.runs:
+                        run.text = run.text.replace(placeholder, "")
+                    table = doc.add_table(rows=metric_table.shape[0] + 1, cols=metric_table.shape[1])
+                    table.alignment = WD_ALIGN_PARAGRAPH.CENTER
+                    paragraph._element.addnext(table._element)
+                    # 列名
+                    for column_idx, column_name in enumerate(metric_table.columns):
+                        cell = table.cell(0, column_idx)
+                        cell.text = str(column_name)
+                        for run in cell.paragraphs[0].runs:
+                            run.bold = True
+                        cell.paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
+                    # 值
+                    for row_idx, row in metric_table.iterrows():
+                        for column_idx, value in enumerate(row):
+                            cell = table.cell(row_idx + 1, column_idx)
+                            cell.text = str(value)
+                            cell.paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
+
+    @staticmethod
+    def _fill_image_placeholder(doc: Document, metric_value_dict: Dict[str, MetricFucEntity]):
+        # 替换图片
+        for paragraph in doc.paragraphs:
+            text = paragraph.text
+            for metric_code, metric_fuc_entity in metric_value_dict.items():
+                placeholder = f"{PlaceholderPrefixEnum.IMAGE.value}_{metric_code}"
+                metric_value = metric_fuc_entity.value
+                if metric_value:
+                    text = text.replace(placeholder, metric_value)
+            # 段落中多个runs时执行,最后一个run改成替换好的文本,其他run置空
+            if len(paragraph.runs[:-1]) > 0:
+                for run in paragraph.runs[:-1]:
+                    run.text = ''
+                paragraph.runs[-1].text = text
+
+    @staticmethod
+    def report_generate(metric_value_dict: Dict[str, MetricFucEntity], template_path: str):
+        if os.path.exists(template_path):
+            doc = Document(template_path)
+        else:
+            raise GeneralException(ResultCodesEnum.NOT_FOUND, message=f"监控模板文件【{template_path}】不存在")
+
+        Report._fill_value_placeholder(doc, metric_value_dict)
+        Report._fill_table_placeholder(doc, metric_value_dict)
+        Report._fill_image_placeholder(doc, metric_value_dict)
+
+        doc.save(f"./{template_path}_")
+
+
+if __name__ == "__main__":
+    pass