最近学习了文件的操作(文件创建、读、写),突然想到Python长于数据处理,试试将数据写入excel,以下就是我尝试和学习的过程。
使用Pandas库,作为 Python 数据分析的核心库,提供了极其简洁的 处理 方法,能够将 DataFrame 对象高效地写入 Excel 文件。
首先确保已安装 Pandas 和 openpyxl(用于写入 .xlsx 文件)或 xlwt(用于写入 .xls 文件)。
pip install pandas openpyxl
说明:
openpyxl是推荐的 Excel 写入引擎,支持 .xlsx 格式,功能更丰富。 这两个库确实是不一样的。
简单来说,openpyxl 是为现在和未来设计的现代工具,而 xlwt 是一个功能受限、主要面向旧格式的遗留方案。在绝大多数情况下,openpyxl 是更通用、更明智的选择。
openpyxl 和 xlwt:多维度对比openpyxl | xlwt | |
|---|---|---|
| 支持格式 | .xlsx | .xls |
| 功能取向 | 现代、功能全面 | 遗留、基础写入 |
| 读写能力 | 可读可写 | 仅可写入 |
| 操作模式 | 功能丰富 | 模式单一 |
| 性能 | 相对较低 | 相对较高 |
| 生态与社区 | 活跃 | 基本停滞 |
⚠️ 重要说明:
xlwt和xlrd以及xlutils经常作为一套工具组合出现。xlrd负责读取.xls文件,xlwt负责写入,而xlutils则负责一些辅助工作(如复制文件)。如果需要修改一个现有的.xls文件,通常需要先组合使用它们。
最简单的用法是将一个 DataFrame 直接保存为 Excel 文件。 要写入的数据从哪来,简单的可以自己写,比如学生、员工等,想要简单,可以直接借助DeepSeek、豆包、千问等智能工具生成,比如我练习时就是让DeepSeek生成近三年的电视剧、电影的排名列表,包含类别、年份、导演、评分、主要演员等信息。
import pandas as pd
import os
# 确保目标文件夹存在
save_path = r"C:\XXX"
os.makedirs(save_path, exist_ok=True)
# 创建示例数据 只选取前三
movies_data = [
(1, "给阿嬷的情书", 9.0, 2026, "蓝鸿春", "李思潼、王彦桐、吴少卿", "剧情 / 家庭"),
(2, "非穷尽列举", 9.3, 2026, "贾斯汀·马丁", "裴淳华等", "剧情"),
(3, "好东西", 9.1, 2024, "邵艺辉", "宋佳、钟楚曦、曾慕梅、章宇", "剧情 / 爱情")
]
movies_df = pd.DataFrame(movies_data, columns=["排名", "电影名称", "评分", "年份", "导演", "主演", "分类"])
# 写入 Excel 文件
movies_df.to_excel(os.path.join(save_path, "影视作品.xlsx"), index=False, engine="openpyxl", sheet_name='电影')
输出结果:生成一个名为“影视作品.xlsx”的文件。
index | True,通常设为 False 避免冗余列。 |
sheet_name | 'Sheet1'。 |
engine | 'openpyxl' 或 'xlsxwriter',通常自动选择。 |
将多个表格存入同一个 Excel 文件的不同 Sheet。使用 ExcelWriter 对象即可实现。
# 创建两个 DataFrame
movies_data = [
(1, "给阿嬷的情书", 9.0, 2026, "蓝鸿春", "李思潼、王彦桐、吴少卿", "剧情 / 家庭"),
(2, "非穷尽列举", 9.3, 2026, "贾斯汀·马丁", "裴淳华等", "剧情"),
(3, "好东西", 9.1, 2024, "邵艺辉", "宋佳、钟楚曦、曾慕梅、章宇", "剧情 / 爱情")
]
movies_df = pd.DataFrame(movies_data, columns=["排名", "电影名称", "评分", "年份", "导演", "主演", "分类"])
tv_data = [
(1, "山花烂漫时", 9.6, 2024, "费振翔", "宋佳", "剧情 / 传记"),
(2, "匹兹堡医护前线 第二季", 9.3, 2026, "暂缺", "暂缺", "剧情 / 医疗"),
(3, "问苍茫", 9.0, 2024, "王伟", "王仁君", "历史 / 剧情"),
(4, "七王国的骑士", 9.0, 2026, "暂缺", "暂缺", "奇幻 / 冒险"),
(5, "我的阿勒泰", 8.9, 2024, "滕丛丛", "马伊琍、于适、周依然", "剧情 / 生活")
]
tv_df = pd.DataFrame(tv_data, columns=["排名", "剧集名称", "评分", "年份", "导演", "主演", "分类"])
# 使用 ExcelWriter 上下文管理器
with pd.ExcelWriter('C:\XXX\影视作品.xlsx', engine='openpyxl') as writer:
movies_df.to_excel(writer, sheet_name='电影', index=False)
tv_df.to_excel(writer, sheet_name='电视剧', index=False)
效果:生成一个 Excel 文件,包含“电影”和“电视剧”两个工作表。
知识点:
with语句会自动管理文件的打开与关闭,避免资源泄露。若文件已存在,openpyxl引擎默认会覆盖;如需追加 Sheet,可设置mode='a'。with语句是Python中文件操作的一大利器,很好用哦。
to_excel() 本身不支持直接设置格式,但可以通过 XlsxWriter 引擎实现丰富的单元格格式。
import pandas as pd
# 准备数据
df = pd.DataFrame({
'日期': ['2025-01-01', '2025-01-02'],
'销售额': [1234.56, 2345.67],
'增长率': [0.1234, 0.2345]
})
# 使用 XlsxWriter 引擎
writer = pd.ExcelWriter('格式化报表.xlsx', engine='xlsxwriter')
df.to_excel(writer, sheet_name='销售数据', index=False)
# 获取 workbook 和 worksheet 对象
workbook = writer.book
worksheet = writer.sheets['销售数据']
# 设置列宽
worksheet.set_column('A:A', 15) # A列宽度15
worksheet.set_column('B:B', 20) # B列宽度20
worksheet.set_column('C:C', 12) # C列宽度12
# 设置百分比格式
percent_format = workbook.add_format({'num_format': '0.00%'})
worksheet.set_column('C:C', 12, percent_format)
# 设置货币格式
money_format = workbook.add_format({'num_format': '#,##0.00'})
worksheet.set_column('B:B', 20, money_format)
writer.close()
set_column(first_col, last_col, width, cell_format)add_format({'num_format': '...'}) 创建格式对象。如果需要在不覆盖原有数据的前提下,向已有 Excel 文件新增工作表,可以使用 mode='a'。
import pandas as pd
from openpyxl import load_workbook
# 假设已有文件 '数据汇总.xlsx'
new_df = pd.DataFrame({'备注': ['补充信息'], '状态': ['完成']})
# 使用 openpyxl 引擎追加
with pd.ExcelWriter('数据汇总.xlsx', engine='openpyxl', mode='a', if_sheet_exists='replace') as writer:
new_df.to_excel(writer, sheet_name='追加表', index=False)
注意:
mode='a'需要文件已存在;if_sheet_exists可控制当工作表已存在时如何处理('replace'、'new'、'overlay' 等)。
下面是一个综合示例:从多个 CSV 文件读取数据,经过清洗合并,最终导出为带有格式和多个 Sheet 的 Excel 报表。csv文件一般可以从数据库中获取,也可以自己生成创建一个。
import pandas as pd
import glob
# 1. 读取当前目录下所有 csv 文件
all_files = glob.glob('data_*.csv')
dataframes = []
for file in all_files:
df_temp = pd.read_csv(file)
dataframes.append(df_temp)
# 2. 合并数据
merged_df = pd.concat(dataframes, ignore_index=True)
# 3. 计算统计指标
summary_df = merged_df.describe().round(2)
# 4. 导出到 Excel 的不同 Sheet
with pd.ExcelWriter('最终报表.xlsx', engine='xlsxwriter') as writer:
# 写入原始合并数据
merged_df.to_excel(writer, sheet_name='原始数据', index=False)
# 写入统计摘要
summary_df.to_excel(writer, sheet_name='统计摘要')
# 调整统计摘要的列宽
worksheet = writer.sheets['统计摘要']
for i, col in enumerate(summary_df.columns):
col_width = max(len(str(col)), summary_df[col].astype(str).map(len).max()) + 2
worksheet.set_column(i, i, col_width)
print("报表生成成功!")
ModuleNotFoundError: No module named 'openpyxl' | pip install openpyxl | |
PermissionError | ||
ValueError: Excel does not support datetimes with timezones | df['col'] = df['col'].dt.tz_localize(None) 移除时区 | |
延伸阅读:Pandas 官方文档 – https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.to_excel.html