# 4.5.2 读写Excel文件

pandas 通过 `to_excel()` 和 `read_excel()` 实现 Excel 文件的存取。`to_excel()` 是数据框的成员，必须通过数据框对象调用；`read_excel()` 是 pandas 的成员，要通过 pandas 调用（如 `pd.read_excel()`）。这与上一节 CSV 的 `to_csv()`/`read_csv()` 分工相同。课程沿用招生人数示例：二维列表 `data = [[800, 750, 500], [700, 800, 600], [680, 720, 580]]`，列标签为会计、保险、外语，行标签为 2022、2023、2024，先构成数据框再写入 Excel。

写出时调用 `df.to_excel('renshu.xlsx', index=True)`。参数 `index=True` 指定需要保存索引（行标签会出现在工作表最左列）；不需要保存索引则设 `index=False`。函数 `to_excel()` 保存的默认工作表名称是 `Sheet1`，可以通过 `sheet_name` 指定工作表名称，例如 `df.to_excel('renshu.xlsx', sheet_name='学院', index=True)`，工作表名变为「学院」。通过函数 `to_excel()` 保存的 excel 工作簿中只有一个工作表。如果要在一个工作簿中保存多个工作表，则要利用 pandas 的 `ExcelWriter` 对象：先 `from pandas import ExcelWriter`，再 `with ExcelWriter('workbook.xlsx') as writer:`，然后分别 `df1.to_excel(writer, sheet_name='表1')`、`df2.to_excel(writer, sheet_name='表2')`，即可把两个数据框对象 `df1` 和 `df2` 写入同一工作簿 `workbook.xlsx`，工作表名分别为「表1」和「表2」。

读入时用 `pd.read_excel()`。参数 `sheet_name` 用于指定工作表名称；如果读取工作簿的第一个工作表，也可以不设置该参数。如果工作表包含索引，则设置参数 `index_col`，否则不设置该参数。对应写出「学院」表且保存了索引的读法是：`df = pd.read_excel('renshu.xlsx', sheet_name='学院', index_col=0)`。

易错点：`to_excel()` 必须用数据框调用，`read_excel()` 必须用 `pd` 调用，二者不能对调；默认表名是 `Sheet1` 而不是「学院」，读入时写错 `sheet_name` 会找不到工作表；对同一文件多次直接 `to_excel()` 会覆盖整个工作簿，并不能追加工作表，多表必须走 `ExcelWriter`；写出时 `index=True` 则读入应对齐设置 `index_col=0`，否则行标签会被当成普通列。读写 `.xlsx` 通常还需安装 `openpyxl` 引擎。

## 关键要点
- Excel 存取用 `to_excel()` 与 `read_excel()`：前者是数据框成员，后者是 pandas 成员。
- `index=True` 保存行标签，`index=False` 不保存；默认工作表名是 `Sheet1`。
- `sheet_name` 指定工作表名称，如 `'学院'`、`'表1'`、`'表2'`。
- 一个 `to_excel()` 调用只写入一个工作表；同一工作簿多表必须用 `ExcelWriter`。
- `read_excel()` 用 `sheet_name` 选表；读第一个工作表时可省略该参数。
- 工作表含索引时设 `index_col`（课程示例为 `index_col=0`），否则不设。
