Compare commits
3 Commits
75750180cc
...
92f32202f1
| Author | SHA1 | Date | |
|---|---|---|---|
| 92f32202f1 | |||
| 7517019dde | |||
| 24c1dc6d59 |
0
module/achievement/__init__.py
Normal file
0
module/achievement/__init__.py
Normal 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:
|
||||||
0
module/defense/__init__.py
Normal file
0
module/defense/__init__.py
Normal 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()
|
|
||||||
0
module/picker/__init__.py
Normal file
0
module/picker/__init__.py
Normal file
129
module/picker/schema.py
Normal file
129
module/picker/schema.py
Normal 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__':
|
||||||
|
...
|
||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user