Files
JITToolBox/module/worker.py

104 lines
3.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import os
import traceback
import pythoncom
from PySide6.QtCore import QObject, Signal
from win32com import client
from typing import Literal
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,), (str,))
finished = Signal()
error = Signal(str, str)
def __init__(
self,
input_student_filepath: str,
input_question_filepath: str,
output_filepath: str,
output_filename: str,
output_type: Literal['pdf', 'word'] = 'pdf'
):
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
self.output_type = output_type
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[int].emit(p)
student.pick_question(questions)
d.add_paper(course, student)
d.save(self.output_filepath)
word_file = self.output_filepath + "/" + self.output_filename + ".docx"
pdf_file = self.output_filepath + "/" + self.output_filename + ".pdf"
if self.output_type == 'pdf':
self.progress[int].emit(101)
self.progress[str].emit("正在转换文件")
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()
os.remove(word_file)
os.startfile(pdf_file)
except Exception as e:
raise Exception("PDF转换失败但Word文档已生成") from e
finally:
word.Quit()
elif self.output_type == 'word':
os.startfile(word_file)
except Exception as e:
self.error.emit("😢 不好出错了", e)
self.progress[int].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()