1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > Python向已有Excel工作表sheet写入数据框dataframe

Python向已有Excel工作表sheet写入数据框dataframe

时间:2021-03-16 09:04:21

相关推荐

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 pdfrom 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=Falsewriter.save()writer.close()

sheet1覆盖数据,更新成功,首行单元格格式无大变化,因此该操作不是重新另建一个sheet的结果

sheet2计算得出结果

writer.sheets={ws.title:ws for ws in writer.book.worksheets}

这句话是从别的博主中抄的,见下面参考链接,具体含义不明,如果删除掉这句话,继续执行后面的语句,原有的工作簿会多出一个sheet11,而不是在原有的sheet1中写入数据

见下面的参考链接

/eternalpal/p/12920678.html

/content/19/1228/21/644962_882790477.shtml

/articles/93352

/miss_audrey/article/details/102741103

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。