From 96350bb8e2298a5e78d6d7f31ca61c5097f85b9c Mon Sep 17 00:00:00 2001 From: Jeffrey Hsu Date: Tue, 20 Jan 2026 23:19:10 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=95=B0=E6=8D=AE=E9=AA=8C?= =?UTF-8?q?=E8=AF=81=E9=80=BB=E8=BE=91=EF=BC=8C=E6=8A=9B=E5=87=BA=E8=87=AA?= =?UTF-8?q?=E5=AE=9A=E4=B9=89=E5=BC=82=E5=B8=B8=E4=BB=A5=E5=A4=84=E7=90=86?= =?UTF-8?q?=E9=AA=8C=E8=AF=81=E5=A4=B1=E8=B4=A5=E6=83=85=E5=86=B5=EF=BC=9B?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=94=99=E8=AF=AF=E5=A4=84=E7=90=86=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E4=BB=A5=E6=98=BE=E7=A4=BA=E8=AF=A6=E7=BB=86=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- module/achievement/doc.py | 5 +++-- module/achievement/excel.py | 34 ++++++++++++++++++++++++++++------ ui/pyui/achievement_ui.py | 10 ++++++++++ 3 files changed, 41 insertions(+), 8 deletions(-) diff --git a/module/achievement/doc.py b/module/achievement/doc.py index d4d5778..e5d8824 100644 --- a/module/achievement/doc.py +++ b/module/achievement/doc.py @@ -160,8 +160,9 @@ class DocxWriter: cell_end = table.cell(row, col_span + non_none_count - 1) cell_start.merge(cell_end) except IndexError: - self.signal(f"单元格合并失败:({row}, {col_span}),需要自行检查表格准确性", - LOGLEVEL.WARNING) + pass + # self.signal(f"单元格合并失败:({row}, {col_span}),需要自行检查表格准确性", + # LOGLEVEL.WARNING) col_span += non_none_count start = rows - X + 3 + self.excel_reader.kpi_number diff --git a/module/achievement/excel.py b/module/achievement/excel.py index 642e139..a6d6046 100644 --- a/module/achievement/excel.py +++ b/module/achievement/excel.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 Jeffrey Hsu - JITToolBox +# Copyright (c) 2025-2026 Jeffrey Hsu - JITToolBox # # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -73,6 +73,13 @@ class ExcelReader: image = io.BytesIO(self._images[cell]()) return Image.open(image) + class ValidError(Exception): + def __init__(self, message): + self.message = message + + def __str__(self): + return self.message + def __init__(self, file_path: str, version_check: bool = False, signal: Callable[[str, str], None] = lambda x, y: print(x)): super().__init__() @@ -271,9 +278,15 @@ class ExcelReader: for i in range(len(self.suggestion_template_list), 5): self.suggestion_template_list.append(None) - self.validate_data() + if vd_lst := self.validate_data(): + raise self.ValidError("\n\n".join(vd_lst)) + self.gen_picture() + except self.ValidError as ve: + raise Exception(f""" + 数据验证失败:\n\n{str(ve)} + """) except Exception as e: error_message = traceback.format_exc() raise Exception(f""" @@ -284,9 +297,18 @@ class ExcelReader: def set_file_path(self, file_path: str): self.file_path = file_path - def validate_data(self): + def validate_data(self) -> list[str]: + lst: list[str] = [] self.signal("正在验证数据", LOGLEVEL.INFO) - return 0 + if len(self.kpi_list) != self.kpi_number: + self.signal("\"课程目标\"或\"目标支撑的毕业要求指标点\"数量与期望目标数量不符", LOGLEVEL.ERROR) + lst.append( + f"\"课程目标\"或\"目标支撑的毕业要求指标点\"数量与期望目标数量不符,请检查Excel表格中的\"课程目标\"和\"目标支撑的毕业要求指标点\"列是否填写完整。" + f"期望得到 {self.kpi_number} 个,实际检测到 {len(self.kpi_list)} 个。" + f"(如想暂时不填,请在Excel表格对应的位置添加一个空格)" + ) + + return lst def run(self): self.parse_excel() @@ -655,7 +677,7 @@ class ExcelReader: yield "专业负责人/系主任(签字)" yield ("整改意见:\n" "\n\n\n" - f"{" "*8}{self.suggestion_template_list[3] if self.suggestion_template_list[3] is not None else '\n\n\n'}\n\n\n") + f"{" " * 8}{self.suggestion_template_list[3] if self.suggestion_template_list[3] is not None else '\n\n\n'}\n\n\n") yield "" yield "签字:" yield "" @@ -664,7 +686,7 @@ class ExcelReader: yield "课程负责人(签字)" yield ("拟整改计划与措施:\n" "\n\n\n" - f"{" "*8}{self.suggestion_template_list[4] if self.suggestion_template_list[4] is not None else '\n\n\n'}\n\n\n") + f"{" " * 8}{self.suggestion_template_list[4] if self.suggestion_template_list[4] is not None else '\n\n\n'}\n\n\n") yield "" yield "签字:" yield "" diff --git a/ui/pyui/achievement_ui.py b/ui/pyui/achievement_ui.py index f4e814a..5ddc52d 100644 --- a/ui/pyui/achievement_ui.py +++ b/ui/pyui/achievement_ui.py @@ -269,3 +269,13 @@ class AchievementWidget(Widget): duration=5000, parent=self ) + elif level == LOGLEVEL.ERROR: + InfoBar.error( + title='错误', + content=content, + orient=Qt.Horizontal, + isClosable=True, + position=InfoBarPosition.TOP_RIGHT, + duration=-1, + parent=self + )