如果只是把DataFrame数据保存为单独的一个Excel文件,那么可以直接用data.to_excel,但是这样,只会保存为单个Excel文件和这个文件中的单个表。
# 只保存单个Excel文件中单个表,之前的都会被覆盖掉
data.to_excel(r'E:\xxx.xlsx', 'Sheet1', index=False)
解决方法:
import os
import pandas as pd
from openpyxl import Workbook,load_workbook
excel_path = r'E:\xxx.xlsx'
# 如果Excel文不存在,则直接新建文件,数据存在df中
if not os.path.exists(excel_path):
df.to_excel(excel_path, 'Sheet1',encoding='GBK', header=True, index=False)
else:
# 如果存在,则对原文件进行追加 mode='a'
with pd.ExcelWriter(excel_path, engine='openpyxl',mode='a') as writer:
df.to_excel(writer, 'Sheet1', header=True, index=False)
需要注意的是,如果Excel文件名含有中文,第一句的to_excel中的参数encoding需要写为’GBK’,否则会导致追加时生成ExcelWriter异常,报错File is not a ZIP file。
在Pandas 1.2.0版本之后(不含1.2.0),engine参数将弃用xlwt值,因此要使用xlwt引擎,请确保电脑上的pandas版本为1.2.0及以下,或者最好不使用xlwt。
下文是pandas.ExcelWriter 的说明,用于把DataFrame对象写入Excel表的辅助类。
# 默认情况下,用xlwt来写xls,用openpyxl写入xlsx,用odf写入ods
pd.ExcelWriter(
path, engine=None, date_format=None, datetime_format=None,
mode='w', storage_options=None, if_sheet_exists=None,
engine_kwargs=None, **kwargs
)
Writer构造时需要像打开文件那样进行上下文管理,也就是要使用with语句块的方式创建。不然的话就需要手动调用close()来关闭保存文件。
几个例子
构造一个DataFrame,并写入xlsx中:
df = pd.DataFrame([["600000.sh", "10.2"],["600016.sh", "6.2"]], columns=["ts_code", "close"])
with pd.ExcelWriter("path_to_file.xlsx") as writer:
df.to_excel(writer)
在同一个xlsx文件中,把两个DataFrame分别写入两个Sheet中:
df1 = pd.DataFrame([["600000.sh", "10.2"]], columns=["ts_code", "close"])
df2 = pd.DataFrame([["600016.sh", "6.2"]], columns=["ts_code", "close"])
with pd.ExcelWriter(r'E:\xxx.xlsx') as writer:
df1.to_excel(writer, sheet_name="Sheet1")
df2.to_excel(writer, sheet_name="Sheet2")
设置 date 和 datetime 的格式:
from datetime import date, datetime
df = pd.DataFrame(
[[date(2022, 10, 21), date(2020, 1, 12)],
[datetime(2018, 2, 14, 12, 32, 5), datetime(2016, 5, 16, 12, 2, 33)],
],
index=["Date", "Datetime"],
columns=["X", "Y"],
)
with pd.ExcelWriter(
r'E:\xxx.xlsx',
date_format='YYYY-MM-DD',
datetime_format='YYYY-MM-DD HH:MM:SS'
) as writer:
df.to_excel(writer, sheet_name='Sheet1')
对已存在的Excel文件追加Sheet表:
with pd.ExcelWriter(r'E:\xxx.xlsx', mode='a', engine='openpyxl') as writer:
df.to_excel(writer, sheet_name='Sheet3')