import os import traceback from PySide6.QtCore import QObject, Signal from win32com import client from module.achievement_doc import DocxWriter from module.achievement_excel import ExcelReader from module.doc import DocPaper from module.schema import Course, Student, Question from utils.function import resource_path class DTGWorker(QObject): progress = Signal(int) finished = Signal() error = Signal(str, str) def __init__( self, input_student_filepath: str, input_question_filepath: str, output_filepath: str, output_filename: str ): super().__init__() self.input_filepath = input_student_filepath self.input_question_filepath = input_question_filepath self.output_filepath = output_filepath self.output_filename = output_filename def run(self): try: course = Course.load_from_xls(self.input_filepath) students = Student.load_from_xls(self.input_filepath) questions = Question.load_from_xls(self.input_question_filepath) d = DocPaper(self.output_filename, template_path=resource_path("template/template.docx")) for index, student in enumerate(students): if (p := int((index + 1) / len(students) * 100)) != 100: self.progress.emit(p) else: self.progress.emit(99) student.pick_question(questions) d.add_paper(course, student) d.save(self.output_filepath) self.progress.emit(100) word_file = self.output_filepath + "/" + self.output_filename + ".docx" pdf_file = self.output_filepath + "/" + self.output_filename + ".pdf" if os.path.exists(pdf_file): os.remove(pdf_file) word = client.Dispatch("Word.Application") doc = word.Documents.Open(word_file) doc.SaveAs(pdf_file, 17) doc.Close() word.Quit() os.remove(word_file) os.startfile(pdf_file) except Exception as _: error_msg = traceback.format_exc() self.error.emit("😢 不好出错了", error_msg) self.progress.emit(-1) finally: self.finished.emit() class ARGWorker(QObject): finished = Signal() error = Signal(str, str) def __init__(self, input_filepath: str, output_filepath: str, output_filename: str, disable_cc: bool = False): super().__init__() self.input_filepath = input_filepath self.output_filepath = output_filepath self.output_filename = output_filename self.disable_compatibility_check = disable_cc def run(self): try: excel = ExcelReader(self.input_filepath, self.disable_compatibility_check) excel.run() doc = DocxWriter(self.output_filepath, self.output_filename, excel) doc.write() except Exception as e: self.error.emit("😢 不好出错了", str(e)) finally: self.finished.emit()