使用openpyxl将pandas dataframe复制到excel

bli*_*009 10 python clipboard dataframe pandas openpyxl

我有一些复杂的格式化保存在模板文件中,我需要从pandas数据帧中保存数据.问题是当我使用pd.to_excel保存到此工作表时,pandas会覆盖格式.有没有办法以某种方式将df值'从df粘贴到工作表中?我正在使用熊猫0.17

import openpyxl
import pandas as pd
wb= openpyxl.load_workbook('H:/template.xlsx')
sheet = wb.get_sheet_by_name('spam')
sheet.title = 'df data'
wb.save('H:/df_out.xlsx')

xlr = pd.ExcelWriter('df_out.xlsx')
df.to_excel(xlr, 'df data')
xlr.save()
Run Code Online (Sandbox Code Playgroud)

Cha*_*ark 17

openpyxl 2.4附带了一个实用程序,用于将Pandas Dataframes转换为openpyxl可以直接使用的东西.代码看起来有点像这样:

from openpyxl.utils.dataframe import dataframe_to_rows
rows = dataframe_to_rows(df)

for r_idx, row in enumerate(rows, 1):
    for c_idx, value in enumerate(row, 1):
         ws.cell(row=r_idx, column=c_idx, value=value)
Run Code Online (Sandbox Code Playgroud)

您可以调整枚举的开始,将单元格放置在您需要的位置.

有关更多信息,请参阅openpyxl文档.

  • @Abbas我认为根本不需要.一旦2.4发布,我将与Pandas合作,在`df.to_excel()`方法中使用它. (2认同)
  • @CharlieClark *我认为根本没有必要。一旦 2.4 发布,我将与 Pandas 合作,在 df.to_excel() 方法中使用它。* => 在 `df_to_excel` 中支持 `openpyxl.Workbook` 有进展吗? (2认同)

Bas*_*asj 7

我稍微修改了@CharlieClark 的好答案以避免索引(原始 Excel 文件中没有)。这是一个准备运行的代码:

import pandas as pd
from openpyxl.utils.dataframe import dataframe_to_rows
from openpyxl import load_workbook
wb = load_workbook('test.xlsx')  # load as openpyxl workbook; useful to keep the original layout
                                 # which is discarded in the following dataframe
df = pd.read_excel('test.xlsx')  # load as dataframe (modifications will be easier with pandas API!)
ws = wb.active
df.iloc[1, 1] = 'hello world'    # modify a few things
rows = dataframe_to_rows(df, index=False)
for r_idx, row in enumerate(rows, 1):
    for c_idx, value in enumerate(row, 1):
        ws.cell(row=r_idx, column=c_idx, value=value)
wb.save('test2.xlsx')
Run Code Online (Sandbox Code Playgroud)


Abb*_*bas 1

这是您使用的解决方案clipboard

import openpyxl
import pandas as pd
import clipboard as clp

#Copy dataframe to clipboard
df.to_clipboard()
#paste the clipboard to a valirable
cells = clp.paste()
#split text in varialble as rows and columns
cells = [x.split() for x in cells.split('\n')]

#Open the work book
wb= openpyxl.load_workbook('H:/template.xlsx')
#Get the Sheet
sheet = wb.get_sheet_by_name('spam')
sheet.title = 'df data'
#Paste clipboard values to the sheet
for i, r in zip(range(1,len(cells)), cells):
    for j, c in zip(range(1,len(r)), r):
        sheet.cell(row = i, column = j).value = c
#Save the workbook
wb.save('H:/df_out.xlsx')
Run Code Online (Sandbox Code Playgroud)