欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-12-20 19:55:53
使用Python向已有Excel工作表sheet写入数据框dataframe数据项目场景:通常使用SQL、Python处理完数据后会将需要导出的数据输出成CSV格式,然后必要时使用Excel模板进行格式上的调整(供业务人员查看),或者输入到Excel模板进一步计算,该步骤一般都是人工操作,对Python最后的输出操作优化可以提高一点工作效率。具体示例原有工作簿有两个工作表sheet1,sheet2,sheet1带有格式,需要从Python导出数据往里面写入,sheet2是对sheet1其中两列进行计...

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

项目场景:

通常使用SQL、Python处理完数据后会将需要导出的数据输出成CSV格式,然后必要时使用Excel模板进行格式上的调整(供业务人员查看),或者输入到Excel模板进一步计算,该步骤一般都是人工操作,对Python最后的输出操作优化可以提高一点工作效率。

具体示例

原有工作簿有两个工作表sheet1,sheet2,sheet1带有格式,需要从Python导出数据往里面写入,sheet2是对sheet1其中两列进行计算的工作表,已写入公式
Python向已有Excel工作表sheet写入数据框dataframe
sheet2设定带有公式计算
Python向已有Excel工作表sheet写入数据框dataframe
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成功追加更新,表头未有变化
Python向已有Excel工作表sheet写入数据框dataframe
sheet2计算得出结果
Python向已有Excel工作表sheet写入数据框dataframe

  • 方法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的结果
Python向已有Excel工作表sheet写入数据框dataframe
sheet2计算得出结果
Python向已有Excel工作表sheet写入数据框dataframe

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