前言:今天遇到个问题,项目上有个Excel输出文件需要进行二次读写,对已存在的.xlsx文件追加一张sheet表,但是实际操作过程中发现利用pandas.to_excel()操作失败,只能覆盖原数据,无法追加,最后发现是,版本库的问题,项目上pandas是0.23,而最新的官方文档为1.42,在本地升级后可以追加,但生产服务器无法随意动库,故准备转战openpyxl(能否成功正在研究…)。
总结:如果用pandas追加Excel数据请使用高版本,低版本无法追加数据,同时依赖openpyxl包。
官档1:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_excel.html
此处问题处理相关摘要:
关键词:ExcelWriter\ to_excel\ openpyxl\ mode
新建测试文件:
需要使用ExcelWriter
参考:(官档1)
对新文件进行创建:
with pd.ExcelWriter(‘output.xlsx’) as writer:
df1.to_excel(writer, sheet_name=‘Sheet_name_1’, index=False)
df2.to_excel(writer, sheet_name=‘Sheet_name_2’,index=False )
###注:此处df1与df2皆为已设好的DataFrame数据,df的index可以关闭
对已有Excel.xlsx文件进行读取:
df = pd.read_excel(’ input.xlsx’, sheet_name=‘Sheet1’)
对outpuy.xlsx进行追加(注意有坑,mode= 'a’代表追加,'w’代表覆盖):
with pd.ExcelWriter(‘output.xlsx’,engine=‘openpyxl’ , mode=‘a’) as writer:
df.to_excel(writer, sheet_name=‘Sheet_name_3’)
坑就坑在:
1.如果不写engine=‘openpyxl’ ,恰好版本又过低,会提示没有mode关键字,默认是’xlsxwriter’(不可追加),同时官方文档也没加(深坑)。
2.加上engine=‘openpyxl’ 后,不报错了,但是无论你将mode='a’改为任何形式(mod=‘a’,或者mo=‘a’),都不会报错,让你丈二摸不着头脑,原因是版本过低。
3.用pip升级pandas版本,发现openpyxl与numpy需要也升,升级之后即可使用上述语句。注意,此处有坑,因为项目用版本老,本地升级后有个莫名错误,numexpr不见了,重新用pip安装发现numexpr在最新版本,但是conda查询还在原版本,同时用pd.show_versions()查询显示None(阔怕的是pymysql模块也显示None)。
感觉莫名其妙同时很无奈,还好是本地,当最后发现不能升级服务器版本,我选择退而其次去研究openpyxl。