web-dev-qa-db-fra.com

ajouter des données à Excel avec des pandas

Je souhaite ajouter des données à Excel

Ce code fonctionne presque comme un désir. Bien que cela ne s'ajoute pas à chaque fois. Je le lance et il met le cadre de données dans Excel. Mais chaque fois que je l'exécute, cela ne s'ajoute pas. J'entends aussi que openpyxl est un processeur intensif mais n'entends pas parler de beaucoup solutions de contournement .

import pandas
from openpyxl import load_workbook

book = load_workbook('C:\\OCC.xlsx')
writer = pandas.ExcelWriter('C:\\OCC.xlsx', engine='openpyxl')
writer.book = book
writer.sheets = dict((ws.title, ws) for ws in book.worksheets)

df1.to_Excel(writer, index = False)

writer.save()

Je veux que les données soient ajoutées chaque fois que je les exécute, cela ne se produit pas.

La sortie des données ressemble aux données d'origine:

A   B   C
H   H   H

Je veux après courir une deuxième fois

A   B    C
H   H    H
H   H    H

Excuses si cela est évident, je découvre Python pour la première fois et les exemples que je pratique ne marchaient pas comme souhaité.

La question est: comment puis-je ajouter des données à chaque fois que je cours? J'essaie de passer à xlsxwriter mais j'obtiens AttributeError: 'Workbook' object has no attribute 'add_format'

5
user9079010

tout d'abord, cet article est le premier élément de la solution, dans lequel vous devez spécifier startrow=: Ajouter une feuille Excel existante avec un nouveau cadre de données à l'aide de python pandas

vous pourriez aussi considérer header=False. Il devrait donc ressembler à ceci:

df1.to_Excel(writer, startrow = 2,index = False, Header = False)

si vous voulez qu'il arrive automatiquement à la fin de la feuille et ajoute votre df, utilisez:

startrow = writer.sheets['Sheet1'].max_row

et si vous voulez qu'il passe en revue toutes les feuilles du cahier:

for sheetname in writer.sheets:
    df1.to_Excel(writer,sheet_name=sheetname, startrow=writer.sheets[sheetname].max_row, index = False,header= False)

btw: pour le writer.sheets vous pouvez utiliser la compréhension du dictionnaire (je pense que c'est plus propre, mais c'est à vous de décider, cela produit le même résultat):

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

donc le code complet sera:

import pandas
from openpyxl import load_workbook

book = load_workbook('test.xlsx')
writer = pandas.ExcelWriter('test.xlsx', engine='openpyxl')
writer.book = book
writer.sheets = {ws.title: ws for ws in book.worksheets}

for sheetname in writer.sheets:
    df1.to_Excel(writer,sheet_name=sheetname, startrow=writer.sheets[sheetname].max_row, index = False,header= False)

writer.save()
10
Idan Richman

Voici une fonction d'assistance:

def append_df_to_Excel(filename, df, sheet_name='Sheet1', startrow=None,
                       truncate_sheet=False, 
                       **to_Excel_kwargs):
    """
    Append a DataFrame [df] to existing Excel file [filename]
    into [sheet_name] Sheet.
    If [filename] doesn't exist, then this function will create it.

    Parameters:
      filename : File path or existing ExcelWriter
                 (Example: '/path/to/file.xlsx')
      df : dataframe to save to workbook
      sheet_name : Name of sheet which will contain DataFrame.
                   (default: 'Sheet1')
      startrow : upper left cell row to dump data frame.
                 Per default (startrow=None) calculate the last row
                 in the existing DF and write to the next row...
      truncate_sheet : truncate (remove and recreate) [sheet_name]
                       before writing DataFrame to Excel file
      to_Excel_kwargs : arguments which will be passed to `DataFrame.to_Excel()`
                        [can be dictionary]

    Returns: None
    """
    from openpyxl import load_workbook

    # ignore [engine] parameter if it was passed
    if 'engine' in to_Excel_kwargs:
        to_Excel_kwargs.pop('engine')

    writer = pd.ExcelWriter(filename, engine='openpyxl')

    try:
        # try to open an existing workbook
        writer.book = load_workbook(filename)

        # get the last row in the existing Excel sheet
        # if it was not specified explicitly
        if startrow is None and sheet_name in writer.book.sheetnames:
            startrow = writer.book[sheet_name].max_row

        # truncate sheet
        if truncate_sheet and sheet_name in writer.book.sheetnames:
            # index of [sheet_name] sheet
            idx = writer.book.sheetnames.index(sheet_name)
            # remove [sheet_name]
            writer.book.remove(writer.book.worksheets[idx])
            # create an empty sheet [sheet_name] using old index
            writer.book.create_sheet(sheet_name, idx)

        # copy existing sheets
        writer.sheets = {ws.title:ws for ws in writer.book.worksheets}
    except FileNotFoundError:
        # file does not exist yet, we will create it
        pass

    if startrow is None:
        startrow = 0

    # write out the new sheet
    df.to_Excel(writer, sheet_name, startrow=startrow, **to_Excel_kwargs)

    # save the workbook
    writer.save()

Exemples d'utilisation:

filename = r'C:\OCC.xlsx'

append_df_to_Excel(filename, df)

append_df_to_Excel(filename, df, header=None, index=False)

append_df_to_Excel(filename, df, sheet_name='Sheet2', index=False)

append_df_to_Excel(filename, df, sheet_name='Sheet2', index=False, startrow=25)
0
MaxU

J'ai essayé de lire un fichier Excel, de le placer dans un cadre de données, puis de concatter le cadre de données à partir d'Excel avec le cadre de données souhaité. Cela a fonctionné pour moi.

def append_df_to_Excel(df, Excel_path):
    df_Excel = pd.read_Excel(excel_path)
    result = pd.concat([df_Excel, df], ignore_index=True)
    result.to_Excel(excel_path, index=False)

df = pd.DataFrame({"a":[11,22,33], "b":[55,66,77]})
append_df_to_Excel(df, r"<path_to_dir>\<out_name>.xlsx")
0
Victor Stanescu