Files
JITToolBox/module/worker.py
2025-06-03 20:42:51 +08:00

98 lines
3.3 KiB
Python

import os
import traceback
import pythoncom
from PySide6.QtCore import QObject, Signal
from win32com import client
from module.achievement.doc import DocxWriter
from module.achievement.excel import ExcelReader
from module.defense.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)
# https://stackoverflow.com/questions/71292585/python-docx2pdf-attributeerror-open-saveas
word = client.Dispatch("Word.Application", pythoncom.CoInitialize())
try:
doc = word.Documents.Open(word_file)
doc.SaveAs(pdf_file, 17)
doc.Close()
finally:
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)
info = 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, self.info.emit)
excel.run()
doc = DocxWriter(self.output_filepath, self.output_filename, excel, self.info.emit)
doc.write()
except Exception as e:
self.error.emit("😢 不好出错了", str(e))
finally:
self.finished.emit()