Python向已有Excel工作表sheet写入数据框dataframe
使用Python向已有Excel工作表sheet写入数据框dataframe数据
项目场景:
通常使用SQL、Python处理完数据后会将需要导出的数据输出成CSV格式,然后必要时使用Excel模板进行格式上的调整(供业务人员查看),或者输入到Excel模板进一步计算,该步骤一般都是人工操作,对Python最后的输出操作优化可以提高一点工作效率。
具体示例
原有工作簿有两个工作表sheet1,sheet2,sheet1带有格式,需要从Python导出数据往里面写入,sheet2是对sheet1其中两列进行计算的工作表,已写入公式
sheet2设定带有公式计算
Python中有该数据框数据需要输出至sheet1
data=pd.DataFrame({'年份':[1995,1996,1997,1998,1999],'地区':['广州市','广州市','广州市','广州市','广州市'],
'性别':['男','男','男','男','男'],'婚姻':['未婚','未婚','未婚','未婚','未婚'],'AUM':[200000,200001,200002,200003,200004],
'人数':[40,41,42,43,44]})
工具
openpyxl模块:可以使往Excel文件追加数据时而不覆盖文件写入的模块;
pandas模块:to_excel()将dataframe直接整个输出到Excel的函数
import pandas as pd
from openpyxl import load_workbook,Workbook
测试时注意每一次都需要完整读入与关闭(load与save,close),否则改动后会发现结果无变化,原因是读入的是前一次测试的结果.
解决方法
-
方法1
由于某些业务场景可能需要逐个单元格读入到已有表格中的某些位置,使用两层循环的方式逐格读入数据框的值。
需要注意的是表格位置与Python中数据框行列的起始位置的差异、range(m,n)实际输出的是从m至n-1的值。
##先读入文件路径
filepath=r'table.xlsx'
writer = pd.ExcelWriter(filepath, engine='openpyxl')
writer.book=load_workbook(filepath)
ws=writer.book["Sheet1"]#指定工作表
#原表格sheet1表头保留,因此读入表格从第2行开始,列起始列依然为1
#dataframe对象行列从0开始,因此需要对行列标做减法对应上
for i in range(2,7):
for j in range(1,7):
ws.cell(row=i,column=j).value=data.iloc[i-2,j-1]
writer.save()#保存后才能成功改动
writer.close()
结果:
sheet1成功追加更新,表头未有变化
sheet2计算得出结果
- 方法2:
整个dataframe写入到sheet1中,覆盖sheet1中的数据。
但原有表格格式样式发生部分变化(行标题字体从微软雅黑变成了宋体,但单元格颜色和加粗无变化)
##先读入文件路径
filepath=r'table.xlsx'
writer = pd.ExcelWriter(filepath, engine='openpyxl')
writer.book=load_workbook(filepath)
writer.sheets={ws.title:ws for ws in writer.book.worksheets}
data.to_excel(writer,"Sheet1",index=False)#行序号不需要,设定为index=False
writer.save()
writer.close()
sheet1覆盖数据,更新成功,首行单元格格式无大变化,因此该操作不是重新另建一个sheet的结果
sheet2计算得出结果
writer.sheets={ws.title:ws for ws in writer.book.worksheets}
这句话是从别的博主中抄的,见下面参考链接,具体含义不明,如果删除掉这句话,继续执行后面的语句,原有的工作簿会多出一个sheet11,而不是在原有的sheet1中写入数据
见下面的参考链接
https://www.cnblogs.com/eternalpal/p/12920678.html
http://www.360doc.com/content/19/1228/21/644962_882790477.shtml
http://www.cocoachina.com/articles/93352
https://blog.csdn.net/miss_audrey/article/details/102741103
本文地址:https://blog.csdn.net/sinat_16200671/article/details/113977752
上一篇: 原来营销工作的核心就在“面子工程”
下一篇: Java 线程:创建、属性以及状态控制