ExcelWriter类:用to_excel时不覆盖之前的Excel表

如果只是把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')
     
  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在使用pandas的to_excel函数,如果想要避免覆盖已有sheet,我们可以采取以下几种方法: 1.使用openpyxl库进行操作:to_excel函数中的参数excel_writer可以接受一个ExcelWriter对象,我们可以使用openpyxl库创建这个对象。首先,我们可以使用pandas的read_excel函数读取现有的Excel文件,并使用openpyxl库的load_workbook函数加载该文件。接着,我们可以通过指定engine参数为'openpyxl'来创建一个新的ExcelWriter对象,并设置其book属性为已读取的Excel文件对象。最后,我们调用to_excel函数指定ExcelWriter对象即可。 2.使用pd.ExcelWriter对象:在to_excel函数中,我们可以直接使用pd.ExcelWriter对象作为excel_writer参数传入。首先,我们可以使用pandas的read_excel函数读取现有的Excel文件,并使用pd.ExcelWriter函数创建一个新的ExcelWriter对象。然后,我们可以使用该对象的append方法将DataFrame对象写入到该ExcelWriter对象中,而不是直接调用to_excel函数。最后,我们调用save函数来保存文件。 3.操作已有sheet:我们可以在to_excel函数中设置参数startrow和startcol来指定新数据写入的起始行和列。通过将startrow和startcol设置为已有数据的最后一行和最后一列的下一个位置,我们可以将新数据写入到已有的sheet中而不覆盖之前的数据。 需要注意的是,无论选择哪种方法,在进行操作之前都应该先备份原始文件以防丢失数据。另外,在部分情况下,可能需要对Excel文件进行锁定以避免其他用户同修改导致的冲突。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值