You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将非结构化学校时间表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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 08:57:12