Compare commits

...

3 Commits

Author SHA1 Message Date
92f32202f1 问题修复 2025-06-03 20:42:51 +08:00
7517019dde 添加选人逻辑 2025-05-31 18:11:48 +08:00
24c1dc6d59 更改结构 2025-05-31 16:36:34 +08:00
8 changed files with 144 additions and 19 deletions

View File

View File

@@ -13,7 +13,7 @@ from docx.shared import Pt, Cm
from docx.text.run import Run from docx.text.run import Run
from module import LOGLEVEL from module import LOGLEVEL
from module.achievement_excel import ExcelReader from module.achievement.excel import ExcelReader
class DocxWriter: class DocxWriter:

View File

View File

@@ -4,7 +4,7 @@ from copy import deepcopy
from docx import Document from docx import Document
from docx.shared import Cm from docx.shared import Cm
from module.schema import Course, Student, Question from module.schema import Course, Student
class DocPaper: class DocPaper:
@@ -51,12 +51,4 @@ class DocPaper:
if __name__ == '__main__': if __name__ == '__main__':
course = Course.load_from_xls('../files/21工程管理-工程造价Ⅱ-点名册-系统0828.xlsx') ...
students = Student.load_from_xls('../files/21工程管理-工程造价Ⅱ-点名册-系统0828.xlsx')
questions = Question.load_from_csv()
d = DocPaper()
for student in students:
student.pick_question(questions)
d.add_paper(course, student)
d.save()

View File

129
module/picker/schema.py Normal file
View File

@@ -0,0 +1,129 @@
from typing import Optional
from openpyxl.reader.excel import load_workbook
from openpyxl.workbook.workbook import Workbook
from openpyxl.worksheet.worksheet import Worksheet
class PickerStudent:
total_time: int = 0
def __init__(self, name: str, position: int, scores: list[int]):
self._name = name
self._position = position
self._scores = scores
self._modify = False
self._scores = []
self._scores.extend(scores)
self._scores_pointer = -1
self.init_score()
def init_score(self):
self._scores += [0] * (self.total_time - len(self._scores))
for idx, val in enumerate(self._scores):
if val is None:
self._scores[idx] = 0
if self._scores[idx] == 0:
self._scores_pointer = idx
break
def append_score(self, score: int) -> int:
if self._scores_pointer > self.total_time or self._scores_pointer < 0:
raise IndexError
self._scores[self._scores_pointer] = score
self._scores_pointer += 1
self.modified()
return self._scores_pointer - 1
def change_score(self, new_score: int, index: int):
if index < 0 or index > self.total_time:
raise IndexError
self._scores[index] = new_score
self.modified()
@classmethod
def set_total_time(cls, total_time: int):
cls.total_time = total_time
@property
def position(self) -> int:
return self._position
@property
def scores(self) -> list[int]:
return self._scores
@property
def modify(self) -> bool:
return self._modify
def saved(self):
self._modify = False
def modified(self):
self._modify = True
def __str__(self):
return f"PickerStudent {self._name} at {self.position}, with scores: {','.join(str(x) for x in self._scores if x)}"
def __repr__(self):
return self.__str__()
class PickerExcel:
wb: Optional[Workbook]
ws: Optional[Worksheet]
path: str = ''
max_time_position = 'L1'
def __init__(self, path: str):
self.open(path)
@classmethod
def open(cls, path: str):
cls.path = path
cls.wb = load_workbook(path)
cls.ws = cls.wb.active
PickerStudent.set_total_time(cls.ws[cls.max_time_position].value)
@classmethod
def read_student(cls, path: Optional[str] = None) -> list[PickerStudent]:
if path:
cls.open(path)
if cls.wb and cls.ws:
ret = []
for row in cls.ws.iter_rows(min_row=4, max_col=4 + cls.ws[cls.max_time_position].value, values_only=True):
if (name := row[2]) is None:
break
ret.append(PickerStudent(name, int(row[0]) + 3, row[4:]))
return ret
else:
raise Exception('No Workbook or Worksheet')
@classmethod
def write_back(cls, student: PickerStudent):
start_col = 5 # E列
row = student.position
for i, val in enumerate(student.scores):
cls.ws.cell(row=row, column=start_col + i, value=val if val != 0 else '')
student.saved()
@classmethod
def write_all(cls, students: list[PickerStudent]):
for student in students:
if student.modify:
cls.write_back(student)
@classmethod
def save(cls):
if cls.ws:
cls.wb.save(cls.path)
if __name__ == '__main__':
...

View File

@@ -1,12 +1,13 @@
import os import os
import traceback import traceback
import pythoncom
from PySide6.QtCore import QObject, Signal from PySide6.QtCore import QObject, Signal
from win32com import client from win32com import client
from module.achievement_doc import DocxWriter from module.achievement.doc import DocxWriter
from module.achievement_excel import ExcelReader from module.achievement.excel import ExcelReader
from module.doc import DocPaper from module.defense.doc import DocPaper
from module.schema import Course, Student, Question from module.schema import Course, Student, Question
from utils.function import resource_path from utils.function import resource_path
@@ -52,11 +53,14 @@ class DTGWorker(QObject):
if os.path.exists(pdf_file): if os.path.exists(pdf_file):
os.remove(pdf_file) os.remove(pdf_file)
word = client.Dispatch("Word.Application") # https://stackoverflow.com/questions/71292585/python-docx2pdf-attributeerror-open-saveas
doc = word.Documents.Open(word_file) word = client.Dispatch("Word.Application", pythoncom.CoInitialize())
doc.SaveAs(pdf_file, 17) try:
doc.Close() doc = word.Documents.Open(word_file)
word.Quit() doc.SaveAs(pdf_file, 17)
doc.Close()
finally:
word.Quit()
os.remove(word_file) os.remove(word_file)
os.startfile(pdf_file) os.startfile(pdf_file)