![](/img/trans.png)
[英]Write to an existing excel file using Openpyxl starting in existing sheet starting at a specific column and row
[英]Adding in multiple dataframes into an existing Excel sheet starting on specific cell references
下午好,
我正在开发一个 python 程序,它将采用 3 个单独的数据框并将它们放入现有的 excel 文件中; 覆盖有问题的单元格范围,但保持其余行和列不变。
下面是 Excel 文件结构的示例
关键词 | 比赛类型 | col1a | col1b | col1c | col2a | col2b | col2c | col3a | col3b | col3c | 柜台 |
---|---|---|---|---|---|---|---|---|---|---|---|
不被删除 | 不被删除 | 替换数据 | 替换数据 | 替换数据 | 替换数据 | 替换数据 | 替换数据 | 替换数据 | 替换数据 | 替换数据 | 不被删除 |
不被删除 | 不被删除 | 替换数据 | 替换数据 | 替换数据 | 替换数据 | 替换数据 | 替换数据 | 替换数据 | 替换数据 | 替换数据 | 不被删除 |
在这我需要从第 2 行第 3 列开始的第一个 df,第 6 列中的第二个 df 和第 9 列中的第三个 df。
目前使用下面的代码,我可以将数据放入正确的位置,但所有其他数据都会在此过程中丢失。 我认为如果作为数据框和较新的数据框打开,则可以合并 Excel,但到目前为止还没有这样的运气。
我的代码在下面,我仍在摆弄它,在编写旧数据时已打开但未对其采取任何操作。
DF_LastMonthDL = pd.read_csv (LastMonthDL)
DF_Last3MonthsDL = pd.read_csv (Last3MonthsDL)
DF_LifeTimeDL = pd.read_csv (LifeTimeDL)
########################################################## Manipulating the dataframes
#Sorting the arrays to keep ordering consistent
DF_LifeTimeDL.sort_index(0)
DF_LastMonthDL.sort_index(0)
DF_Last3MonthsDL.sort_index(0)
#Removing first cols as uneeded ¦ Keywords, Matchtype
DF_LifeTimeShrt = DF_LifeTimeDL[["Impressions", "Clicks", "CTR", "Spend(GBP)", "CPC(GBP)", "Orders", "Sales(GBP)","ACOS","ROAS"]]
DF_Last3MonthsShrt = DF_Last3MonthsDL[["Impressions", "Clicks", "CTR", "Spend(GBP)", "CPC(GBP)", "Orders", "Sales(GBP)","ACOS","ROAS"]]
DF_LastMonthShrt = DF_LastMonthDL[["Impressions", "Clicks", "CTR", "Spend(GBP)", "CPC(GBP)", "Orders", "Sales(GBP)","ACOS","ROAS"]]
oldData = pd.read_excel(r"oldData.xlsx")
########################################################## Exporting into excel in set positions
# Create a Pandas Excel writer using XlsxWriter as the engine.
writer = pd.ExcelWriter('Temp.xlsx', engine='openpyxl')
# Position the dataframes in the worksheet
DF_LifeTimeShrt.to_excel(writer, sheet_name='LifeTime', startrow=2, startcol=2, header=True, index=False)
DF_Last3MonthsShrt.to_excel(writer, sheet_name='Sheet1', startrow=2, startcol=11, header=False, index=False)
DF_LastMonthShrt.to_excel(writer, sheet_name='Sheet1', startrow=2, startcol=20, header=False, index=False)
# Close the Pandas Excel writer and output the Excel file.
writer.save()
对此的任何指导将不胜感激。
您可以使用 openpyxl.load_workbook() 并更新单元格来执行此操作,类似于您在上面所做的。 假设您的初始部分全部正常工作,只需要更改最后一部分,如下所示......
import openpyxl
from openpyxl.utils.dataframe import dataframe_to_rows
writer = openpyxl.load_workbook('Temp.xlsx')
ws=writer['LifeTime']
rows = dataframe_to_rows(DF_LifeTimeShrt, index=False, header=True)
for r_idx, row in enumerate(rows, 1):
for c_idx, value in enumerate(row, 1):
ws.cell(row=r_idx+2, column=c_idx+2, value=value)
ws=writer['Sheet1']
rows = dataframe_to_rows(DF_Last3MonthsShrt, index=False, header=True)
for r_idx, row in enumerate(rows, 1):
for c_idx, value in enumerate(row, 1):
ws.cell(row=r_idx+2, column=c_idx+2, value=value)
ws=writer['Sheet2']
rows = dataframe_to_rows(DF_LastMonthShrt, index=False, header=True)
for r_idx, row in enumerate(rows, 1):
for c_idx, value in enumerate(row, 1):
ws.cell(row=r_idx+2, column=c_idx+2, value=value)
# Close the Excel file... need to provide name the file it needs to be written to.
writer.save('Temp.xlsx')
编辑 - load_workbook 的优点是它更新单元格并且仅覆盖特定单元格而不对其他单元格进行任何更改,甚至覆盖可能存在的颜色等。 dataframe_to_rows为您提供了一种将整个 DF 行转换为可读的 openpyxl 的方法。 从那里,我基本上是读取每一行和每一列(一个单元格)并用来自 df 的值更新值( ws.cell(row,col).value
)。 这样做的缺点是您需要通过 for 循环(与 df.to_excel 不同),但优点是您可以更新单个单元格值而不会干扰其他任何内容......希望这个解释有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.