├── README.md ├── allV2.0.py ├── allV2.0.spec ├── name.xls ├── show ├── 2019初一入学考考试完整表.xls ├── 2019初一入学考考试座位表.xls ├── 2019初一入学考考试登分表.xls ├── Snipaste_2018-09-16_21-38-27.png ├── Snipaste_2018-09-16_21-39-37.png ├── Snipaste_2018-09-16_21-40-05.png ├── Snipaste_2018-09-16_21-40-26.png ├── Snipaste_2018-09-16_21-41-16.png └── e73262c87df883380036da729e2b8e6.png ├── test.xls ├── 使用前请阅读.txt ├── 文件存放位置如图所示.jpg └── 版本跟新说明.txt /README.md: -------------------------------------------------------------------------------- 1 | # TrueLight_random_test 2 | ## 真光考试座位打乱系统,适用于中小学生考试生成打乱座位表及登分表 3 | ## 学生成绩考试管理系统的一部分功能,生成考试座位表 4 | ##### 实现时间2018/9 5 | ![image](https://img-blog.csdnimg.cn/e84ea0adcf284b56936faf8906463457.png) 6 | ### 纯Python实现,打包成exe可执行程序 7 | ### 可移植到64位电脑使用,打包程序链接: 8 | 链接:https://pan.baidu.com/s/1spM6CfPRXLIxL8HyV8ICHw 9 | 提取码:19n1 10 | 11 | ps:exe可执行程序文件较大,因为python把所有必要的工具包和Dll文件都放到了一起,这个可以脱离python环境,也就是到其他没有装python的电脑中去运行。 12 | 13 | ##### 自动生成三份Excel文件 14 | ![image](https://img-blog.csdnimg.cn/d8dff9040b4e4f838a63b375c7c6abac.png) 15 | ##### 自动生成完整座位表文件 16 | ![image](https://img-blog.csdnimg.cn/11f4bdb737f54169a33ad49196241b25.png) 17 | ##### 自动生成登分表文件 18 | ![image](https://img-blog.csdnimg.cn/534448f05b5e4e41bda52fdf8e198c51.png) 19 | ##### 自动生成班级座位表文件 20 | ![image](https://img-blog.csdnimg.cn/fcddaf8c3262443d856c2d7143f76078.png) 21 | 22 | 23 | -------------------------------------------------------------------------------- /allV2.0.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # -*- coding: utf-8 -*- 3 | 4 | # Form implementation generated from reading ui file 'zuoweiV1.0.ui' 5 | # 6 | # Created by: PyQt5 UI code generator 5.9.1 7 | # 8 | # WARNING! All changes made in this file will be lost! 9 | 10 | import sys 11 | import wx 12 | import os 13 | from PyQt5 import QtCore, QtGui, QtWidgets 14 | from PyQt5.QtWidgets import QFileDialog, QAction, QTextEdit 15 | import random 16 | import time 17 | import pandas as pd 18 | import numpy as np 19 | from xlrd import open_workbook 20 | from xlutils.copy import copy 21 | from openpyxl import Workbook 22 | import xlwt 23 | 24 | import Control.make_excel 25 | 26 | 27 | class Ui_index_frame(object): 28 | def setupUi(self, index_frame): 29 | index_frame.setObjectName("index_frame") 30 | index_frame.resize(1050, 650) 31 | font = QtGui.QFont() 32 | font.setPointSize(12) 33 | index_frame.setFont(font) 34 | self.title_label = QtWidgets.QLabel(index_frame) 35 | self.title_label.setGeometry(QtCore.QRect(400, 50, 300, 30)) 36 | font = QtGui.QFont() 37 | font.setFamily("微软雅黑") 38 | font.setPointSize(16) 39 | font.setBold(True) 40 | font.setWeight(75) 41 | self.title_label.setFont(font) 42 | self.title_label.setObjectName("title_label") 43 | self.choose_namexls_Button = QtWidgets.QPushButton(index_frame) 44 | self.choose_namexls_Button.setGeometry(QtCore.QRect(110, 120, 270, 35)) 45 | self.choose_namexls_Button.setObjectName("choose_namexls_Button") 46 | self.choose_namexls_Button.clicked.connect(self.open_choose_file) 47 | self.name_address_lineEdit = QtWidgets.QLineEdit(index_frame) 48 | self.name_address_lineEdit.setGeometry(QtCore.QRect(390, 120, 620, 35)) 49 | self.name_address_lineEdit.setObjectName("name_address_lineEdit") 50 | self.one_label = QtWidgets.QLabel(index_frame) 51 | self.one_label.setGeometry(QtCore.QRect(60, 120, 50, 35)) 52 | font = QtGui.QFont() 53 | font.setPointSize(14) 54 | self.one_label.setFont(font) 55 | self.one_label.setObjectName("one_label") 56 | self.two_label = QtWidgets.QLabel(index_frame) 57 | self.two_label.setGeometry(QtCore.QRect(60, 190, 50, 35)) 58 | font = QtGui.QFont() 59 | font.setPointSize(14) 60 | self.two_label.setFont(font) 61 | self.two_label.setObjectName("two_label") 62 | self.three_label = QtWidgets.QLabel(index_frame) 63 | self.three_label.setGeometry(QtCore.QRect(60, 260, 50, 35)) 64 | font = QtGui.QFont() 65 | font.setPointSize(14) 66 | self.three_label.setFont(font) 67 | self.three_label.setObjectName("three_label") 68 | self.number_class_label = QtWidgets.QLabel(index_frame) 69 | self.number_class_label.setGeometry(QtCore.QRect(310, 190, 150, 35)) 70 | self.number_class_label.setObjectName("number_class_label") 71 | self.lineEdit = QtWidgets.QLineEdit(index_frame) 72 | self.lineEdit.setGeometry(QtCore.QRect(450, 190, 100, 35)) 73 | self.lineEdit.setObjectName("lineEdit") 74 | self.lineEdit.setText('8') 75 | self.grade_comboBox = QtWidgets.QComboBox(index_frame) 76 | self.grade_comboBox.setGeometry(QtCore.QRect(640, 190, 100, 35)) 77 | self.grade_comboBox.setObjectName("grade_comboBox") 78 | self.grade_comboBox.addItem("") 79 | self.grade_comboBox.addItem("") 80 | self.grade_comboBox.addItem("") 81 | self.grade_comboBox.addItem("") 82 | self.grade_comboBox.addItem("") 83 | self.grade_comboBox.addItem("") 84 | self.grade_comboBox.addItem("") 85 | self.grade_label = QtWidgets.QLabel(index_frame) 86 | self.grade_label.setGeometry(QtCore.QRect(580, 190, 50, 35)) 87 | self.grade_label.setObjectName("grade_label") 88 | self.test_name_comboBox = QtWidgets.QComboBox(index_frame) 89 | self.test_name_comboBox.setGeometry(QtCore.QRect(880, 190, 100, 35)) 90 | self.test_name_comboBox.setObjectName("test_name_comboBox") 91 | self.test_name_comboBox.addItem("") 92 | self.test_name_comboBox.addItem("") 93 | self.test_name_comboBox.addItem("") 94 | self.test_name_comboBox.addItem("") 95 | self.test_name_comboBox.addItem("") 96 | self.test_name_comboBox.addItem("") 97 | self.test_name_comboBox.addItem("") 98 | self.test_name_comboBox.addItem("") 99 | self.test_name_comboBox.addItem("") 100 | self.test_name_comboBox.addItem("") 101 | self.test_name_comboBox.addItem("") 102 | self.test_name_comboBox.addItem("") 103 | self.test_name_comboBox.addItem("") 104 | self.test_name_comboBox.addItem("") 105 | self.test_name_comboBox.addItem("") 106 | self.test_name_comboBox.addItem("") 107 | self.test_name_comboBox.addItem("") 108 | self.test_name_comboBox.addItem("") 109 | self.test_name_comboBox.addItem("") 110 | self.test_name_comboBox.addItem("") 111 | self.test_name_comboBox.addItem("") 112 | self.test_name_comboBox.addItem("") 113 | self.test_name_comboBox.addItem("") 114 | self.test_name_comboBox.addItem("") 115 | self.test_name_comboBox.addItem("") 116 | self.test_name_comboBox.addItem("") 117 | self.test_name_comboBox.addItem("") 118 | self.test_name_comboBox.addItem("") 119 | self.test_name_label = QtWidgets.QLabel(index_frame) 120 | self.test_name_label.setGeometry(QtCore.QRect(780, 190, 120, 35)) 121 | self.test_name_label.setObjectName("test_name_label") 122 | self.lineEdit_2 = QtWidgets.QLineEdit(index_frame) 123 | self.lineEdit_2.setGeometry(QtCore.QRect(180, 190, 100, 35)) # 年份 124 | self.lineEdit_2.setText("2019") 125 | self.lineEdit_2.setObjectName("lineEdit_2") 126 | self.year_label = QtWidgets.QLabel(index_frame) 127 | self.year_label.setGeometry(QtCore.QRect(120, 190, 75, 35)) 128 | self.year_label.setObjectName("year_label") 129 | self.line = QtWidgets.QFrame(index_frame) 130 | self.line.setGeometry(QtCore.QRect(300, 180, 3, 61)) 131 | self.line.setFrameShape(QtWidgets.QFrame.VLine) 132 | self.line.setFrameShadow(QtWidgets.QFrame.Sunken) 133 | self.line.setObjectName("line") 134 | self.line_2 = QtWidgets.QFrame(index_frame) 135 | self.line_2.setGeometry(QtCore.QRect(570, 180, 3, 61)) 136 | self.line_2.setFrameShape(QtWidgets.QFrame.VLine) 137 | self.line_2.setFrameShadow(QtWidgets.QFrame.Sunken) 138 | self.line_2.setObjectName("line_2") 139 | self.line_3 = QtWidgets.QFrame(index_frame) 140 | self.line_3.setGeometry(QtCore.QRect(760, 180, 3, 61)) 141 | self.line_3.setFrameShape(QtWidgets.QFrame.VLine) 142 | self.line_3.setFrameShadow(QtWidgets.QFrame.Sunken) 143 | self.line_3.setObjectName("line_3") 144 | self.line_4 = QtWidgets.QFrame(index_frame) 145 | self.line_4.setGeometry(QtCore.QRect(120, 170, 881, 16)) 146 | self.line_4.setFrameShape(QtWidgets.QFrame.HLine) 147 | self.line_4.setFrameShadow(QtWidgets.QFrame.Sunken) 148 | self.line_4.setObjectName("line_4") 149 | self.line_5 = QtWidgets.QFrame(index_frame) 150 | self.line_5.setGeometry(QtCore.QRect(120, 240, 881, 16)) 151 | self.line_5.setFrameShape(QtWidgets.QFrame.HLine) 152 | self.line_5.setFrameShadow(QtWidgets.QFrame.Sunken) 153 | self.line_5.setObjectName("line_5") 154 | self.class1_label = QtWidgets.QLabel(index_frame) 155 | self.class1_label.setGeometry(QtCore.QRect(120, 310, 75, 35)) 156 | self.class1_label.setObjectName("class1_label") 157 | self.lineEdit_3 = QtWidgets.QLineEdit(index_frame) # 1班人数 158 | self.lineEdit_3.setGeometry(QtCore.QRect(170, 310, 61, 35)) 159 | self.lineEdit_3.setText("50") # 一班 160 | self.lineEdit_3.setObjectName("lineEdit_3") 161 | self.bignumber_label = QtWidgets.QLabel(index_frame) 162 | self.bignumber_label.setGeometry(QtCore.QRect(120, 260, 300, 35)) 163 | font = QtGui.QFont() 164 | font.setPointSize(14) 165 | font.setBold(False) 166 | font.setWeight(50) 167 | self.bignumber_label.setFont(font) 168 | self.bignumber_label.setObjectName("bignumber_label") 169 | self.lineEdit_4 = QtWidgets.QLineEdit(index_frame) 170 | self.lineEdit_4.setGeometry(QtCore.QRect(170, 360, 61, 35)) 171 | self.lineEdit_4.setText("51") # 二班 172 | self.lineEdit_4.setObjectName("lineEdit_4") 173 | self.class2_label = QtWidgets.QLabel(index_frame) 174 | self.class2_label.setGeometry(QtCore.QRect(120, 360, 75, 35)) 175 | self.class2_label.setObjectName("class2_label") 176 | self.lineEdit_5 = QtWidgets.QLineEdit(index_frame) 177 | self.lineEdit_5.setGeometry(QtCore.QRect(170, 410, 61, 35)) 178 | self.lineEdit_5.setText("49") 179 | self.lineEdit_5.setObjectName("lineEdit_5") 180 | self.class3_label = QtWidgets.QLabel(index_frame) 181 | self.class3_label.setGeometry(QtCore.QRect(120, 410, 75, 35)) 182 | self.class3_label.setObjectName("class3_label") 183 | self.lineEdit_6 = QtWidgets.QLineEdit(index_frame) 184 | self.lineEdit_6.setGeometry(QtCore.QRect(170, 460, 61, 35)) 185 | self.lineEdit_6.setText("40") 186 | self.lineEdit_6.setObjectName("lineEdit_6") 187 | self.class4_label = QtWidgets.QLabel(index_frame) 188 | self.class4_label.setGeometry(QtCore.QRect(120, 460, 75, 35)) 189 | self.class4_label.setObjectName("class4_label") 190 | self.lineEdit_7 = QtWidgets.QLineEdit(index_frame) 191 | self.lineEdit_7.setGeometry(QtCore.QRect(170, 510, 61, 35)) 192 | self.lineEdit_7.setText("49") 193 | self.lineEdit_7.setObjectName("lineEdit_7") 194 | self.class5_label = QtWidgets.QLabel(index_frame) 195 | self.class5_label.setGeometry(QtCore.QRect(120, 510, 75, 35)) 196 | self.class5_label.setObjectName("class5_label") 197 | self.class6_label = QtWidgets.QLabel(index_frame) 198 | self.class6_label.setGeometry(QtCore.QRect(120, 560, 75, 35)) 199 | self.class6_label.setObjectName("class6_label") 200 | self.lineEdit_8 = QtWidgets.QLineEdit(index_frame) 201 | self.lineEdit_8.setGeometry(QtCore.QRect(170, 560, 61, 35)) 202 | self.lineEdit_8.setText("51") 203 | self.lineEdit_8.setObjectName("lineEdit_8") 204 | self.class7_label = QtWidgets.QLabel(index_frame) 205 | self.class7_label.setGeometry(QtCore.QRect(270, 310, 75, 35)) 206 | self.class7_label.setObjectName("class7_label") 207 | self.lineEdit_9 = QtWidgets.QLineEdit(index_frame) 208 | self.lineEdit_9.setGeometry(QtCore.QRect(320, 310, 61, 35)) 209 | self.lineEdit_9.setText("50") 210 | self.lineEdit_9.setObjectName("lineEdit_9") 211 | self.class8_label = QtWidgets.QLabel(index_frame) 212 | self.class8_label.setGeometry(QtCore.QRect(270, 360, 75, 35)) 213 | self.class8_label.setObjectName("class8_label") 214 | self.lineEdit_10 = QtWidgets.QLineEdit(index_frame) 215 | self.lineEdit_10.setGeometry(QtCore.QRect(320, 360, 61, 35)) 216 | self.lineEdit_10.setText("40") 217 | self.lineEdit_10.setObjectName("lineEdit_10") 218 | self.lineEdit_11 = QtWidgets.QLineEdit(index_frame) 219 | self.lineEdit_11.setGeometry(QtCore.QRect(320, 410, 61, 35)) 220 | self.lineEdit_11.setText("") 221 | self.lineEdit_11.setObjectName("lineEdit_11") 222 | self.class9_label = QtWidgets.QLabel(index_frame) 223 | self.class9_label.setGeometry(QtCore.QRect(270, 410, 75, 35)) 224 | self.class9_label.setObjectName("class9_label") 225 | self.class10_label = QtWidgets.QLabel(index_frame) 226 | self.class10_label.setGeometry(QtCore.QRect(270, 460, 75, 35)) 227 | self.class10_label.setObjectName("class10_label") 228 | self.lineEdit_12 = QtWidgets.QLineEdit(index_frame) 229 | self.lineEdit_12.setGeometry(QtCore.QRect(320, 460, 61, 35)) 230 | self.lineEdit_12.setText("") 231 | self.lineEdit_12.setObjectName("lineEdit_12") 232 | self.lineEdit_13 = QtWidgets.QLineEdit(index_frame) 233 | self.lineEdit_13.setGeometry(QtCore.QRect(320, 510, 61, 35)) 234 | self.lineEdit_13.setText("") 235 | self.lineEdit_13.setObjectName("lineEdit_13") 236 | self.class11_label = QtWidgets.QLabel(index_frame) 237 | self.class11_label.setGeometry(QtCore.QRect(270, 510, 75, 35)) 238 | self.class11_label.setObjectName("class11_label") 239 | self.class12_label = QtWidgets.QLabel(index_frame) 240 | self.class12_label.setGeometry(QtCore.QRect(270, 560, 75, 35)) 241 | self.class12_label.setObjectName("class12_label") 242 | self.lineEdit_14 = QtWidgets.QLineEdit(index_frame) 243 | self.lineEdit_14.setGeometry(QtCore.QRect(320, 560, 61, 35)) 244 | self.lineEdit_14.setText("") 245 | self.lineEdit_14.setObjectName("lineEdit_14") 246 | self.class13_label = QtWidgets.QLabel(index_frame) 247 | self.class13_label.setGeometry(QtCore.QRect(420, 310, 75, 35)) 248 | self.class13_label.setObjectName("class13_label") 249 | self.lineEdit_15 = QtWidgets.QLineEdit(index_frame) 250 | self.lineEdit_15.setGeometry(QtCore.QRect(470, 310, 61, 35)) 251 | self.lineEdit_15.setText("") 252 | self.lineEdit_15.setObjectName("lineEdit_15") 253 | self.class14_label = QtWidgets.QLabel(index_frame) 254 | self.class14_label.setGeometry(QtCore.QRect(420, 360, 75, 35)) 255 | self.class14_label.setObjectName("class14_label") 256 | self.lineEdit_16 = QtWidgets.QLineEdit(index_frame) 257 | self.lineEdit_16.setGeometry(QtCore.QRect(470, 360, 61, 35)) 258 | self.lineEdit_16.setText("") 259 | self.lineEdit_16.setObjectName("lineEdit_16") 260 | self.class16_label = QtWidgets.QLabel(index_frame) 261 | self.class16_label.setGeometry(QtCore.QRect(420, 460, 75, 35)) 262 | self.class16_label.setObjectName("class16_label") 263 | self.lineEdit_17 = QtWidgets.QLineEdit(index_frame) 264 | self.lineEdit_17.setGeometry(QtCore.QRect(470, 460, 61, 35)) 265 | self.lineEdit_17.setText("") 266 | self.lineEdit_17.setObjectName("lineEdit_17") 267 | self.class15_label = QtWidgets.QLabel(index_frame) 268 | self.class15_label.setGeometry(QtCore.QRect(420, 410, 75, 35)) 269 | self.class15_label.setObjectName("class15_label") 270 | self.lineEdit_18 = QtWidgets.QLineEdit(index_frame) 271 | self.lineEdit_18.setGeometry(QtCore.QRect(470, 410, 61, 35)) 272 | self.lineEdit_18.setText("") 273 | self.lineEdit_18.setObjectName("lineEdit_18") 274 | self.class17_label = QtWidgets.QLabel(index_frame) 275 | self.class17_label.setGeometry(QtCore.QRect(420, 510, 75, 35)) 276 | self.class17_label.setObjectName("class17_label") 277 | self.lineEdit_19 = QtWidgets.QLineEdit(index_frame) 278 | self.lineEdit_19.setGeometry(QtCore.QRect(470, 510, 61, 35)) 279 | self.lineEdit_19.setText("") # 第十七个班 280 | self.lineEdit_19.setObjectName("lineEdit_19") 281 | self.class18_label = QtWidgets.QLabel(index_frame) 282 | self.class18_label.setGeometry(QtCore.QRect(420, 560, 75, 35)) 283 | self.class18_label.setObjectName("class18_label") 284 | self.lineEdit_20 = QtWidgets.QLineEdit(index_frame) 285 | self.lineEdit_20.setGeometry(QtCore.QRect(470, 560, 61, 35)) 286 | self.lineEdit_20.setText("") # 第十八个班 287 | self.lineEdit_20.setObjectName("lineEdit_20") 288 | self.choose_savexls_Button = QtWidgets.QPushButton(index_frame) 289 | self.choose_savexls_Button.setGeometry(QtCore.QRect(660, 280, 250, 35)) 290 | self.choose_savexls_Button.setObjectName("choose_savexls_Button") 291 | self.choose_savexls_Button.clicked.connect(self.save_choose_file) 292 | self.four_label = QtWidgets.QLabel(index_frame) 293 | self.four_label.setGeometry(QtCore.QRect(570, 270, 50, 35)) 294 | font = QtGui.QFont() 295 | font.setPointSize(14) 296 | self.four_label.setFont(font) 297 | self.four_label.setObjectName("four_label") 298 | self.line_6 = QtWidgets.QFrame(index_frame) 299 | self.line_6.setGeometry(QtCore.QRect(540, 260, 20, 331)) 300 | self.line_6.setFrameShape(QtWidgets.QFrame.VLine) 301 | self.line_6.setFrameShadow(QtWidgets.QFrame.Sunken) 302 | self.line_6.setObjectName("line_6") 303 | self.choose_savexls__address_lineEdit = QtWidgets.QLineEdit(index_frame) 304 | self.choose_savexls__address_lineEdit.setGeometry(QtCore.QRect(570, 340, 461, 35)) 305 | self.choose_savexls__address_lineEdit.setObjectName("choose_savexls__address_lineEdit") 306 | self.five_label = QtWidgets.QLabel(index_frame) 307 | self.five_label.setGeometry(QtCore.QRect(570, 430, 50, 35)) 308 | font = QtGui.QFont() 309 | font.setPointSize(14) 310 | self.five_label.setFont(font) 311 | self.five_label.setObjectName("five_label") 312 | self.make_Button = QtWidgets.QPushButton(index_frame) 313 | self.make_Button.setGeometry(QtCore.QRect(660, 450, 250, 35)) 314 | self.make_Button.setObjectName("make_Button") 315 | self.make_Button.clicked.connect(self.make) 316 | self.warning_lineEdit = QtWidgets.QLineEdit(index_frame) 317 | self.warning_lineEdit.setGeometry(QtCore.QRect(700, 510, 311, 35)) 318 | self.warning_lineEdit.setObjectName("warning_lineEdit") 319 | self.warning_label = QtWidgets.QLabel(index_frame) 320 | self.warning_label.setGeometry(QtCore.QRect(600, 510, 111, 35)) 321 | self.warning_label.setObjectName("warning_label") 322 | self.ps_label = QtWidgets.QLabel(index_frame) 323 | self.ps_label.setGeometry(QtCore.QRect(120, 600, 271, 35)) 324 | self.ps_label.setObjectName("ps_label") 325 | self.line_7 = QtWidgets.QFrame(index_frame) 326 | self.line_7.setGeometry(QtCore.QRect(550, 400, 481, 16)) 327 | self.line_7.setFrameShape(QtWidgets.QFrame.HLine) 328 | self.line_7.setFrameShadow(QtWidgets.QFrame.Sunken) 329 | self.line_7.setObjectName("line_7") 330 | 331 | self.retranslateUi(index_frame) 332 | QtCore.QMetaObject.connectSlotsByName(index_frame) 333 | 334 | 335 | def retranslateUi(self, index_frame): 336 | _translate = QtCore.QCoreApplication.translate 337 | index_frame.setWindowTitle(_translate("index_frame", "真光考场随机座位表生成")) 338 | self.title_label.setText(_translate("index_frame", "考场随机座位生成功能")) 339 | self.choose_namexls_Button.setText(_translate("index_frame", "点击选择考生名单表格文件:")) 340 | self.one_label.setText(_translate("index_frame", "1、")) 341 | self.two_label.setText(_translate("index_frame", "2、")) 342 | self.three_label.setText(_translate("index_frame", "3、")) 343 | self.number_class_label.setText(_translate("index_frame", "考场班别数量:")) 344 | self.grade_comboBox.setItemText(0, _translate("index_frame", "初一")) 345 | self.grade_comboBox.setItemText(1, _translate("index_frame", "初二")) 346 | self.grade_comboBox.setItemText(2, _translate("index_frame", "初三")) 347 | self.grade_comboBox.setItemText(3, _translate("index_frame", "高一")) 348 | self.grade_comboBox.setItemText(4, _translate("index_frame", "高二")) 349 | self.grade_comboBox.setItemText(5, _translate("index_frame", "高三")) 350 | self.grade_comboBox.setItemText(6, _translate("index_frame", "其他")) 351 | self.grade_label.setText(_translate("index_frame", "年级:")) 352 | self.test_name_comboBox.setItemText(0, _translate("index_frame", "入学考")) 353 | self.test_name_comboBox.setItemText(1, _translate("index_frame", "摸底考")) 354 | self.test_name_comboBox.setItemText(2, _translate("index_frame", "期中考")) 355 | self.test_name_comboBox.setItemText(3, _translate("index_frame", "模拟考")) 356 | self.test_name_comboBox.setItemText(4, _translate("index_frame", "期末考")) 357 | self.test_name_comboBox.setItemText(5, _translate("index_frame", "1月月考")) 358 | self.test_name_comboBox.setItemText(6, _translate("index_frame", "2月月考")) 359 | self.test_name_comboBox.setItemText(7, _translate("index_frame", "3月月考")) 360 | self.test_name_comboBox.setItemText(8, _translate("index_frame", "4月月考")) 361 | self.test_name_comboBox.setItemText(9, _translate("index_frame", "5月月考")) 362 | self.test_name_comboBox.setItemText(10, _translate("index_frame", "6月月考")) 363 | self.test_name_comboBox.setItemText(11, _translate("index_frame", "7月月考")) 364 | self.test_name_comboBox.setItemText(12, _translate("index_frame", "8月月考")) 365 | self.test_name_comboBox.setItemText(13, _translate("index_frame", "9月月考")) 366 | self.test_name_comboBox.setItemText(14, _translate("index_frame", "10月月考")) 367 | self.test_name_comboBox.setItemText(15, _translate("index_frame", "11月月考")) 368 | self.test_name_comboBox.setItemText(16, _translate("index_frame", "12月月考")) 369 | self.test_name_comboBox.setItemText(17, _translate("index_frame", "小测")) 370 | self.test_name_comboBox.setItemText(18, _translate("index_frame", "周测")) 371 | self.test_name_comboBox.setItemText(19, _translate("index_frame", "水平考")) 372 | self.test_name_comboBox.setItemText(20, _translate("index_frame", "一模考试")) 373 | self.test_name_comboBox.setItemText(21, _translate("index_frame", "区统考")) 374 | self.test_name_comboBox.setItemText(22, _translate("index_frame", "二模考试")) 375 | self.test_name_comboBox.setItemText(23, _translate("index_frame", "三模考试")) 376 | self.test_name_comboBox.setItemText(24, _translate("index_frame", "四模考试")) 377 | self.test_name_comboBox.setItemText(25, _translate("index_frame", "文科考试")) 378 | self.test_name_comboBox.setItemText(26, _translate("index_frame", "理科考试")) 379 | self.test_name_comboBox.setItemText(27, _translate("index_frame", "其他考试")) 380 | self.test_name_label.setText(_translate("index_frame", "考试名称:")) 381 | self.year_label.setText(_translate("index_frame", "年份:")) 382 | self.class1_label.setText(_translate("index_frame", "1班:")) 383 | self.bignumber_label.setText(_translate("index_frame", "以下请输入各班容纳最大人数")) 384 | self.class2_label.setText(_translate("index_frame", "2班:")) 385 | self.class3_label.setText(_translate("index_frame", "3班:")) 386 | self.class4_label.setText(_translate("index_frame", "4班:")) 387 | self.class5_label.setText(_translate("index_frame", "5班:")) 388 | self.class6_label.setText(_translate("index_frame", "6班:")) 389 | self.class7_label.setText(_translate("index_frame", "7班:")) 390 | self.class8_label.setText(_translate("index_frame", "8班:")) 391 | self.class9_label.setText(_translate("index_frame", "9班:")) 392 | self.class10_label.setText(_translate("index_frame", "10班:")) 393 | self.class11_label.setText(_translate("index_frame", "11班:")) 394 | self.class12_label.setText(_translate("index_frame", "12班:")) 395 | self.class13_label.setText(_translate("index_frame", "13班:")) 396 | self.class14_label.setText(_translate("index_frame", "14班:")) 397 | self.class16_label.setText(_translate("index_frame", "16班:")) 398 | self.class15_label.setText(_translate("index_frame", "15班:")) 399 | self.class17_label.setText(_translate("index_frame", "17班:")) 400 | self.class18_label.setText(_translate("index_frame", "18班:")) 401 | self.choose_savexls_Button.setText(_translate("index_frame", "请选择生成座位表保存位置")) 402 | self.four_label.setText(_translate("index_frame", "4、")) 403 | self.five_label.setText(_translate("index_frame", "5、")) 404 | self.make_Button.setText(_translate("index_frame", "点击生成考场座位表")) 405 | self.warning_label.setText(_translate("index_frame", "提示信息:")) 406 | self.ps_label.setText(_translate("index_frame", "提示信息:只填前多少个班别")) 407 | 408 | def open_choose_file(self): 409 | # app = wx.App(False) 410 | # # frame = wx.Frame(None, wx.ID_ANY, "真光成绩管理系统") 411 | # frame = my_frame(None, '真光成绩管理系统') 412 | # frame.Show(False) 413 | # frame.on_open 414 | filename = QFileDialog.getOpenFileName(None, 'Open file', './') 415 | address = filename[0] 416 | print(address) 417 | self.name_address_lineEdit.setText(address) 418 | 419 | def save_choose_file(self): 420 | # app = wx.App(False) 421 | # # frame = wx.Frame(None, wx.ID_ANY, "真光成绩管理系统") 422 | # frame = my_frame(None, '真光成绩管理系统') 423 | # frame.Show(False) 424 | # frame.on_open 425 | filename = QFileDialog.getExistingDirectory(None, "选择文件夹", "./") 426 | print(filename) 427 | address = filename 428 | print(address) 429 | self.choose_savexls__address_lineEdit.setText(address) 430 | 431 | def make(self): 432 | # 记得判断文本是否为空,若为空,则默认失败 433 | all_dict = {} 434 | warning = '填写一切正常' 435 | filename_address = self.name_address_lineEdit.text() 436 | year = 2019 437 | year = self.lineEdit_2.text() 438 | year = int(year) 439 | number_class = self.lineEdit.text() 440 | filename_save = self.choose_savexls__address_lineEdit.text() 441 | test_name = self.test_name_comboBox.currentText() 442 | grade = self.grade_comboBox.currentText() 443 | number_class = int(number_class) 444 | number_inclass1_max = self.lineEdit_3.text() 445 | number_inclass2_max = self.lineEdit_4.text() 446 | number_inclass3_max = self.lineEdit_5.text() 447 | number_inclass4_max = self.lineEdit_6.text() 448 | number_inclass5_max = self.lineEdit_7.text() 449 | number_inclass6_max = self.lineEdit_8.text() 450 | number_inclass7_max = self.lineEdit_9.text() 451 | number_inclass8_max = self.lineEdit_10.text() 452 | number_inclass9_max = self.lineEdit_11.text() 453 | number_inclass10_max = self.lineEdit_12.text() 454 | number_inclass11_max = self.lineEdit_13.text() 455 | number_inclass12_max = self.lineEdit_14.text() 456 | number_inclass13_max = self.lineEdit_15.text() 457 | number_inclass14_max = self.lineEdit_16.text() 458 | number_inclass15_max = self.lineEdit_17.text() 459 | number_inclass16_max = self.lineEdit_18.text() 460 | number_inclass17_max = self.lineEdit_19.text() 461 | number_inclass18_max = self.lineEdit_20.text() 462 | number_classMax_writed = 0 # 已填各班容纳数量的班数量 463 | number_inclass_dict = {} 464 | number_inclass_key = [] 465 | if(number_inclass1_max.__eq__('') == False): 466 | number_classMax_writed = number_classMax_writed + 1 467 | number_inclass_dict['1'] = number_inclass1_max 468 | number_inclass_key.append(1) 469 | if(number_inclass2_max.__eq__('') == False): 470 | number_classMax_writed = number_classMax_writed + 1 471 | number_inclass_dict['2'] = number_inclass2_max 472 | number_inclass_key.append(2) 473 | if (number_inclass3_max.__eq__('') == False): 474 | number_classMax_writed = number_classMax_writed + 1 475 | number_inclass_dict['3'] = number_inclass3_max 476 | number_inclass_key.append(3) 477 | if (number_inclass4_max.__eq__('') == False): 478 | number_classMax_writed = number_classMax_writed + 1 479 | number_inclass_dict['4'] = number_inclass4_max 480 | number_inclass_key.append(4) 481 | if (number_inclass5_max.__eq__('') == False): 482 | number_classMax_writed = number_classMax_writed + 1 483 | number_inclass_dict['5'] = number_inclass5_max 484 | number_inclass_key.append(5) 485 | if (number_inclass6_max.__eq__('') == False): 486 | number_classMax_writed = number_classMax_writed + 1 487 | number_inclass_dict['6'] = number_inclass6_max 488 | number_inclass_key.append(6) 489 | if (number_inclass7_max.__eq__('') == False): 490 | number_classMax_writed = number_classMax_writed + 1 491 | number_inclass_dict['7'] = number_inclass7_max 492 | number_inclass_key.append(7) 493 | if (number_inclass8_max.__eq__('') == False): 494 | number_classMax_writed = number_classMax_writed + 1 495 | number_inclass_dict['8'] = number_inclass8_max 496 | number_inclass_key.append(8) 497 | if (number_inclass9_max.__eq__('') == False): 498 | number_classMax_writed = number_classMax_writed + 1 499 | number_inclass_dict['9'] = number_inclass9_max 500 | number_inclass_key.append(9) 501 | if (number_inclass10_max.__eq__('') == False): 502 | number_classMax_writed = number_classMax_writed + 1 503 | number_inclass_dict['10'] = number_inclass10_max 504 | number_inclass_key.append(10) 505 | if (number_inclass11_max.__eq__('') == False): 506 | number_classMax_writed = number_classMax_writed + 1 507 | number_inclass_dict['11'] = number_inclass11_max 508 | number_inclass_key.append(11) 509 | if (number_inclass12_max.__eq__('') == False): 510 | number_classMax_writed = number_classMax_writed + 1 511 | number_inclass_dict['12'] = number_inclass12_max 512 | number_inclass_key.append(12) 513 | if (number_inclass13_max.__eq__('') == False): 514 | number_classMax_writed = number_classMax_writed + 1 515 | number_inclass_dict['13'] = number_inclass13_max 516 | number_inclass_key.append(13) 517 | if (number_inclass14_max.__eq__('') == False): 518 | number_classMax_writed = number_classMax_writed + 1 519 | number_inclass_dict['14'] = number_inclass14_max 520 | number_inclass_key.append(14) 521 | if (number_inclass15_max.__eq__('') == False): 522 | number_classMax_writed = number_classMax_writed + 1 523 | number_inclass_dict['15'] = number_inclass15_max 524 | number_inclass_key.append(15) 525 | if (number_inclass16_max.__eq__('') == False): 526 | number_classMax_writed = number_classMax_writed + 1 527 | number_inclass_dict['16'] = number_inclass16_max 528 | number_inclass_key.append(16) 529 | if (number_inclass17_max.__eq__('') == False): 530 | number_classMax_writed = number_classMax_writed + 1 531 | number_inclass_dict['17'] = number_inclass17_max 532 | number_inclass_key.append(17) 533 | if (number_inclass18_max.__eq__('') == False): 534 | number_classMax_writed = number_classMax_writed + 1 535 | number_inclass_dict['18'] = number_inclass18_max 536 | number_inclass_key.append(18) 537 | print('number_inclass_dict:', end="") 538 | print(number_inclass_dict) 539 | for i in number_inclass_dict: 540 | value = number_inclass_dict[i] 541 | number_inclass_dict[i] = int(value) 542 | 543 | 544 | print(number_inclass_key) 545 | try: 546 | print('已填各班容纳最大数量的班级数量为%d' % number_classMax_writed) 547 | if(number_classMax_writed != number_class): 548 | warning = '请留意所填写班级容纳最大人数的数量与考场班别数量不符' 549 | print(warning) 550 | self.warning_lineEdit.setText(warning) 551 | if(filename_address.__len__() == 0): 552 | warning = '请选择考生名字表格的文件' 553 | elif(number_class.__eq__('') == False): 554 | warning = '请注意填写班别数量' 555 | elif(filename_save.__len__() == 0): 556 | warning = '请注意选择保存路径' 557 | self.warning_lineEdit.setText(warning) 558 | except Exception as error: 559 | print('error' + str(error)) 560 | self.warning_lineEdit.setText(warning) 561 | all_dict['filename_address'] = filename_address 562 | all_dict['year'] = year 563 | all_dict['number_class'] = number_class 564 | all_dict['filename_save'] = filename_save 565 | all_dict['test_name'] = test_name 566 | all_dict['grade'] = grade 567 | all_dict['number_inclass_dict'] = number_inclass_dict 568 | all_dict['number_inclass_key'] = number_inclass_key 569 | print(all_dict) 570 | if warning == '填写一切正常': 571 | warning = main(all_dict) 572 | self.warning_lineEdit.setText(warning) 573 | 574 | 575 | def get_names(address): 576 | """ 577 | 该函数的作用是根据地址取出表格,返回数据表格及打乱后考号列表 578 | 未完成:判断是否考生名单文件 579 | :param address: 580 | :return: 581 | """ 582 | time1 = time.time() 583 | name_xls = pd.read_excel(address) # 根据传入地址进行读取文件 584 | # print(type(name_xls)) 585 | # print(name_xls) 586 | # print(name_xls.shape) 587 | dataset = np.array(name_xls) # 转换成ndarray 588 | # print(dataset) 589 | # print(type(dataset)) 590 | primary_key = dataset[:, 1] # 把考号这列取出 591 | primary_key_list = list(primary_key) 592 | # print(primary_key_list) 593 | # print(type(primary_key_list)) 594 | random.shuffle(primary_key_list) # 进行随机打乱考号 595 | primary_key_random_list = primary_key_list 596 | print('Reshuffled list : ') 597 | print(primary_key_random_list) 598 | time2 = time.time() 599 | print('def : get_names time == ' + str(time2 - time1)) 600 | return dataset, primary_key_random_list 601 | 602 | 603 | def excel_done(dataset, primary_key_random_list, number_class, number_inclass_max): 604 | """ 605 | 该函数的作用是根据数据表格+打乱考号列表+个性化需求,返回多个班考生名单的大列表 606 | :param dataset: 考生名单的数据表格,ndarray结构 607 | :param primary_key_random_list: 主键,打乱后的随机考生号列表 608 | :param number_class:班别数量 609 | :param number_inclass_max: 班级坐得下的最大人数 610 | :return: 多个班考生名单的大列表,小列表为一个班的考生名单 611 | """ 612 | time1 = time.time() 613 | number_class = 8 # 调试所用,待删 614 | number_inclass_max = 50 # 615 | len_primary_key = len(primary_key_random_list) # 考生名单数量 616 | big_name_list = [] 617 | for index_class in range(number_class): 618 | name_list = [] 619 | print('第%s份打乱名单已出' % str(index_class + 1)) 620 | for i in range(number_inclass_max): 621 | if((index_class * number_inclass_max + i) >= len_primary_key): # 遍历到最后一个考生 622 | break 623 | kaohao = primary_key_random_list[i + index_class * number_inclass_max] # 取出考号 624 | name = '' 625 | for j in range(dataset.shape[0]): 626 | if dataset[j][1] != kaohao: # 没找到考号的学生则跳过 627 | continue 628 | else: 629 | name = dataset[j][4] # 找到则取出该学生的姓名 630 | name_list.append(name) # 这个考场的名单加上该名字 631 | print('name_list:') 632 | big_name_list.append(name_list) # 全级的考场名单加上该考场的名单 633 | print(name_list) 634 | print('已完成所有名单的表格') 635 | time2 = time.time() 636 | # print('big_name_list:') 637 | # print(big_name_list) 638 | print('def : excel_done time == ' + str(time2 - time1)) 639 | return big_name_list 640 | 641 | 642 | def big_name_list_make(dataset, primary_key_random_list, number_class, number_inclass_key, number_inclass_dict): 643 | """ 644 | 该函数的作用是根据数据表格+打乱考号列表+班别数量+每个班容纳人数,返回多个班考生名单的大列表 645 | :param dataset: 数据表格 646 | :param primary_key_random_list:打乱考号列表 647 | :param number_class: 班别数量 648 | :param number_inclass_max_list:每个班容纳人数的列表 649 | :return: 650 | """ 651 | error = 0 652 | error_information = '程序执行结束,过程正常' 653 | time1 = time.time() 654 | number_inclass_max_list = [] 655 | number_inclass_key.sort() # 有哪些班,如1,2,4,5 656 | for index in number_inclass_key: 657 | value = number_inclass_dict[str(index)] 658 | number_inclass_max_list.append(value) 659 | len_primary_key = len(primary_key_random_list) # 考生名单数量 660 | total_number_max = 0 # 所有班级加起来容纳的最大人数 661 | for i in number_inclass_max_list: 662 | total_number_max = total_number_max + int(i) 663 | if len(primary_key_random_list) > total_number_max: 664 | error = 1 665 | error_information = '所有班级最大容纳人数小于考生人数,请检查' 666 | big_name_list = [] 667 | yipai = 0 668 | for index_class in range(number_class): # 一个班一个班这样弄表格 669 | name_list = [] 670 | print('第%s班打乱名单已出' % str(number_inclass_key[index_class])) 671 | for i in range(number_inclass_max_list[index_class]): 672 | if(yipai >= len_primary_key): # 遍历到最后一个考生 673 | break 674 | kaohao = primary_key_random_list[yipai] # 取出考号 675 | name = '' 676 | for j in range(dataset.shape[0]): 677 | if dataset[j][1] != kaohao: # 没找到考号的学生则跳过 678 | continue 679 | else: 680 | name = dataset[j][4] # 找到则取出该学生的姓名 681 | break 682 | name_list.append(name) # 这个考场的名单加上该名字 683 | yipai = yipai + 1 684 | print('name_list:') 685 | print(name_list) 686 | big_name_list.append(name_list) # 全级的考场名单加上该考场的名单 687 | time2 = time.time() 688 | print('big_name_list已完成各班的所有名单时间:' + str(time2 - time1)) 689 | return big_name_list, number_inclass_key, number_inclass_max_list, error_information 690 | 691 | 692 | def write_excel(big_name_list, number_inclass_key, number_inclass_max_list, test_name, year, grade, dataset, filename): 693 | """ 694 | 该函数是根据大的名字列表,写入Excel文件中 695 | :param big_name_list: 696 | """ 697 | 698 | """格式信息""" 699 | style = xlwt.XFStyle() 700 | style2 = xlwt.XFStyle() 701 | style3 = xlwt.XFStyle() 702 | style4 = xlwt.XFStyle() 703 | font = xlwt.Font() # 字体基本设置 704 | font.name = u'宋体' 705 | font.color = 'black' 706 | font.height = 200 # 字体大小,220就是11号字体,大概就是11*20得来的吧 707 | style.font = font 708 | 709 | font2 = xlwt.Font() # 字体基本设置 710 | font2.name = u'宋体' 711 | font2.color = 'black' 712 | font2.height = 240 # 字体大小,220就是11号字体,大概就是11*20得来的吧 713 | style2.font = font2 714 | 715 | font3 = xlwt.Font() # 字体基本设置 716 | font3.name = u'宋体' 717 | font3.color = 'black' 718 | font3.bold 719 | font3.height = 240 # 字体大小,220就是11号字体,大概就是11*20得来的吧 720 | style3.font = font3 721 | 722 | font4 = xlwt.Font() # 字体基本设置 723 | font4.name = u'宋体' 724 | font4.color = 'black' 725 | font4.bold 726 | font4.height = 240 # 字体大小,220就是11号字体,大概就是11*20得来的吧 727 | style4.font = font4 728 | 729 | alignment = xlwt.Alignment() # 设置字体在单元格的位置 730 | alignment.horz = xlwt.Alignment.HORZ_CENTER # 水平方向 731 | alignment.vert = xlwt.Alignment.VERT_CENTER # 竖直方向 732 | style.alignment = alignment 733 | style2.alignment = alignment 734 | style3.alignment = alignment 735 | style4.alignment = alignment 736 | 737 | border = xlwt.Borders() # 给单元格加框线 738 | border.left = xlwt.Borders.THIN # 左 739 | border.top = xlwt.Borders.THIN # 上 740 | border.right = xlwt.Borders.THIN # 右 741 | border.bottom = xlwt.Borders.THIN # 下 742 | border.left_colour = 0x40 # 设置框线颜色,0x40是黑色,颜色真的巨多,都晕了 743 | border.right_colour = 0x40 744 | border.top_colour = 0x40 745 | border.bottom_colour = 0x40 746 | style.borders = border 747 | style2.borders = border 748 | style3.borders = border 749 | # 要做到用户可以选择考试名字及年级 750 | rb = open_workbook(r'D:\StudentSystem\test.xls') 751 | 752 | # 通过sheet_by_index()获取的sheet没有write()方法 753 | rs = rb.sheet_by_index(0) 754 | 755 | wb = copy(rb) 756 | # wb = Workbook() 757 | 758 | dengfen_name_list = [] 759 | dengfen_dict = {} 760 | for i in range(len(number_inclass_key)): 761 | banbie = number_inclass_key[i] 762 | number_inclass_maxx = number_inclass_max_list[i] 763 | # 通过get_sheet()获取的sheet有write()方法 764 | ws = wb.get_sheet(i) 765 | # ws = wb.worksheets[0] 766 | columns = 6 767 | return_name_list, return_str_list = class_names(big_name_list, i, number_inclass_maxx, grade, banbie) 768 | print('return_str_list', end="") 769 | print(return_str_list) 770 | print('return_name_list', end="") 771 | print(return_name_list) 772 | ren = 0 773 | for i in range(columns): 774 | for j in range(len(return_name_list[i])): 775 | ren = ren + 1 776 | ws.write(10 - j, i * 3, int(return_str_list[i][j]), style=style2) 777 | ws.write(10 - j, i * 3 + 1, return_name_list[i][j], style=style) 778 | dengfen_dict[return_name_list[i][j]] = int(return_str_list[i][j]) 779 | dengfen_name_list.append(return_name_list[i][j]) 780 | # if(len(return_name_list) > 6): 781 | # for i in range(len(return_name_list[6])): 782 | # ws.write(10 - j, i * 3, int(return_str_list[i][j])) 783 | chuji_utf8 = grade 784 | ws.write(0, 7, str(year) + chuji_utf8 + test_name + str(banbie) + '班座位表' + str(ren) + '人', style=style4) 785 | ws.write(12, 0, '前门', style=style3) 786 | ws.write(1, 0, '后门', style=style3) 787 | ws.write(12, 8, '讲台', style=style3) 788 | 789 | # 这里是登分表 790 | ws = wb.get_sheet(len(number_inclass_key)) 791 | ws.write(0, 0, '班别', style=style3) 792 | ws.write(0, 1, '学号', style=style3) 793 | ws.write(0, 2, '考号', style=style3) 794 | ws.write(0, 3, '座位号', style=style3) 795 | ws.write(0, 4, '姓名', style=style3) 796 | for i in range(len(dengfen_name_list)): 797 | ws.write(i + 1, 4, dengfen_name_list[i], style=style) 798 | ws.write(i + 1, 3, int(dengfen_dict[dengfen_name_list[i]]), style=style) 799 | for j in range(dataset.shape[0]): 800 | if str(dataset[j][4]).__eq__(dengfen_name_list[i]): 801 | ws.write(i + 1, 2, int(dataset[j][1]), style=style) 802 | ws.write(i + 1, 1, str(dataset[j][3]), style=style) 803 | ws.write(i + 1, 0, int(dataset[j][2]), style=style) 804 | 805 | String = str(year) + chuji_utf8 + test_name 806 | wb.save(r'%s\%s考试座位表.xls' % (filename, String) ) 807 | 808 | 809 | # 独立的登分表 810 | wb = copy(rb) 811 | ws = wb.get_sheet(0) 812 | ws.write(0, 0, '班别', style=style3) 813 | ws.write(0, 1, '学号', style=style3) 814 | ws.write(0, 2, '考号', style=style3) 815 | ws.write(0, 3, '座位号', style=style3) 816 | ws.write(0, 4, '姓名', style=style3) 817 | for i in range(len(dengfen_name_list)): 818 | ws.write(i + 1, 4, dengfen_name_list[i], style=style) 819 | ws.write(i + 1, 3, int(dengfen_dict[dengfen_name_list[i]]), style=style) 820 | for j in range(dataset.shape[0]): 821 | if str(dataset[j][4]).__eq__(dengfen_name_list[i]): 822 | ws.write(i + 1, 2, int(dataset[j][1]), style=style) 823 | ws.write(i + 1, 1, str(dataset[j][3]), style=style) 824 | ws.write(i + 1, 0, int(dataset[j][2]), style=style) 825 | wb.save(r'%s\%s考试登分表.xls' % (filename, String)) 826 | 827 | 828 | #以下是完整表 829 | wb = copy(rb) 830 | # wb = Workbook() 831 | dengfen_name_list = [] 832 | dengfen_dict = {} 833 | ws = wb.get_sheet(0) 834 | for i in range(len(number_inclass_key)): 835 | index = i 836 | banbie = number_inclass_key[i] 837 | number_inclass_maxx = number_inclass_max_list[i] 838 | # 通过get_sheet()获取的sheet有write()方法 839 | # ws = wb.worksheets[0] 840 | columns = 6 841 | return_name_list, return_str_list = class_names(big_name_list, i, number_inclass_maxx, grade, banbie) 842 | print('return_str_list', end="") 843 | print(return_str_list) 844 | print('return_name_list', end="") 845 | print(return_name_list) 846 | ren = 0 847 | for i in range(columns): 848 | for j in range(len(return_name_list[i])): 849 | ren = ren + 1 850 | ws.write(10 - j + index * 14, i * 3, int(return_str_list[i][j]), style=style2) 851 | ws.write(10 - j + index * 14, i * 3 + 1, return_name_list[i][j], style=style) 852 | dengfen_dict[return_name_list[i][j]] = int(return_str_list[i][j]) 853 | dengfen_name_list.append(return_name_list[i][j]) 854 | # if(len(return_name_list) > 6): 855 | # for i in range(len(return_name_list[6])): 856 | # ws.write(10 - j, i * 3, int(return_str_list[i][j])) 857 | chuji_utf8 = grade 858 | ws.write(0 + index * 14, 7, str(year) + chuji_utf8 + test_name + str(banbie) + '班座位表' + str(ren) + '人', style=style4) 859 | ws.write(12 + index * 14, 0, '前门', style=style3) 860 | ws.write(1 + index * 14, 0, '后门', style=style3) 861 | ws.write(12 + index * 14, 8, '讲台', style=style3) 862 | 863 | # 完整表第二页的登分表 864 | ws = wb.get_sheet(1) 865 | ws.write(0, 0, '班别', style=style3) 866 | ws.write(0, 1, '学号', style=style3) 867 | ws.write(0, 2, '考号', style=style3) 868 | ws.write(0, 3, '座位号', style=style3) 869 | ws.write(0, 4, '姓名', style=style3) 870 | for i in range(len(dengfen_name_list)): 871 | ws.write(i + 1, 4, dengfen_name_list[i], style=style) 872 | ws.write(i + 1, 3, int(dengfen_dict[dengfen_name_list[i]]), style=style) 873 | for j in range(dataset.shape[0]): 874 | if str(dataset[j][4]).__eq__(dengfen_name_list[i]): 875 | ws.write(i + 1, 2, int(dataset[j][1]), style=style) 876 | ws.write(i + 1, 1, str(dataset[j][3]), style=style) 877 | ws.write(i + 1, 0, int(dataset[j][2]), style=style) 878 | wb.save(r'%s\%s考试完整表.xls' % (filename, String)) 879 | print('excel写入完毕!') 880 | 881 | 882 | def class_names(big_name_list, index, number_inclass_max, grade, banbie): 883 | if grade == '初一': 884 | chuji = 1 885 | elif grade == '初二': 886 | chuji = 2 887 | elif grade == '初三': 888 | chuji = 3 889 | elif grade == '高一': 890 | chuji = 4 891 | elif grade == '高二': 892 | chuji = 5 893 | elif grade == '高三': 894 | chuji = 6 895 | else: 896 | chuji = 7 897 | columns = 6 898 | name_list = big_name_list[index] 899 | print('name_list:') 900 | print(name_list) 901 | return_name_list = [] 902 | return_str_list = [] 903 | if len(name_list) == number_inclass_max: # 整个班达到了最大容纳量 904 | j = 0 # 序数,方便看第几个学生 905 | rows = int(len(name_list) / columns) # 计算能填满多少行 906 | number_zhengchang = rows * columns # 行和列是多少,以便看还剩下多少人 907 | number_others = number_inclass_max - number_zhengchang # 最后一行补充学生数量 908 | index_list = [] # 名字列表 909 | str_list = [] # 编号列表 910 | print('class_names——number_zhengchang:', end="") 911 | print(number_zhengchang) 912 | print('number_others:', end="") 913 | print(number_others) 914 | flag_rows = 0 # 标志,是否要在某一列学生加一个位后再减一进入下一列 915 | for i in range(len(name_list)): 916 | # if(flag_rows == 1): 917 | # rows = rows - 1 # 进入下一行用正常的行数 918 | # number_others = number_others - 1 # 剪掉一个多余的学生 919 | # flag_rows = 0 # 重新初始化 920 | # if(number_others > 0 and i > 0 and flag_rows == 0 and len(return_name_list) > 0): # 有多余学生且不是第一列 921 | # flag_rows = 1 922 | # rows = rows + 1 923 | print('rows:', end="") 924 | print(rows) 925 | j = j + 1 926 | index_list.append(name_list[i]) 927 | if j <= 9: 928 | xushu = '0' + str(j) 929 | else: 930 | xushu = str(j) 931 | string = str(chuji) + str(banbie) + str(xushu) 932 | str_list.append(string) 933 | if(j > number_zhengchang): 934 | continue 935 | if((len(index_list)) == rows ): 936 | # if((i + 1) % rows == 0): 937 | # 一列满了 938 | return_name_list.append(index_list) 939 | index_list = [] 940 | return_str_list.append(str_list) 941 | str_list = [] 942 | if(len(return_name_list) == 1 and number_others > 0): 943 | rows = rows + 1 944 | flag_rows = 1 945 | elif((number_others > 0) and (len(return_name_list) > 1) and flag_rows == 1): 946 | number_others = number_others - 1 947 | if(flag_rows == 1 and number_others == 0): 948 | flag_rows = 0 949 | rows = rows - 1 950 | if(len(index_list) != 0): 951 | return_name_list.append(index_list) # 剩下的人数 952 | return_str_list.append(str_list) 953 | else: 954 | j = 0 # 序数,方便看第几个学生 955 | rows = int(len(name_list) / columns) # 计算能填满多少行 956 | number_zhengchang = rows * columns # 行和列是多少,以便看还剩下多少人 957 | number_others = len(name_list) - number_zhengchang # 最后一行补充学生数量 958 | index_list = [] # 名字列表 959 | str_list = [] # 编号列表 960 | print('class_names——number_zhengchang:', end="") 961 | print(number_zhengchang) 962 | print('number_others:', end="") 963 | print(number_others) 964 | flag_rows = 0 # 标志,是否要在某一列学生加一个位后再减一进入下一列 965 | for i in range(len(name_list)): 966 | # if(flag_rows == 1): 967 | # rows = rows - 1 # 进入下一行用正常的行数 968 | # number_others = number_others - 1 # 剪掉一个多余的学生 969 | # flag_rows = 0 # 重新初始化 970 | # if(number_others > 0 and i > 0 and flag_rows == 0 and len(return_name_list) > 0): # 有多余学生且不是第一列 971 | # flag_rows = 1 972 | # rows = rows + 1 973 | print('rows:', end="") 974 | print(rows) 975 | j = j + 1 976 | index_list.append(name_list[i]) 977 | if j <= 9: 978 | xushu = '0' + str(j) 979 | else: 980 | xushu = str(j) 981 | string = str(chuji) + str(banbie) + str(xushu) 982 | str_list.append(string) 983 | if (j > number_zhengchang): 984 | continue 985 | if ((len(index_list)) == rows): 986 | # if((i + 1) % rows == 0): 987 | # 一列满了 988 | return_name_list.append(index_list) 989 | index_list = [] 990 | return_str_list.append(str_list) 991 | str_list = [] 992 | if (len(return_name_list) == 1 and number_others > 0): 993 | rows = rows + 1 994 | flag_rows = 1 995 | elif ((number_others > 0) and (len(return_name_list) > 1) and flag_rows == 1): 996 | number_others = number_others - 1 997 | if (flag_rows == 1 and number_others == 0): 998 | flag_rows = 0 999 | rows = rows - 1 1000 | if (len(index_list) != 0): 1001 | return_name_list.append(index_list) # 剩下的人数 1002 | return_str_list.append(str_list) 1003 | return return_name_list, return_str_list 1004 | 1005 | 1006 | # 设置主函数,便于图形界面直接调用完整功能 1007 | def main(adict): 1008 | time1 = time.time() 1009 | try: 1010 | dataset, primary_key_random_list = get_names(adict['filename_address']) 1011 | except Exception as e: 1012 | print('get_names报错信息') 1013 | error_information = e 1014 | print(e) 1015 | try: 1016 | big_name_list, number_inclass_key, number_inclass_max_list, error_information = big_name_list_make(dataset, primary_key_random_list, adict['number_class'], adict['number_inclass_key'], adict['number_inclass_dict']) 1017 | except Exception as e: 1018 | print('big_name_list_make报错信息') 1019 | error_information = e 1020 | print(e) 1021 | try: 1022 | write_excel(big_name_list, number_inclass_key, number_inclass_max_list, adict['test_name'], adict['year'], adict['grade'], dataset, adict['filename_save']) 1023 | except Exception as e: 1024 | print('write_excel报错信息') 1025 | error_information = e 1026 | print(e) 1027 | time2 = time.time() 1028 | print('完整所需时间:' + str(time2 - time1)) 1029 | return error_information 1030 | 1031 | 1032 | if __name__=="__main__": 1033 | app=QtWidgets.QApplication(sys.argv) 1034 | widget=QtWidgets.QWidget() 1035 | ui =Ui_index_frame() 1036 | ui.setupUi(widget) 1037 | widget.show() 1038 | sys.exit(app.exec_()) -------------------------------------------------------------------------------- /allV2.0.spec: -------------------------------------------------------------------------------- 1 | # -*- mode: python -*- 2 | 3 | block_cipher = None 4 | 5 | 6 | a = Analysis(['allV2.0.py'], 7 | pathex=['E:\\Projects\\Gui\\all'], 8 | binaries=[], 9 | datas=[], 10 | hiddenimports=[], 11 | hookspath=[], 12 | runtime_hooks=[], 13 | excludes=[], 14 | win_no_prefer_redirects=False, 15 | win_private_assemblies=False, 16 | cipher=block_cipher, 17 | noarchive=False) 18 | pyz = PYZ(a.pure, a.zipped_data, 19 | cipher=block_cipher) 20 | exe = EXE(pyz, 21 | a.scripts, 22 | a.binaries, 23 | a.zipfiles, 24 | a.datas, 25 | [], 26 | name='allV2.0', 27 | debug=False, 28 | bootloader_ignore_signals=False, 29 | strip=False, 30 | upx=True, 31 | runtime_tmpdir=None, 32 | console=False ) 33 | -------------------------------------------------------------------------------- /name.xls: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GDUT-Rp/TrueLight_random_test/1c4660de51954186d712c82ed45a3470d1138e17/name.xls -------------------------------------------------------------------------------- /show/2019初一入学考考试完整表.xls: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GDUT-Rp/TrueLight_random_test/1c4660de51954186d712c82ed45a3470d1138e17/show/2019初一入学考考试完整表.xls -------------------------------------------------------------------------------- /show/2019初一入学考考试座位表.xls: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GDUT-Rp/TrueLight_random_test/1c4660de51954186d712c82ed45a3470d1138e17/show/2019初一入学考考试座位表.xls -------------------------------------------------------------------------------- /show/2019初一入学考考试登分表.xls: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GDUT-Rp/TrueLight_random_test/1c4660de51954186d712c82ed45a3470d1138e17/show/2019初一入学考考试登分表.xls -------------------------------------------------------------------------------- /show/Snipaste_2018-09-16_21-38-27.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GDUT-Rp/TrueLight_random_test/1c4660de51954186d712c82ed45a3470d1138e17/show/Snipaste_2018-09-16_21-38-27.png -------------------------------------------------------------------------------- /show/Snipaste_2018-09-16_21-39-37.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GDUT-Rp/TrueLight_random_test/1c4660de51954186d712c82ed45a3470d1138e17/show/Snipaste_2018-09-16_21-39-37.png -------------------------------------------------------------------------------- /show/Snipaste_2018-09-16_21-40-05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GDUT-Rp/TrueLight_random_test/1c4660de51954186d712c82ed45a3470d1138e17/show/Snipaste_2018-09-16_21-40-05.png -------------------------------------------------------------------------------- /show/Snipaste_2018-09-16_21-40-26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GDUT-Rp/TrueLight_random_test/1c4660de51954186d712c82ed45a3470d1138e17/show/Snipaste_2018-09-16_21-40-26.png -------------------------------------------------------------------------------- /show/Snipaste_2018-09-16_21-41-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GDUT-Rp/TrueLight_random_test/1c4660de51954186d712c82ed45a3470d1138e17/show/Snipaste_2018-09-16_21-41-16.png -------------------------------------------------------------------------------- /show/e73262c87df883380036da729e2b8e6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GDUT-Rp/TrueLight_random_test/1c4660de51954186d712c82ed45a3470d1138e17/show/e73262c87df883380036da729e2b8e6.png -------------------------------------------------------------------------------- /test.xls: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GDUT-Rp/TrueLight_random_test/1c4660de51954186d712c82ed45a3470d1138e17/test.xls -------------------------------------------------------------------------------- /使用前请阅读.txt: -------------------------------------------------------------------------------- 1 | 1、请在D盘建个文件夹,命名为StudentSystem,然后将该程序的所有内容复制到该文件夹中 2 | 2、特别提醒,需保证test.xls该文件的路径为D:\StudentSystem\test.xls 3 | 3、搞定之后请保证导入名单表格内的格式如该文件夹内name.xls 4 | 4、本文件夹其他文件请勿删 5 | 5、该程序较大,开启该程序所需时间可能较长,请耐心等待10秒左右,勿重复开启 6 | 6、执行程序之前请在电脑任意位置(除了C盘)建好相关文件夹用于存储座位表格 7 | 7、正常执行程序后会有三分表,分别为登分表,座位表(每页一个班,最后一页为登分表)及完整表(一页座位表及登分表) 8 | 8、非常重要!本程序只限Windows系统64机器使用,其他系统及电脑均会报错。 9 | 9、该程序简陋,健硕性较差,请安照正确格式使用,如出错或相关建议请联系作者1132767421@qq.com 10 | 11 | Q1:如果你运行时日志发生“write_excel报错信息 Excel xlsx file; not supported” 12 | A1:请执行以下命令后进行重试: 13 | 第一步:pip uninstall xlrd 14 | 第二部:pip install xlrd==1.2.0 15 | -------------------------------------------------------------------------------- /文件存放位置如图所示.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GDUT-Rp/TrueLight_random_test/1c4660de51954186d712c82ed45a3470d1138e17/文件存放位置如图所示.jpg -------------------------------------------------------------------------------- /版本跟新说明.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GDUT-Rp/TrueLight_random_test/1c4660de51954186d712c82ed45a3470d1138e17/版本跟新说明.txt --------------------------------------------------------------------------------