Freitag, Juni 5, 2020

Immer AttributeError ‚Arbeitsmappe‘ – Objekt hat kein Attribut ‚add_worksheet‘ – beim schreiben der Daten-frame zu excel-Blatt

Ich habe folgenden code und versuche zu schreiben ein Daten-frame in eine „Bestehende“ Arbeitsblatt einer Excel-Datei (bezeichnet als hier test.xlsx). Sheet3 ist der gezielte Blatt, wo ich will, um die Daten und ich will nicht ersetzen die gesamte Platte durch eine neue.

df = pd.DataFrame({'Data': [10, 20, 30, 20, 15, 30, 45]})
book = load_workbook('test.xlsx')
writer = pd.ExcelWriter('test.xlsx')
writer.book = book
writer.sheets = dict((ws.title, ws) for ws in book.worksheets) # *I am not sure what is happening in this line*
df.to_excel(writer,"Sheet3",startcol=0, startrow=20)

Wenn ich bin mit den code-Zeilen, ich bin immer diese Fehlermeldung für die Letzte Zeile:

AttributeError: ‚Arbeitsmappe‘ – Objekt hat kein Attribut ‚add_worksheet‘. Nun, warum sehe ich diese Fehlermeldung wenn ich versuche nicht zu Arbeitsblatt hinzufügen ?

Hinweis: ich bin mir bewusst das ähnliche Problem Python, Wie die Verwendung ExcelWriter zum schreiben in ein vorhandenes Arbeitsblatt, sondern seine nicht funktioniert für mich, und ich kann nicht kommentieren, dass die post entweder.

  • es ist wahrscheinlich, um das Stück code, dass Sie nicht wissen, was passiert. Warum brauchen Sie das?
  • wir müssen Buch-und Blatt-Attribute hinzufügen, Blättern oder speichern in excel. ‚Schriftsteller.Buch = Buch‘ legt das Ergebnis der load_book als der writer ‚ s book-Attribut, so können Sie es verändern. ‚Schriftsteller.Blätter = dict((ws.Titel, ws) für ws im Buch.Arbeitsblätter)‘ – diese Zeile generieren, die Blatt-Attribut. Ich denke, es ist nötig, damit wir Bearbeiten können, die gezielte Blatt.
  • haben Sie versucht, looping ein Blatt zu einem Zeitpunkt? Ich habe getan, dass in der Vergangenheit mit Erfolg
  • Habe ich nicht. Wie schlagen Sie vor, das zu tun ? Ich bin ganz neu bei python, wenn man ausarbeiten könnte etwas code wäre hilfreich
  • Pandas standardmäßig xlsxwriter. Sie müssen ausdrücklich festlegen, den Motor zu openpyxl.

3 Kommentare

  1. 1

    Hier ist eine helper-Funktion:

    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()

    Verwendung:

    append_df_to_excel('test.xlsx', df, sheet_name="Sheet3", startcol=0, startrow=20)

    Einige details:

    **to_excel_kwargs – verwendet, um pass zusätzliche namens Parameter df.to_excel() wie ich in der obigen Beispiel – parameter startcol ist unbekannt append_df_to_excel() so wird er behandelt, wie ein Teil der **to_excel_kwargs parameter (dictionary).

    writer.sheets = {ws.title:ws for ws in writer.book.worksheets} verwendet werden, um zu kopieren, die vorhandenen Blätter zu writer openpyxl Objekt. Ich kann nicht erklären, warum es nicht geschieht automatisch, wenn Sie Lesen writer = pd.ExcelWriter(filename, engine='openpyxl') – Sie sollten sich Fragen, Autoren openpyxl Modul über, die…

    • Hey, vielen Dank, das funktioniert. Zwei große Unterschiede sehe ich hier in deinem code: 1. df.to_excel(Schriftsteller, sheet_name, startrow=startrow, **to_excel_kwargs) wirst du plz erklären wenig über dieses parameter **to_excel_kwargs – ich war nicht mit dieser ? 2. Schriftsteller = pd.ExcelWriter(filename, Motor=’openpyxl“) Verwendung von openpyxl wie ein Motor . Auch wenn man erklären kann, auch diese Linie – das wird eine große Hilfe sein – writer.Blätter = dict( (ws.Titel, ws) für ws in writer.Buch.Arbeitsblätter)
  2. 1

    Können Sie openpyxl als der Motor beim anlegen einer Instanz von pd.ExcelWriter.

    import pandas as pd
    import openpyxl
    
    df1 = pd.DataFrame({'A':[1, 2, -3],'B':[1,2,6]})
    book = openpyxl.load_workbook('examples/ex1.xlsx') #Already existing workbook
    writer = pd.ExcelWriter('examples/ex1.xlsx', engine='openpyxl') #Using openpyxl
    
    #Migrating the already existing worksheets to writer
    writer.book = book
    writer.sheets = {x.title: x for x in book.worksheets}
    
    df1.to_excel(writer, sheet_name='sheet4')
    writer.save()

    Hoffe, das funktioniert für Sie.

    • Hallo, vielen Dank für deine Hilfe. Ich habe versucht, diesen code. Anstelle der Zugabe zu ‚Tabelle3‘ schafft es ‚Sheet31‘ und versetzt den dataframe es – ‚df1.to_excel(Schriftsteller, sheet_name=’Tabelle3′, startcol=0, startrow=20, index = 0)‘ . Aber ich wollen Sie es zu schreiben in Tabelle3, nicht eine neue zu erstellen.

Kostenlose Online-Tests