簡體   English   中英

使用openpyxl將pandas dataframe復制到excel

[英]Copy pandas dataframe to excel using openpyxl

我在模板文件中保存了一些復雜的格式,我需要將 pandas dataframe 中的數據保存到其中。問題是當我使用 pd.to_excel 保存到此工作表時,pandas 會覆蓋格式。 有沒有辦法以某種方式將 df 中的值“粘貼”到工作表中? 我正在使用 pandas 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()

openpyxl 2.4 附帶了一個實用程序,用於將 Pandas 數據幀轉換為 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)

您可以調整枚舉的開始以將單元格放置在您需要的位置。

有關更多信息,請參閱openpyxl 文檔

我稍微修改了@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')

這是您使用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')

你應該先得到你的數據形狀來確定循環的范圍

wb_formats=load_workbook("template.xlsx")            
ws_index=wb_formats.get_sheet_by_name("index")
daily_input= pd.read_excel(self.readfile,"input")
list_item=data_analysis1.groupby(["item_id"])["product_name"].unique()
list_item_size=pd.DataFrame(list_item,columns=["product_name"]).shape[0]

#create  the index sheet:
            r = 2  # start at 4th row
            c = 1 # column 'a'
            for row in range(0,list_item_size):  
                rows = list_item.iloc[row]
                for item in rows:
                    ws_index.cell(row=r, column=c).value = item
                    c += 1 # Column 'd'
                c = 1
                r += 1
wb_formats.save(save_name)

我嘗試將pandas.DataFrame.to_excel中的更多選項添加到查理的答案中:

from openpyxl.utils.dataframe import dataframe_to_rows

def df_to_excel(df, ws, header=True, index=True, startrow=0, startcol=0):
    """Write DataFrame df to openpyxl worksheet ws"""

    rows = dataframe_to_rows(df, header=header, index=index)

    for r_idx, row in enumerate(rows, startrow + 1):
        for c_idx, value in enumerate(row, startcol + 1):
             ws.cell(row=r_idx, column=c_idx).value = value

使用示例,請注意openpyxl將索引名稱放在實際索引下方的第二行,與DataFrame.to_excel相比,這是不同的行為:

import pandas as pd
import openpyxl
import os

wb = openpyxl.Workbook()
df = pd.DataFrame([[1, 2], [3, 4]], columns=["A", "B"]).rename_axis("Index")
df_to_excel(df, wb.active)
wb.save("out.xlsx")
os.startfile("out.xlsx")  # only works on Windows

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM