from functions import * from openpyxl import Workbook from openpyxl.styles import Font, Alignment, Border, Side import io center = Alignment(horizontal="center", vertical="center") std_font = Font(name="Calibri", size=13) side = Side(border_style='thin') border = Border(left=side, right=side, top=side, bottom=side) bold_bottom = Border(left=side, right=side, top=side, bottom=Side(border_style='medium', color='FF000000')) def create_period_sheets(workbook, class_code): ws = workbook.create_sheet(class_code[0] + class_code[1]) ws.merge_cells('A1:F1') ws['A1'] = '台北市私立復興實驗高級中學班級課表' ws['A1'].font = Font(name="DFKai-SB", size=15, bold=True) ws['A1'].alignment = center # loop over A:F for i in range(0, 6): ws[str(chr(ord('A') + i)) + '1'].border = border ws['G1'] = class_code[0] + class_code[1] ws['G1'].font = Font(name='Courier New', size=20, bold=True) ws['G1'].alignment = center ws['G1'].border = border ws.row_dimensions[1].height = 40 ws.row_dimensions[2].height = 25 ws.column_dimensions['A'].width = 3 ws.column_dimensions['B'].width = 10 ws.merge_cells('A2:B2') ws['A2'] = '時間' ws['C2'] = '星期一' ws['D2'] = '星期二' ws['E2'] = '星期三' ws['F2'] = '星期四' ws['G2'] = '星期五' # loop over A2:G2 for i in range(1, 8): ws.cell(row=2, column=i).font = Font(size=14, bold=True) ws.cell(row=2, column=i).alignment = center ws.cell(row=2, column=i).border = border # loop over C:G for i in range(2, 8): ws.column_dimensions[str(chr(ord('A') + i))].width = 13 # get data db = refresh_db() cursor = db.cursor() cursor.execute("SELECT dow,period,subject,teacher FROM schedule WHERE grade=%s AND class_=%s", (class_code[0], class_code[1])) sql = cursor.fetchall() data = {} subject_teacher = {} # loop over data for i in sql: if i[0] not in data: data[i[0]] = {} data[i[0]][i[1]] = { 'subject': i[2], 'teacher': i[3] } if i[2] != 'GP' and i[2] != '--' and i[3] != '--' and i[2] not in subject_teacher: subject_teacher[i[2]] = i[3] periods = ['m', '1', '2', '3', '4', 'n', '5', '6', '7', '8', '9'] times = { 'm': ['7:30', '8:10'], '1': ['8:20', '9:05'], '2': ['9:15', '10:00'], '3': ['10:10', '10:55'], '4': ['11:05', '11:50'], 'n': ['11:50', '13:05'], '5': ['13:15', '14:00'], '6': ['14:10', '14:55'], '7': ['15:05', '15:50'], '8': ['15:55', '16:40'], '9': ['16:45', '17:30'] } curr = 3 for p in periods: ws.merge_cells('A' + str(curr) + ':A' + str(curr + 1)) ws.row_dimensions[curr].height = 20 ws.row_dimensions[curr + 1].height = 20 ws['A' + str(curr)] = p ws['A' + str(curr)].font = std_font ws['A' + str(curr)].alignment = center ws['A' + str(curr)].border = border ws['A' + str(curr + 1)].border = border ws['B' + str(curr)] = times[p][0] ws['B' + str(curr)].font = std_font ws['B' + str(curr)].alignment = center ws['B' + str(curr)].border = border ws['B' + str(curr + 1)] = times[p][1] ws['B' + str(curr + 1)].font = std_font ws['B' + str(curr + 1)].alignment = center ws['B' + str(curr + 1)].border = border if p == 'm' or p == 'n': ws.merge_cells('C' + str(curr) + ':G' + str(curr + 1)) for i in range(1, 6): ws[chr(ord('C') + i - 1) + str(curr)].font = std_font ws[chr(ord('C') + i - 1) + str(curr)].alignment = center ws[chr(ord('C') + i - 1) + str(curr)].border = border ws[chr(ord('C') + i - 1) + str(curr + 1)].border = border if p == 'm': ws['C' + str(curr)] = '早自習' else: ws['C' + str(curr)] = '午餐 / 午休' else: for i in range(1, 6): ws.merge_cells(chr(ord('C') + i - 1) + str(curr) + ':' + chr(ord('C') + i - 1) + str(curr + 1)) ws[chr(ord('C') + i - 1) + str(curr)].font = std_font ws[chr(ord('C') + i - 1) + str(curr)].alignment = center ws[chr(ord('C') + i - 1) + str(curr)].border = border ws[chr(ord('C') + i - 1) + str(curr + 1)].border = border if i in data: if p in data[i]: ws[chr(ord('C') + i - 1) + str(curr)] = (data[i][p]['subject'] if data[i][p]['subject'] != 'GP' and data[i][p][ 'subject'] != '--' else '' if data[i][p]['subject'] == '--' else data[i][p]['teacher']) curr += 2 ws.merge_cells('A26:G26') ws['A26'] = '科任老師一覽表' ws['A26'].font = Font(size=14, bold=True) ws['A26'].alignment = center ws.row_dimensions[26].height = 20 # loop over A26:G26 for i in range(0, 7): ws[chr(ord('A') + i) + '26'].border = border curr = 0 for i in subject_teacher: if (curr % 3) == 0: pos = ['A', 'C'] elif (curr % 3) == 1: pos = ['D', 'E'] else: pos = ['F', 'G'] loc = str(27 + int(curr / 3)) ws.merge_cells(pos[0] + loc + ':' + pos[1] + loc) ws[pos[0] + loc].font = std_font ws[pos[0] + loc].alignment = center ws[pos[0] + loc].border = border ws[pos[0] + loc] = i + ': ' + subject_teacher[i] for j in range(ord(pos[0]), ord(pos[1]) + 1): ws[chr(j) + loc].border = border ws.row_dimensions[curr + 27].height = 20 curr += 1 return workbook def create_student_list(workbook, class_code): ws = workbook.create_sheet(class_code[0] + class_code[1]) ws.merge_cells('A1:K1') ws['A1'] = '台北市私立復興實驗高級中學學生名單' ws['A1'].font = Font(name="DFKai-SB", size=15, bold=True) ws['A1'].alignment = center # loop over A:K for i in range(0, 12): ws[str(chr(ord('A') + i)) + '1'].border = border ws.merge_cells('L1:N1') ws['L1'] = class_code[0] + class_code[1] ws['L1'].font = Font(name='Courier New', size=20, bold=True) ws['L1'].alignment = center ws['L1'].border = border ws['M1'].border = border ws['N1'].border = border ws.column_dimensions['A'].width = 5 ws.column_dimensions['B'].width = 11 ws.column_dimensions['C'].width = 12 ws.row_dimensions[1].height = 25 ws.row_dimensions[2].height = 20 ws['A2'] = '#' ws['A2'].font = Font(name="Calibri", size=13, bold=True) ws['A2'].alignment = center ws['A2'].border = bold_bottom ws['B2'] = '姓名' ws['B2'].font = Font(name="DFKai-SB", size=13, bold=True) ws['B2'].alignment = center ws['B2'].border = bold_bottom ws['C2'] = 'Name' ws['C2'].font = Font(name="Calibri", size=13, bold=True) ws['C2'].alignment = center ws['C2'].border = bold_bottom for i in range(3, 14): ws[str(chr(ord('A') + i)) + '2'].border = bold_bottom ws.column_dimensions[str(chr(ord('A') + i))].width = 4.6 db = refresh_db() cursor = db.cursor() cursor.execute('SELECT num,name,ename FROM students WHERE grade=%s AND class_=%s ORDER BY num ASC', (class_code[0], class_code[1])) data = cursor.fetchall() if data == []: return workbook last = data[-1][0] delcnt = 0 for i in range(0, last): ws['A' + str(3 + i)] = i + 1 ws['A' + str(3 + i)].font = std_font ws['A' + str(3 + i)].alignment = center ws['B' + str(3 + i)] = data[i - delcnt][1] if data[i - delcnt][0] == i + 1 else '' ws['B' + str(3 + i)].font = Font(name="DFKai-SB", size=14) ws['B' + str(3 + i)].alignment = center ws['C' + str(3 + i)] = data[i - delcnt][2] if data[i - delcnt][0] == i + 1 else '' ws['C' + str(3 + i)].font = std_font ws['C' + str(3 + i)].alignment = center ws.row_dimensions[3 + i].height = 19 for j in range(0, 14): ws[str(chr(ord('A') + j)) + str(3 + i)].border = bold_bottom if (i + 1) % 5 == 0 else border if data[i - delcnt][0] != i + 1: delcnt += 1 return workbook def create_group_student_list(workbook, cclass, data): class_code = [cclass['category'], cclass['class_id']] ws = workbook.create_sheet(class_code[0] + '.' + class_code[1]) ws.merge_cells('A1:J1') ws['A1'] = '台北市私立復興實驗高級中學分組課學生名單' ws['A1'].font = Font(name="DFKai-SB", size=15, bold=True) ws['A1'].alignment = center # loop over A:J for i in range(0, 12): ws[str(chr(ord('A') + i)) + '1'].border = border ws.merge_cells('K1:O1') ws['K1'] = class_code[0] + class_code[1] ws['K1'].font = Font(name='Calibri', size=15, bold=True) ws['K1'].alignment = center ws['K1'].border = border ws['L1'].border = border ws['M1'].border = border ws['N1'].border = border ws['O1'].border = border ws.column_dimensions['A'].width = 6 ws.column_dimensions['B'].width = 4 ws.column_dimensions['C'].width = 11 ws.column_dimensions['D'].width = 12 ws.row_dimensions[1].height = 25 ws.row_dimensions[2].height = 20 ws.row_dimensions[3].height = 20 ws['A3'] = '班級' ws['A3'].font = Font(name="Calibri", size=13, bold=True) ws['A3'].alignment = center ws['A3'].border = bold_bottom ws['B3'] = '#' ws['B3'].font = Font(name="Calibri", size=13, bold=True) ws['B3'].alignment = center ws['B3'].border = bold_bottom ws['C3'] = '姓名' ws['C3'].font = Font(name="DFKai-SB", size=13, bold=True) ws['C3'].alignment = center ws['C3'].border = bold_bottom ws['D3'] = 'Name' ws['D3'].font = Font(name="Calibri", size=13, bold=True) ws['D3'].alignment = center ws['D3'].border = bold_bottom db = refresh_db() cursor = db.cursor() cursor.execute("SELECT about FROM gpclasses WHERE category=%s AND subclass=%s LIMIT 1", (class_code[0], class_code[1])) ws.merge_cells('A2:O2') ws['A2'] = cursor.fetchone()[0] ws['A2'].font = Font(name="Calibri", size=13, bold=True) ws['A2'].alignment = center for i in range(0, 15): ws[str(chr(ord('A') + i)) + '2'].border = border for i in range(4, 15): ws[str(chr(ord('A') + i)) + '3'].border = bold_bottom ws.column_dimensions[str(chr(ord('A') + i))].width = 4.4 cnt = 0 for i in data: ws['A' + str(4 + cnt)] = str(i[0]) + str(i[1]) ws['A' + str(4 + cnt)].font = std_font ws['A' + str(4 + cnt)].alignment = center ws['B' + str(4 + cnt)] = i[2] ws['B' + str(4 + cnt)].font = std_font ws['B' + str(4 + cnt)].alignment = center ws['C' + str(4 + cnt)] = i[3] ws['C' + str(4 + cnt)].font = Font(name="DFKai-SB", size=14) ws['C' + str(4 + cnt)].alignment = center ws['D' + str(4 + cnt)] = i[4] ws['D' + str(4 + cnt)].font = std_font ws['D' + str(4 + cnt)].alignment = center ws.row_dimensions[4 + cnt].height = 19 for j in range(0, 15): ws[str(chr(ord('A') + j)) + str(4 + cnt)].border = bold_bottom if (cnt + 1) % 5 == 0 else border cnt += 1 return workbook def create_teacher_periods(workbook, teacher_name, orig_username=''): ws = workbook.create_sheet(teacher_name) ws.merge_cells('A1:E1') ws['A1'] = '台北市私立復興實驗高級中學科任老師課表' ws['A1'].font = Font(name="DFKai-SB", size=15, bold=True) ws['A1'].alignment = center # loop over A:E for i in range(0, 5): ws[str(chr(ord('A') + i)) + '1'].border = border ws.merge_cells('F1:G1') ws['F1'] = teacher_name + " 老師" ws['F1'].font = Font(name='Calibri', size=15, bold=True) ws['F1'].alignment = center ws['F1'].border = border ws['G1'].border = border ws.row_dimensions[1].height = 40 ws.row_dimensions[2].height = 25 ws.column_dimensions['A'].width = 3 ws.column_dimensions['B'].width = 10 ws.merge_cells('A2:B2') ws['A2'] = '時間' ws['C2'] = '星期一' ws['D2'] = '星期二' ws['E2'] = '星期三' ws['F2'] = '星期四' ws['G2'] = '星期五' # loop over A2:G2 for i in range(1, 8): ws.cell(row=2, column=i).font = Font(size=14, bold=True) ws.cell(row=2, column=i).alignment = center ws.cell(row=2, column=i).border = border # loop over C:G for i in range(2, 8): ws.column_dimensions[str(chr(ord('A') + i))].width = 13 # get data data = {} db = refresh_db() cursor = db.cursor() if orig_username != '': cursor.execute('SELECT category,subclass FROM gpclasses WHERE accs LIKE %s', ('%' + orig_username + '%',)) gp_sql = cursor.fetchall() for i in gp_sql: cursor.execute('SELECT dow,period FROM schedule WHERE teacher=%s', (i[0],)) tmp_sql = cursor.fetchall() for j in tmp_sql: if j[0] not in data: data[j[0]] = {} data[j[0]][j[1]] = { 'subject': i[0], 'class': i[1] } cursor.execute("SELECT dow,period,subject,grade,class_ FROM schedule WHERE teacher=%s", (teacher_name,)) sql = cursor.fetchall() # loop over data for i in sql: if i[0] not in data: data[i[0]] = {} data[i[0]][i[1]] = { 'subject': i[2], 'class': str(i[3]) + str(i[4]) } periods = ['m', '1', '2', '3', '4', 'n', '5', '6', '7', '8', '9'] times = { 'm': ['7:30', '8:10'], '1': ['8:20', '9:05'], '2': ['9:15', '10:00'], '3': ['10:10', '10:55'], '4': ['11:05', '11:50'], 'n': ['11:50', '13:05'], '5': ['13:15', '14:00'], '6': ['14:10', '14:55'], '7': ['15:05', '15:50'], '8': ['15:55', '16:40'], '9': ['16:45', '17:30'] } curr = 3 for p in periods: ws.merge_cells('A' + str(curr) + ':A' + str(curr + 1)) ws.row_dimensions[curr].height = 20 ws.row_dimensions[curr + 1].height = 20 ws['A' + str(curr)] = p ws['A' + str(curr)].font = std_font ws['A' + str(curr)].alignment = center ws['A' + str(curr)].border = border ws['A' + str(curr + 1)].border = border ws['B' + str(curr)] = times[p][0] ws['B' + str(curr)].font = std_font ws['B' + str(curr)].alignment = center ws['B' + str(curr)].border = border ws['B' + str(curr + 1)] = times[p][1] ws['B' + str(curr + 1)].font = std_font ws['B' + str(curr + 1)].alignment = center ws['B' + str(curr + 1)].border = border if p == 'm' or p == 'n': ws.merge_cells('C' + str(curr) + ':G' + str(curr + 1)) for i in range(1, 6): ws[chr(ord('C') + i - 1) + str(curr)].font = std_font ws[chr(ord('C') + i - 1) + str(curr)].alignment = center ws[chr(ord('C') + i - 1) + str(curr)].border = border ws[chr(ord('C') + i - 1) + str(curr + 1)].border = border if p == 'm': ws['C' + str(curr)] = '早自習' else: ws['C' + str(curr)] = '午餐 / 午休' else: for i in range(1, 6): ws.merge_cells(chr(ord('C') + i - 1) + str(curr) + ':' + chr(ord('C') + i - 1) + str(curr + 1)) ws[chr(ord('C') + i - 1) + str(curr)].font = std_font ws[chr(ord('C') + i - 1) + str(curr)].border = border ws[chr(ord('C') + i - 1) + str(curr + 1)].border = border ws[chr(ord('C') + i - 1) + str(curr)].alignment = center + Alignment(wrapText=True) if i in data: if p in data[i]: ws[chr(ord('C') + i - 1) + str(curr)] = ( data[i][p]['subject'] + '\n' + data[i][p]['class'] if data[i][p]['subject'] != 'GP' and data[i][p][ 'subject'] != '--' else '' if data[i][p]['subject'] == '--' else data[i][p]['teacher']) curr += 2 return workbook