如何将非结构化学校时间表Google Sheet转为可筛选的DataFrame
解决方案:非结构化课程表转可筛选DataFrame并导出PDF
1. 读取Google Sheet原始数据(含合并单元格处理)
非结构化表格常存在合并单元格,直接用get_all_records()会丢失数据,先读取所有单元格值和合并单元格信息,填充合并区域的内容:
import gspread import pandas as pd from oauth2client.service_account import ServiceAccountCredentials # 授权连接Google Sheet scope = ["https://spreadsheets.google.com/feeds", "https://www.googleapis.com/auth/drive"] creds = ServiceAccountCredentials.from_json_keyfile_name("your-credentials.json", scope) client = gspread.authorize(creds) # 打开目标工作表 sheet = client.open_by_key("1GAH6Cb8JuloDAiTIGnEr9GtPPyHWXMpOLV6nHNSgcoM").get_worksheet_by_id(1324085625) data = sheet.get_all_values() merge_cells = sheet.merge_cells # 填充合并单元格内容 for merge in merge_cells: start_row, start_col = merge["start_row"] - 1, merge["start_col"] - 1 end_row, end_col = merge["end_row"] - 1, merge["end_col"] - 1 fill_value = data[start_row][start_col] # 遍历合并区域,统一填充值 for row in range(start_row, end_row + 1): for col in range(start_col, end_col + 1): data[row][col] = fill_value
2. 规整数据为结构化格式
根据课程表的实际结构(假设行是时间段、列是班级,单元格内容为「课程名(教师)@教室」格式),拆分每个单元格的字段,生成标准化条目:
structured_data = [] # 提取表头和时间段信息 time_slots = [row[0] for row in data[1:]] # 跳过第一行表头 class_names = data[0][1:] # 跳过第一列的时间段标题 for row_idx in range(1, len(data)): time_slot = time_slots[row_idx - 1] for col_idx in range(1, len(data[row_idx])): cell_content = data[row_idx][col_idx].strip() if not cell_content: continue # 拆分单元格内容(根据实际格式调整正则逻辑) import re match = re.match(r"(.*?)((.*?))@(.*)", cell_content) if match: course, teacher, classroom = match.groups() structured_data.append({ "时间段": time_slot, "班级": class_names[col_idx - 1], "课程": course, "教师": teacher, "教室": classroom }) # 转成可筛选操作的DataFrame df = pd.DataFrame(structured_data)
3. 数据筛选操作
现在可以用pandas的筛选功能实现需求:
- 筛选指定教师的授课时间:
teacher_schedule = df[df["教师"] == "张三"]
- 筛选指定教室的占用情况:
classroom_usage = df[df["教室"] == "301教室"].sort_values("时间段")
4. 筛选结果导出为PDF
可以用pdfkit将DataFrame转成PDF,或先导出为Excel再转PDF:
import pdfkit # 先转HTML再生成PDF html = teacher_schedule.to_html(index=False) pdfkit.from_string(html, "张三老师授课时间表.pdf") # 或通过Excel中转(需安装openpyxl) teacher_schedule.to_excel("张三老师授课时间表.xlsx", index=False) # Windows环境可使用win32com.client将Excel转PDF,其他环境可使用libreoffice命令行转换
注意事项
- 若课程表单元格格式不同,需调整拆分逻辑(比如分隔符、内容结构)
- 合并单元格的处理逻辑需根据表格实际合并规则调整,比如横向/纵向合并的不同情况
内容的提问来源于stack exchange,提问作者LeftyRPZ
相关产品推荐
相关产品推荐

