import os import re import sys import traceback import openpyxl import pandas as pd from openpyxl.utils import get_column_letter from openpyxl.worksheet.pagebreak import Break import config number = 1 def resource_path(relative_path): if getattr(sys, 'frozen', False): # 是否Bundle Resource base_path = sys._MEIPASS else: base_path = os.path.abspath(".") return os.path.join(base_path, relative_path) def main(): marker_template_file = openpyxl.load_workbook(resource_path(os.path.join("template", "评卷员数据导入模板.xlsx"))) marker_print_file = openpyxl.load_workbook(resource_path(os.path.join("template", "评卷员打印模板.xlsx"))) marker_sheet = marker_template_file.active marker_sheet_active = marker_print_file.active marker_sheet_active.column_dimensions[get_column_letter(4)].width = 25 # start_row = 3 start_print_row = 2 if config.inputfilepath.endswith(".xlsx"): if not os.path.exists(os.getcwd() + os.sep + config.inputfilepath): raise Exception("在同级目录下未找到%s名称的文件" % (config.inputfilepath)) dataframe = pd.read_excel(os.getcwd() + os.sep + config.inputfilepath, header=1) dataframe_groupby = dataframe.groupby(by=["科目代码", "评卷分组(只能用小写数字)"]) courseCode = None for index, data in dataframe_groupby: marker_number = config.makernumber if not courseCode: courseCode = index[0] else: if courseCode != index[0]: page_break = Break(id=marker_sheet_active.max_row) marker_sheet_active.page_breaks[0].append(page_break) courseCode = index[0] for i in range(0, int(marker_number) + 1): questionnameLst = data["大题名称"].map(str) + "-" + data["小题号(只能用小写数字)"].map(str) markerdata = {"courseCode": str(index[0]), "markergroup": str(index[1])} markername = createMarkerName(markerdata) markername = createpostfix(markername, i + 1) marker_sheet_active.append( [str(index[0]), data["科目名称"].values[0], str(index[1]), ",".join(questionnameLst.values), markername]) marker_sheet.append( [str(index[0]), "", str(index[1]), markername]) start_print_row = start_print_row + 1 if not os.path.exists(os.getcwd() + os.sep + "result"): os.makedirs(os.getcwd() + os.sep + "result") marker_template_file.save(os.getcwd() + os.sep + "result" + os.sep + "评卷员数据导入模板.xlsx") marker_print_file.save(os.getcwd() + os.sep + "result" + os.sep + "评卷员打印模板.xlsx") else: raise Exception("只支持xlsx文件") def createMarkerName(data): # 根据rule生成markername # mainnumber,coursecode,subnumber,markergroup # {add:"",subnumber:"",courseCode:"",markergroup:""} rule = config.rule taglist = rule.split("-") markertag = [] for tag in taglist: pattern = r"\$\{(mainnumber|subnumber|courseCode|markergroup)\}" result = re.search(pattern, tag) if result: tagname = result[1] markertag.append(data[tagname]) else: markertag.append(tag) return "-".join(markertag) def createpostfix(markername, groupnumber): global number if config.postfix == "add": markername = markername + "-" + str(number) number = number + 1 else: markername = markername + "-" + str(groupnumber) return markername if __name__ == "__main__": try: if os.path.exists(os.getcwd() + os.sep + "error.log"): os.remove(os.getcwd() + os.sep + "error.log") # 首先删除错误文件 main() except: errordata = traceback.format_exc() with open(os.getcwd() + os.sep + "error.log", "w") as file: file.write(errordata)