当前位置:首页>python>使用Python的Pandas库实现数据写入Excel

使用Python的Pandas库实现数据写入Excel

  • 2026-10-11 07:28:14
使用Python的Pandas库实现数据写入Excel

最近学习了文件的操作(文件创建、读、写),突然想到Python长于数据处理,试试将数据写入excel,以下就是我尝试和学习的过程。

使用Pandas库,作为 Python 数据分析的核心库,提供了极其简洁的  处理 方法,能够将 DataFrame 对象高效地写入 Excel 文件。

一、环境准备与安装

首先确保已安装 Pandas 和 openpyxl(用于写入 .xlsx 文件)或 xlwt(用于写入 .xls 文件)。

pip install pandas openpyxl

说明:openpyxl 是推荐的 Excel 写入引擎,支持 .xlsx 格式,功能更丰富。 这两个库确实是不一样的。

简单来说,openpyxl 是为现在和未来设计的现代工具,而 xlwt 是一个功能受限、主要面向旧格式的遗留方案。在绝大多数情况下,openpyxl 是更通用、更明智的选择。

openpyxl 和 xlwt:多维度对比

特性
openpyxlxlwt
支持格式.xlsx
 (Excel 2010及更高版本)
.xls
 (Excel 97-2003)
功能取向现代、功能全面
 (支持样式、图表、公式、图片等)
遗留、基础写入
 (仅支持简单的数据与格式写入)
读写能力可读可写仅可写入
操作模式功能丰富
 (支持单元格、行列操作、样式管理)
模式单一
 (通常只能以单元格为单位操作)
性能相对较低
,在处理大文件时内存占用较高
相对较高
,速度通常更快
生态与社区活跃
,是现代Python办公自动化的核心工具
基本停滞
,作为遗留方案提供支持

⚠️ 重要说明:xlwt 和 xlrd 以及 xlutils 经常作为一套工具组合出现。xlrd 负责读取 .xls 文件,xlwt 负责写入,而 xlutils 则负责一些辅助工作(如复制文件)。如果需要修改一个现有的 .xls 文件,通常需要先组合使用它们。

二、将 DataFrame 写入单个 Sheet

最简单的用法是将一个 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
是否写入 DataFrame 的行索引。默认为 True,通常设为 False 避免冗余列。
sheet_name
指定工作表名称,默认为 'Sheet1'。
engine
指定写入引擎,如 'openpyxl' 或 'xlsxwriter',通常自动选择。

三、多 Sheet 写入

将多个表格存入同一个 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()

知识点解析

  • XlsxWriter:比 openpyxl 提供更强大的格式控制能力,但无法修改已有 Excel 文件。
  • 列宽设置:set_column(first_col, last_col, width, cell_format)
  • 数字格式:通过 add_format({'num_format': '...'}) 创建格式对象。

五、追加数据到已有 Excel

如果需要在不覆盖原有数据的前提下,向已有 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'
未安装 openpyxl
pip install openpyxl
PermissionError
Excel 文件被其他程序占用
关闭已打开的文件
ValueError: Excel does not support datetimes with timezones
时区感知的 datetime 对象
使用 df['col'] = df['col'].dt.tz_localize(None) 移除时区
中文乱码
未指定编码(通常发生在读取时)
写入 Excel 不涉及编码问题,请检查原始数据读取

延伸阅读:Pandas 官方文档 – https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.to_excel.html

最新文章

随机文章